Новый руткит научился обманывать файрволы и системы мониторинга одновременно.
Исследователи Synacktiv описали новый руткит LinkPro для GNU/Linux, обнаруженный при расследовании взлома инфраструктуры на AWS. Атака началась с эксплуатации уязвимого Jenkins, после чего злоумышленники развернули вредоносный Docker-образ на кластерах Kubernetes. В результате на системы попали бэкдор vShell и руткит LinkPro, который маскируется через eBPF и активируется специальным TCP-пакетом.
Точкой входа послужил уязвимый сервер Jenkins с известной проблемой CVE-2024-23897. Получив доступ к узлам, атакующие запустили Docker-образ «kvlnt/vv» на базе Kali Linux с тремя компонентами в каталоге «app»: скрипт start.sh для запуска SSH и настройки окружения, программа link (это открытое ПО vnt, работающее как VPN-прокси и связывающееся с vnt.wherewego[.]top:29872) и загрузчик app — инструмент vGet на Rust, который скачивает зашифрованный VShell из S3 и общается с командным сервером по WebSocket на 56.155.98[.]37.
Параллельно на узлы Kubernetes доставлялись дроппер с дополнительной копией VShell и сам руткит LinkPro, написанный на Go. Он работает в двух режимах: пассивном (reverse), когда ожидает внешнего сигнала, и активном (forward), где сам устанавливает связь. В активном режиме поддерживаются HTTP, WebSocket, UDP, TCP и DNS, в пассивном — только HTTP.
Маскировка обеспечивается eBPF-модулем Hide, который отслеживает системные события и скрывает процессы и сетевую активность. Если установить Hide не удалось, LinkPro использует запись «libld.so» в «/etc/ld.so.preload» для перехвата системных вызовов в пользовательском пространстве. Для активации пассивного канала применяется второй eBPF-модуль Knock, работающий с XDP и TC.
Knock отслеживает «магический» TCP-пакет (magic packet) с размером окна 54321. Получив такой пакет, модуль запоминает IP-адрес источника и даёт ему часовой доступ. В течение этого времени входящий трафик с этого адреса перенаправляется на порт 2333, где слушает LinkPro, а исходящие ответы маскируются под порт 2233. Такая схема позволяет обходить файрволы через любой разрешённый порт и затрудняет сопоставление логов.
Для закрепления LinkPro создаёт systemd-сервис, а при завершении по сигналам SIGHUP, SIGINT или SIGTERM аккуратно удаляет eBPF-модули, восстанавливает «/etc/libld.so» и чистит следы. Бэкдор умеет запускать «/bin/bash» в псевдотерминале, выполнять команды, работать с файлами и каталогами, загружать данные и поднимать SOCKS5-туннель. На ядрах с CONFIG_BPF_KPROBE_OVERRIDE руткит перехватывает getdents для сокрытия файлов и sys_bpf для маскировки своих eBPF-программ.
Комбинация eBPF-стелса, активации по «магическому пакету» и подмены портов делает LinkPro сложным противником для обычных средств мониторинга, поскольку все внешние признаки в логах указывают на разрешённый сервис, тогда как управление идёт скрытым каналом. Для защиты облачных Kubernetes-сред требуется контроль eBPF-загрузок на узлах, проверка целостности «/etc/ld.so.preload», мониторинг systemd-сервисов и анализ аномальных значений TCP Window.