Специалисты BlackBerry и Intezer рассказали о новом Linux-вредоносе Symbiote.
В биологии симбионт - это организм, живущий в симбиозе с другим организмом. Симбиоз может быть взаимовыгодным для обоих организмов, но иногда он может быть паразитическим, когда один получает выгоду, а другой страдает.
Отличие Symbiote от других вредоносных программ для Linux, заключается в том, что для нанесения ущерба зараженным машинам ему необходимо заразить другие запущенные процессы. Вместо того чтобы быть отдельным исполняемым файлом, который запускается для заражения машины, он представляет собой библиотеку общих объектов (SO), которая загружается во все запущенные процессы с помощью LD_PRELOAD (T1574.006) и паразитически заражает машину. После заражения всех запущенных процессов он предоставляет субъекту угрозы функциональность руткита, возможность сбора учетных данных и удаленного доступа.
Symbiote Malware
Самое раннее обнаружение Symbiote относится к ноябрю 2021 года, и, судя по всему, он был создан для финансового сектора в Латинской Америке. После заражения машины вредоносная программа скрывает себя и любое другое вредоносное ПО, используемое субъектом угрозы, что делает заражение очень сложным для обнаружения. Проведение живой экспертизы на зараженной машине может ничего не выявить, поскольку все файлы, процессы и сетевые артефакты скрыты вредоносной программой. В дополнение к возможностям руткита, вредоносная программа предоставляет агенту угрозы бэкдор для входа в систему под именем любого пользователя машины с жестко заданным паролем и выполнения команд с наивысшими привилегиями.
Одним из интересных технических аспектов Symbiote является его функция Berkeley Packet Filter (BPF) hooking. Symbiote - не первая вредоносная программа для Linux, использующая BPF. Например, продвинутые бэкдоры, приписываемые Equation Group, использовали BPF для скрытой коммуникации. Однако Symbiote использует BPF для скрытия вредоносного сетевого трафика на зараженной машине. Когда администратор запускает любой инструмент захвата пакетов на зараженной машине, в ядро внедряется байткод BPF, который определяет, какие пакеты должны быть захвачены. В этом процессе Symbiote добавляет свой байткод первым, чтобы отфильтровать сетевой трафик, который он не хочет, чтобы программы захвата пакетов видели.
Symbiote очень скрытен. Вредоносная программа разработана таким образом, что она загружается компоновщиком с помощью директивы LD_PRELOAD. Это позволяет ему загружаться до любых других разделяемых объектов. Поскольку он загружается первым, он может "перехватывать импорт" из других библиотечных файлов, загруженных для приложения. Symbiote использует это, чтобы скрыть свое присутствие на машине, подключая функции libc и libpcap.
Вредоносная программа Symbiote не только скрывает свое присутствие на машине, но и прячет другие файлы, связанные с вредоносным ПО, которое, вероятно, было развернуто вместе с ней. Внутри двоичного файла имеется список файлов, зашифрованный RC4. При вызове подключаемых функций вредоносная программа сначала динамически загружает libc и вызывает исходную функцию. Такая логика используется во всех подцепленных функциях. Пример показан на рисунке 2 ниже.
Если вызывающее приложение пытается получить доступ к файлу или папке в каталоге /proc, вредоносная программа очищает вывод от имен процессов, которые находятся в ее списке.
- certbotx64
- certbotx86
- javautils
- javaserverx64
- javaclientex64
- javanodex86
Если вызывающее приложение не пытается получить доступ к чему-то в каталоге /proc, вредоносная программа вместо этого вычищает результат из списка файлов. Файлы, извлеченные из всех исследованных нами образцов, показаны в списке ниже. Некоторые имена файлов совпадают с именами файлов, используемых Symbiote, в то время как другие совпадают с именами файлов, предположительно являющихся инструментами, используемыми субъектом угрозы на зараженной машине.
Список включает следующие файлы:
- apache2start
- apache2stop
- profiles.php
- 404erro.php
- javaserverx64
- javaclientex64
- javanodex86
- liblinux.so
- java.h
- open.h
- mpt86.h
- sqlsearch.php
- indexq.php
- mt64.so
- certbot.h
- cert.h
- certbotx64
- certbotx86
- javautils
- search.so
Одним из последствий загрузки Symbiote в процессы через LD_PRELOAD является то, что такие инструменты, как ldd, утилита, печатающая общие библиотеки, необходимые каждой программе, будут указывать вредоносное ПО как загруженный объект. Чтобы противостоять этому, вредоносная программа подключает execve и ищет вызовы этой функции с переменной окружения LD_TRACE_LOADED_OBJECTS, установленной на 1. Чтобы понять, почему, стоит заглянуть на страницу руководства для ldd:
В обычном случае ldd вызывает стандартный динамический компоновщик (см. ld.so(8)) с переменной окружения LD_TRACE_LOADED_OBJECTS, установленной в 1. Это заставляет динамический компоновщик проверить динамические зависимости программы, найти (согласно правилам, описанным в ld.so(8)) и загрузить объекты, удовлетворяющие этим зависимостям. Для каждой зависимости ldd отображает расположение соответствующего объекта и (шестнадцатеричный) адрес, по которому он загружен. (Общие зависимости linux-vdso и ld-linux являются особыми; см. vdso(7) и ld.so(8)).
Когда вредоносная программа обнаруживает это, она выполняет загрузчик, как это делает ldd, но вычищает свою собственную запись из результата.
Symbiote также обладает функцией скрытия сетевой активности на зараженной машине. Для этого он использует три различных метода. Первый метод включает в себя перехват fopen и fopen64. Если вызывающее приложение пытается открыть /proc/net/tcp, вредоносная программа создает временный файл и копирует в него первую строку. После этого она сканирует каждую строку на наличие определенных портов. Если вредоносная программа находит искомый порт в сканируемой строке, она переходит к следующей строке. В противном случае строка записывается во временный файл. После того как исходный файл полностью обработан, вредоносная программа закрывает файл и возвращает дескриптор временного файла обратно вызывающей стороне. По сути, это дает вызывающему процессу очищенный результат, который исключает все записи о сетевых соединениях, которые вредоносная программа хочет скрыть.
Второй метод, который Symbiote использует для сокрытия своей сетевой активности, заключается в перехвате любого внедренного байткода пакетной фильтрации. Ядро Linux использует расширенный пакетный фильтр Беркли (eBPF) для фильтрации пакетов на основе правил, предоставленных пользовательским процессом. Правило фильтрации предоставляется в виде байткода eBPF, который ядро выполняет на виртуальной машине (VM). Это минимизирует переключение контекста между ядром и пользовательской частью, обеспечивая прирост производительности, поскольку ядро выполняет фильтрацию напрямую.
Если приложение на зараженной машине пытается выполнить фильтрацию пакетов с помощью eBPF, Symbiote перехватывает процесс фильтрации. Во-первых, он подключает функцию libc setsockopt. Если эта функция вызывается с опцией SO_ATTACH_FILTER, которая используется для выполнения фильтрации пакетов на сокете, она добавляет свой собственный байткод перед кодом eBPF, предоставленным вызывающим приложением.
Фрагмент кода 1 показывает аннотированную версию байткода, внедренного одним из образцов Symbiote. Байткод "падает", если он соответствует следующим условиям:
- IPv6 (TCP или SCTP) и порт src (43253 или 43753 или 63424 или 26424)
- IPv6 (TCP или SCTP) и dst порт 43253
- IPv4 (TCP или SCTP) и порт src (43253 или 43753 или 63424 или 26424)
- IPv4 (TCP или SCTP) и порт dst (43253 или 43753 или 63424 или 26424)
Хотя этот байткод отбрасывает пакеты только на основе портов, также наблюдается фильтрация трафика на основе адресов IPv4. Во всех случаях фильтрация действует как на входящий, так и на исходящий трафик от машины, чтобы скрыть оба направления трафика. Если условия не выполняются, он просто переходит к началу байткода, предоставленного вызывающим приложением.
Байткод, извлеченный из одного из образцов, состоит из 32 инструкций. Этот код не может быть внедрен в ядро самостоятельно, поскольку он предполагает, что после него существует еще байткод. В этом байткоде есть несколько переходов, которые переходят к началу байткода, предоставленного вызывающим процессом. Без байткода вызывающего процесса внедренный байткод выскочил бы за пределы границ, что не допускается ядром. Подобный байткод должен быть либо написан вручную, либо исправлен сгенерированным компилятором байткодом. Любой из вариантов предполагает, что эта вредоносная программа была написана опытным разработчиком.
третий метод, который Symbiote использует для скрытия своего сетевого трафика, заключается в подключении функций libpcap. Этот метод используется вредоносной программой для фильтрации UDP-трафика к доменным именам, которые она занесла в список. Для выполнения этой задачи он подключает функции pcap_loop и pcap_stats. Для каждого полученного пакета Symbiote проверяет полезную нагрузку UDP на наличие подстрок доменов, которые он хочет отфильтровать. Если он находит совпадение, вредоносная программа игнорирует пакет и увеличивает счетчик. pcap_stats использует этот счетчик для "корректировки" количества обработанных пакетов путем вычитания значения счетчика из истинного количества обработанных пакетов. Если полезная нагрузка пакета не содержит ни одной из строк, имеющихся в его списке, вызывается исходная функция обратного вызова. Этот метод используется для фильтрации UDP-пакетов, а метод байткода - для фильтрации TCP-пакетов. Используя все три этих метода, вредоносная программа обеспечивает скрытность всего трафика.
Целью вредоносной программы, помимо скрытия вредоносной активности на машине, является сбор учетных данных и обеспечение удаленного доступа для угрожающего агента. Сбор учетных данных осуществляется путем подключения функции libc read. Если процесс ssh или scp вызывает эту функцию, она перехватывает учетные данные. Учетные данные сначала шифруются с помощью RC4 с использованием встроенного ключа, а затем записываются в файл. Например, одна из версий вредоносной программы записывает захваченные учетные данные в файл /usr/include/certbot.h.
Помимо локального хранения учетных данных, происходит их эксфильтрация. Данные кодируются в шестнадцатеричном коде и разбиваются на фрагменты, чтобы быть эксфильтрованными через запросы записи адреса DNS (A) к доменному имени, контролируемому субъектом угрозы. Запрос записи A имеет следующий формат:
%PACKET_NUMBER%.%MACHINE_ID%.%HEX_ENC_PAYLOAD%.%DOMAIN_NAME%.
Вредоносная программа проверяет, есть ли на машине сервер имен, настроенный в файле /etc/resolv.conf. Если нет, то используется DNS Google (8.8.8.8). Наряду с отправкой запроса на доменное имя, Symbiote также отправляет его в виде широковещательной рассылки UDP.
Удаленный доступ к зараженной машине достигается путем подключения нескольких функций подключаемого модуля аутентификации Linux (PAM). Когда служба пытается использовать PAM для аутентификации пользователя, вредоносная программа сверяет предоставленный пароль с жестко заданным паролем. Если пароль совпадает, функция возвращает успешный ответ. Поскольку крючки находятся в PAM, это позволяет агенту угрозы аутентифицироваться на машине с помощью любой службы, использующей PAM. Это включает удаленные службы, такие как Secure Shell (SSH).
Если введенный пароль не совпадает с жестко закодированным паролем, вредоносная программа сохраняет и эксфильтрирует его в рамках своей функции кейлоггинга. Кроме того, вредоносная программа отправляет запрос DNS TXT-записи на свой командно-контрольный (C2) домен. TXT-запись имеет формат %MACHINEID%.%C2_DOMAIN%. Получив ответ, вредоносная программа декодирует содержимое в base64, проверяет, подписано ли содержимое корректным закрытым ключом ed25519, расшифровывает содержимое с помощью RC4 и выполняет сценарий оболочки в порожденном процессе bash. Эта функциональность может работать как метод "разбитого стекла" для восстановления доступа к машине в случае, если обычный процесс не сработает.
После того как объект угрозы аутентифицируется на зараженной машине, Symbiote предоставляет функциональность для получения привилегий root. Когда общий объект загружается впервые, он проверяет наличие переменной окружения HTTP_SETTHIS. Если переменная установлена с содержимым, вредоносная программа изменяет идентификатор эффективного пользователя и группы на пользователя root, а затем очищает переменную перед выполнением содержимого с помощью системной команды.
Этот процесс требует, чтобы в SO был установлен флаг разрешения setuid. После завершения выполнения системной команды Symbiote также завершает процесс, чтобы предотвратить выполнение исходного процесса. Это позволяет породить оболочку root, выполнив HTTP_SETTHIS="/bin/bash -p" /bin/true от имени любого пользователя в оболочке.
Доменные имена, используемые вредоносной программой Symbiote, выдают себя за некоторые крупные бразильские банки. Это позволяет предположить, что эти банки или их клиенты являются потенциальными целями. С помощью доменных имен, используемых вредоносной программой, нам удалось обнаружить соответствующий образец, который был загружен на VirusTotal с именем certbotx64. Это имя файла совпадает с одним из тех, что были указаны в качестве файла для сокрытия в одном из образцов Symbiote, которые мы получили первоначально. Файл был идентифицирован как инструмент туннелирования DNS с открытым исходным кодом под названием dnscat2.
Symbiote, по-видимому, предназначен как для кражи учетных данных, так и для предоставления удаленного доступа к зараженным Linux-серверам. Symbiote - не первая вредоносная программа для Linux, разработанная с этой целью.
Indicators of Compromise
Domains
- assets.fans
- bancodobrasil.dev
- caixa.cx
- caixa.wf
- dpf.fm
- webfirewall.caixa.wf
- git.bancodobrasil.dev
SHA256
- 121157e0fcb728eb8a23b55457e89d45d76aa3b7d01d3d49105890a00662c924
- 45eacba032367db7f3b031e5d9df10b30d01664f24da6847322f6af1fd8e7f01
- a0cd554c35dee3fed3d1607dc18debd1296faaee29b5bd77ff83ab6956a6f9d6
- ec67bbdf55d3679fca72d3c814186ff4646dd779a862999c82c6faa8e6615180
- f55af21f69a183fb8550ac60f392b05df14aa01d7ffe9f28bc48a118dc110b4c