Статический анализ бессилен против кода на нетрадиционных языках.
Злоумышленники всё чаще выбирают экзотические языки программирования, чтобы их вредоносный код было сложнее анализировать. Согласно новому исследованию, необычные языки вроде Haskell, Delphi или Phix предоставляют новые способы скрыться от систем статического анализа — метода изучения кода без его запуска.
Исследователи проанализировали почти 400 000 исполняемых файлов для Windows, чтобы выяснить, почему вредоносные программы, написанные на редких языках, труднее обнаружить. Выяснилось, что нестандартные компиляторы и языки действительно снижают точность систем обнаружения. Особенно заметным стал эффект использования малораспространённых компиляторов — например, Embarcadero Delphi, Tiny C или Pelles C. По словам авторов, именно выбор компилятора оказывает большее влияние на способность обходить анализ, чем сам язык.
Традиционно вредоносные программы создаются на C или C++ и компилируются с помощью Microsoft Visual Studio. Такие бинарные файлы достаточно однородны, что упрощает работу антивирусов: байты шеллкода зачастую идут последовательно или с предсказуемыми интервалами, позволяя применять сигнатурные методы. Но в случае с Rust, Lisp, Haskell и рядом других языков структура памяти оказывается гораздо менее предсказуемой. Там байты вредоносного кода могут быть разнесены по всему бинарному файлу, что существенно осложняет автоматическое обнаружение.
Использование необычных языков также ведёт к большему количеству непрямых вызовов, множеству параллельных потоков и сложной логике исполнения. Всё это увеличивает усилия, необходимые для реверс-инжиниринга, затрудняя задачу аналитикам и увеличивая шансы злоумышленника на успешную атаку.
Примеры из практики подтверждают растущую популярность экзотических языков у известных группировок. APT29 использовала Python в бэкдоре Masepie и сочетание Delphi, Go, C# и Python в Zebrocy . Вымогатель Akira перешёл с C++ на Rust, BlackByte заменил C# на Go, а Hive был переписан с нуля также на Rust. Такие переходы затрудняют анализ кода и делают его менее узнаваемым для автоматических средств.
Подобный подход можно отнести к своеобразному «обфусцированию через незнание»: чем меньше специалистов и инструментов понимают формат кода, тем выше вероятность, что вредонос останется незамеченным. Особенно это касается языков с необычной моделью исполнения, таких как Haskell или Lisp, либо окружений с громоздкой стандартной библиотекой, как Dart и Go.
Однако и среди менее известных языков есть те, что вызывают особую настороженность у исследователей. Например, Visual Basic 6 долгое время вызывал раздражение у специалистов из-за сложности реверса. А зловред Grip использовал встроенный интерпретатор Brainfuck, чтобы усложнить анализ своих ключевых функций.
В заключение исследователи подчёркивают, что безопасность не должна ограничиваться наблюдением за популярными языками. Малораспространённые технологии дают злоумышленникам дополнительное пространство для манёвра, поэтому необходимо расширять арсенал анализа и на такие нестандартные случаи. Только так можно оставаться на шаг впереди тех, кто использует творчество и технические редкости в корыстных целях.