Технология eBPF (extended Berkeley Packet Filter), изначально созданная для расширенных возможностей наблюдения, безопасности и сетевого взаимодействия в Linux, всё чаще становится инструментом для создания скрытых бэкдоров. Недобросовестные акторы научились использовать её возможности выполнения кода в контексте ядра с оркестрацией из пользовательского пространства для обхода традиционных средств мониторинга. На смену таким известным образцам вредоносного программного обеспечения, как BPFDoor, Symbiote и J-magic, пришёл более сложный LinkPro, обнаруженный экспертами Synacktiv CSIRT в ходе расследования инцидента на инфраструктуре, размещённой в AWS.
Описание
Компрометация началась с уязвимого сервера Jenkins, который использовался как точка первоначального доступа. Через него злоумышленник получил возможность взаимодействовать с конвейером развёртывания в среде Amazon EKS. Был развёрнут специально созданный образ Docker с меткой kvlnt/vv, содержащий скрытую нагрузку. Образ включал в себя скрипт, запускающий SSH-сервис, программу vnt для организации VPN-доступа и загрузчик vGet, написанный на Rust. Именно vGet отвечал за получение из S3-бакета зашифрованной полезной нагрузки - бэкдора vShell 4.9.3, который выполнялся непосредственно в памяти, не оставляя следов на диске.
Особенностью атаки стала последующая установка на узлы Kubernetes и производственные серверы нового руткита LinkPro. Это вредоносное ПО, разработанное на Golang, использует eBPF для обеспечения скрытности и реализации пассивного режима работы. LinkPro функционирует в двух режимах: активном, когда он сам инициирует соединение с сервером управления, и пассивном, при котором активация канала управления происходит только после получения специального «магического пакета».
Для сокрытия своей активности LinkPro использует два eBPF-модуля. Модуль «Hide» внедряет программы типа Tracepoint и Kretprobe, которые перехватывают системные вызовы getdents и sys_bpf. Это позволяет скрывать файлы руткита в файловой системе и маскировать его eBPF-программы от инструментов вроде bpftool. Если загрузка модуля «Hide» невозможна, руткит применяет резервный метод, загружая вредоносную библиотеку libld.so через механизм /etc/ld.so.preload, которая аналогичным образом подменяет результаты работы функций libc.
Модуль «Knock» отвечает за пассивный режим работы. Он состоит из программ XDP и Traffic Control, которые отслеживают сетевой трафик. Программа xdp_ingress, работающая на входе, ожидает TCP-пакет с определённым размером окна, который служит «магическим пакетом». Обнаружив его, система активируется на час для IP-адреса отправителя. Все последующие пакеты с этого адреса перенаправляются на внутренний порт прослушивания LinkPro. Программа tc_egress, работающая на исходящем трафике, маскирует ответы, подменяя порт отправителя, что значительно затрудняет корреляцию событий в журналах сетевых экранов.
Для обеспечения устойчивости LinkPro маскируется под системный сервис systemd-resolved, копирует свой исполняемый файл в скрытую директорию и регистрирует соответствующую unit-службу. После установки руткит предоставляет оператору широкий набор команд, включая выполнение произвольных команд оболочки, управление файлами, организацию туннелей SOCKS5 и создание интерактивных терминалов.
Анализ LinkPro демонстрирует растущую изощрённость атак с применением eBPF. Руткит сочетает в себе несколько уровней скрытности, адаптивен к конфигурации системы и использует передовые техники для уклонения от обнаружения. Хотя формальная атрибуция атаки не установлена, её цели носят финансовый характер. Появление LinkPro служит серьёзным сигналом для специалистов по безопасности о необходимости усиления мониторинга не только пользовательского пространства, но и активности eBPF в ядре Linux.