Привет, Хабр!

Сегодняшней темой для разговора станет использование “экзотических” языков программирования для создания вредоносных программ.

В конце июля компания BlackBerry опубликовала любопытное исследование, в котором указывалось, что вирусописатели всё чаще прибегают к таким языкам как Go (иногда называемый Golang), Rust, D и Nim для написания вредоносного кода.

Разработчики вредоносов могут обращаться к ним по целому ряду причин самого практического толка. Все перечисленные языки значительно новее, чем, например, C или C++ и даже С#, и вирусописатели могут искать - и находить - в них более простой синтаксис и/или обеспечение более высокого быстродействия программ и более эффективного управления памятью.

Кроме того, некоторые языки (не обязательно вышеперечисленные) лучше работают с какими-то определёнными средами, чем другие - например, вредоносы для IoT-устройств логичнее писать как раз на низкоуровневых языках типа C или даже Assembly/Assembler.

Работать с некоторыми новыми языками на практическом уровне также бывает проще, чем со старыми в силу их устройства и функциональности. Кроме того, новые языки зачастую поддерживают кросс-компиляцию, то есть, один и тот же код можно легко перекомпилировать под любую платформу.

Однако, с технической точки зрение, важнее всего тот факт, что написание вредоносов на таких языках обеспечивает им дополнительный слой обфускации и маскировки.

Произвести реверс-инжиниринг бинарных файлов типовыми средствами оказывается куда сложнее, если использовались "экзотические" языки, по крайней мере, на сегодняшний день. Также само использование таких экзотических языков обеспечивает определённый уровень обфускации кода само по себе.

Сверх этого, применение "экзотических" языков обеспечивает малвари некоторый уровень защиты от антивирусных средств, - как минимум, от детектирования по методу статистических сигнатур.

Это один из самых старых, но в то же время самых быстрых способов выявления вредоносных программ, во всяком случае, тех, которые уже так или иначе "попадали на радары". Самые совершенные защитные средства, конечно используют многие другие методы обнаружения - поведенческий анализ, эвристический анализ так далее; но для того, чтобы с помощью этих методик поймать малварь с поличным, требуется чуть больше времени, а за это время недруг может успеть наворотить дел. Так что от сигнатурного метода никто и не думает отказываться - просто его одного будет недостаточно.

Кроме того, вирусописатели временами переписывают на "экзотических" языках отдельные компоненты своих творений - например, дропперы и загрузчики, в то время как основное "ядро" остаётся без изменений. Именно дропперам и необходимо в первую очередь обходить сигнатурную защиту, чтобы "доставлять посылку".

D, Nim, Go и Rust - относительно новые языки: Go и D созданы в начале 2000-х, Nim - в середине 2000-х. Самым молодым оказывается Rust, появившийся лишь в 2010 году. Посмотрим, что из себя представляют известные вредоносы, написанные на них:

D

Язык D является C-подобным языком, но более продвинутым, по сравнению даже, например, с C++. Усовершенствования нацелены на ускорение разработки и минимизацию количества возможных ошибок. Он заимствует ряд концепций из языков программирования Python, Ruby, C#, Java и Eiffel. Язык доступен для операционных систем Windows, Linux, Mac OS и FreeBSD

D присутствует в некоторых проектах Facebook, eBay, Netflix; видеоигра Quantum Break 2016 года содержит “некоторое количество кода” на D, и на нём написано много других программных разработок самого разного плана, от ядер операционных систем до текстовых редакторов и систем машинного обучения.

Без , увы, тоже не обошлось. В самом начале 2021 года обнаружился шифровальщик с характерным названием Vovalex, написанный целиком на D. По мнению известного эксперта по информационной безопасности Виталия Кремеца, это чуть ли ни первый задокументированный вредонос, написанный на этом языке.

Требование выкупа, которое этот шифровальщик выводит своим жертвам, написано на русском и (плохом) английском, что внятно указывает на его вероятную “национальность”. Впрочем, на неё указывает и само название.

В декабре 2020 года FireEye, расследовавшие атаку со стороны некоей APT-группировки на своих клиентов, выявили шелл-бэкдор Dshell, также написанный на D.

Опенсорсная программа с таким названием встречается на GitHub, в описании говорится, что это инструмент для проведения цифрового криминалистического анализа сетей, причём в качестве разработчика указана Исследовательская лаборатория Сухопутных сил США DevCom. Учитывая, что разработка лежит в общем доступе, пользоваться ею может кто угодно и с какими угодно целями - в том числе для проведения кибератак.

Известен также шифровальщик Outcrypt, написанный на D. Атакует документы MS Office, OpenOffice, PDF, текстовые файлы, базы данных, фотографии, музыкальные и видеозаписи, файлы образов, архивы и пр. Встреченные экспертами сэмплы вообще не предполагали возможности расшифровки файлов, так что по большому счёту это деструктивный вредонос. Возможно, впрочем, исследователям попалась неполная версия. Первые - и последние - упоминания датированы серединой 2020 года. Возможно, вредонос ещё всплывёт под другим названием.

В отчёте BlackBerry также упоминается Remcos RAT - стандартный RAT-троянец, правда, написанный на D (так что не очень стандартный). Распространяется через спам и мнимые обновления для Windows 7, 8 и 10, хотя “легальная” версия за авторством итальянской компании Breaking Security продаётся вполне открыто.

Go

Язык Go (или Golang, как его ещё называют) разработан в Google на замену C/C++ Компилируемый многопоточный язык программирования, синтаксически он похож на C, но снабжён функциями защиты памяти, сбора мусора и параллелизмом в стиле CSP.

Вредоносы, написанные на Go, впервые стали появляться в 2012 году, хотя и редко. Однако за последние четыре года они стали “общим местом”, их количество выросло в 20 раз, и уже в 2019 году, по данным фирмы Intezer, их стали выявлять чуть ли ни ежедневно.

По итогам 2020 года эксперты Intezer отметили сразу два вредоноса, создание и использование которых связывают с российскими APT-группировками, - Zebrocy и WellMess, и ещё два - Godlike12 и Go Loader, - использованные китайскими APT-группами. Все они написаны на Go полностью или частично.

Не связанные с APT-группировками, коммерчески мотивированные киберзлоумышленники используют широкий арсенал стилеров (CryptoStealer.Go), RAT-троянцев (ElectroRAT, GOSH), шифровальщиков (например, RobbinHood, Nefilim и EKANS) и другой малвари, есть даже ботнеты.

Go особенно привлекателен своей кроссплатформенностью: один и тот же код можно компилировать и под Windows, и под Linux, и под что угодно ещё. Этим злоумышленники активно пользуются: в частности, в 2020 году отмечены многочисленные атаки со стороны вредоносов на Go на облачные среды под управлением Linux.

В 2020-м году эксперты признавали, что двоичные файлы на Go на тот момент всё ещё было очень сложно анализировать и подвергать реверс-инжинирингу, что, естественно, делает этот язык ещё более привлекательным для вирусописателей.

Кроме того, как отмечали специалисты Intezer, у Go очень хорошо написан сетевой стек, что обусловило его высокую популярность у разработчиков облачных сред. Такие популярные решения как Docker, Kubernetes, InfluxDB, Traefik, Terraform, CockroachDB, Prometheus и Consul написаны на Go. Язык создавался в Google специально для замены внутренних сетевых служб компании, написанных изначально на C++.

Многочисленные сетевые функции Go активно используются и вирусописателями - весь необходимый им инструментарий там уже есть. В Intezer полагают, что это одна из ключевых причин, по которым количество вредоносного кода на Go в последние годы бурно растёт.

Nim

Nim (изначально Nimrod) - язык программирования со статической типизацией, поддерживающий процедурный, объектно-ориентированный, функциональный и обобщённый стили программирования. Впервые появился в 2004 году, хотя первый компилятор был написан ещё только через четыре года.

Вредоносы на NIM сравнительно редки, однако его сравнительной "экзотичностью" пользуются и APT-группировки. В частности, уже упомянутая Zebrocy.

Другие примеры - дропперы NimzaLoader, загрузчики для Cobalt Strike и шифровальщик DeroHE.

На GitHub присутствует репозиторий под названием OffensiveNim ("Агрессивный Nim"), где представлен код, который может быть использован - и используется для проведения различных хакерских манипуляций. По большей части это загрузчики, дропперы и надстройки для маскировки кода.

OffensiveNim можно использовать для компиляции кода на Nim в C, C++, Objective-C и Javascript, при этом в действительности нет нужды писать что-то на этих языках (и рисковать ошибками, от которых Nim страхует по умолчанию).

Перекомпилировать код для разных сред (Windows, *nix/macOS) чрезвычайно просто, необходимые усилия - минимальны. Исполняемые файлы могут поддерживать все крупнейший платформы.

Для вирусописателей - просто мечта.

Rust

Язык Rust - мультипарадигмальный компилируемый язык программирования общего назначения. Характеризуется принципиально безопасной работой с памятью и отсутствием - за ненадобностью - системы сборки мусора: для этого применяется управление памятью через механизм «владения» с использованием аффинных типов. Имеются средства, позволяющие использовать приёмы объектно-ориентированного программирования. Разрабатывался изначально в Mozilla Foundation (так же, как Go - в Google); в 2016 году занимал первое место в числе "наиболее любимых языков" по опросам Stack Overflow Developer Survey. В 2021 году, впрочем, им пользовались лишь 7% опрошенных.

Весной 2021 года много шума наделала новость о том, что популярный в хакерских кругах загрузчик первой стадии Buer обзавёлся версией, написанной на Rust. RustyBuer, как его стали называть, увы, не первый вредонос подобного рода.

На том же языке написан Convuster, рекламный вредонос-adware, нацеленный специально на macOS, загрузчик и бэкдор TeleBots (к слову, существует бот-фреймоврк для Telegram под названием TeleBot - и он написан на Go) и дроппер NanoCore. BlackBerry также упоминает PyOxidizer, но это в целом вполне легальный инструмент для упаковки проектов на Python в исполняемые файлы.

Сегодня экзотика, завтра...

Большинство продвинутой малвари сегодня и вправду пишутся на C или C++ - на этом фоне сами вредоносы, написанные на других языках, кажутся экзотикой. Но на самом деле, действенный вредоносный код можно написать на любом языке, всё упирается лишь в то, чем владеет разработчик.

Экзотичность D, Go, Rust и Nim, похоже, это явление временное. Операторы APT-групп часто используют самые передовые - или хотя бы нестандартные - методы создания вредоносных программ, но проходит не слишком продолжительное время, и коммерчески-мотивированные злоумышленники начинают небезуспешно пользоваться теми же методиками - в надежде опередить защитные средства и сократить объём усилий. А большинство новых языков как раз на то и рассчитаны, чтобы сделать процесс написания кода как можно менее трудоёмким и времязатратным делом.

В итоге вредоносы, создание которых включает код на “редких” языках, отмечаются всё чаще, и если, например, в 2019 году обнаружение таких программ было событием, то сейчас эксперты BlackBerry прямо говорят о том, что их детектирование имеет квазирегулярный характер.

Вероятнее всего, приставка “квази” скоро отпадёт.

Комментарии (0)