LinkPro Linux Rootkit
Скорошно компрометиране на среда на Amazon Web Services (AWS) разкри недокументиран досега руткит на GNU/Linux, проследяван като LinkPro. Този бекдор е забележителен с двойното си използване на eBPF модули: единият е за скриване на артефакти, а другият действа като скрит спусък - „чук“, който събужда функционалността за отдалечени команди само след като бъде видян специално създаден TCP пакет. Веригата от атаки и механизмите на руткита илюстрират сложен оператор, който съчетава злоупотреба с контейнери, скриване на ниво ядро и гъвкаво мрежово активиране, за да осуети откриването и криминалистичната корелация.
Съдържание
Вектор на инфекция и първоначално внедряване
Проникването започна с експлоатацията на изложен екземпляр на Jenkins, уязвим към CVE‑2024‑23897 (CVSS 9.8). От тази позиция нападателите разпространиха злонамерен Docker образ (kvlnt/vv, който след това беше премахнат от Docker Hub) в множество Kubernetes клъстери. Образът използваше базата на Kali Linux и съдържаше малка папка с приложения, предназначена за установяване на постоянство, отдалечен достъп и поетапно изтегляне на задна вратичка.
Вътре в злонамереното изображение на Docker
Папката с приложения на изображението съдържаше три ключови файла с различни роли:
start.sh — shell скрипт, който стартира SSH услуга и изпълнява другите два компонента.
link — програма с отворен код (vnt), компилирана/опакована да действа като VPN/прокси клиент, свързваща се навън към vnt.wherewego[.]top:29872. Това позволява на атакуващия да достигне до компрометирания хост отвсякъде и да се насочи към други цели чрез него.
приложение — базиран на Rust инструмент за изтегляне (наричан vGet), който извлича криптиран vShell полезен товар от S3 контейнер, след което установява WebSocket връзка към своя команден и контролен (C2) сървър на адрес 56.155.98[.]37.
Допълнителни полезни товари, доставени до възлите на Kubernetes
Наред със злонамереното изображение, операторите са инсталирали и два други компонента върху възлите: дропър, който инсталира друг vShell backdoor, и LinkPro, руткит, написан на Golang. LinkPro е проектиран да работи в един от два режима – пасивен (обратен) или активен (напред) – в зависимост от конфигурацията си. В пасивен режим той чака да бъде активиран от специален мрежов пакет; в активен режим той инициира контакт със самия C2. Режимът на пренасочване поддържа пет транспортни протокола (HTTP, WebSocket, UDP, TCP, DNS), докато обратният режим ограничава комуникациите до HTTP.
Как LinkPro се запазва
Цялостното изпълнение и поведение на зловредния софтуер при постоянство следват ясна последователност:
- Инсталирайте модула Hide eBPF. Този модул включва програмите Tracepoint и Kretprobe eBPF, използвани за скриване на процесите и мрежовата активност на LinkPro.
- Ако инсталирането на модула Hide eBPF е неуспешно или ако е деактивиран, инсталирайте споделена библиотека в /etc/libld.so и добавете този път към /etc/ld.so.preload като резервен механизъм за скриване.
- За обратна (пасивна) работа инсталирайте модула Knock eBPF. Knock съдържа XDP програма и TC програма, така че C2 каналът става активен само след получаване на специфичен „магически пакет“.
- Установете постоянство, като създадете системна услуга.
- Изпълнявайте команди, получени от C2.
- При изключване или когато е подаден сигнал (SIGHUP, SIGINT, SIGTERM), деинсталирайте eBPF модулите и премахнете/възстановете модификацията /etc/libld.so preload, така че системата да се върне в предишното си състояние.
Магическият пакет и механизмът за активиране с Knock
Пасивното активиране на LinkPro зависи от прецизен TCP пакет: всеки TCP пакет, чийто размер на прозореца е равен на 54321, се третира като „магически пакет“. Когато Knock открие този пакет, той съхранява IP адреса на източника и го маркира с едночасов срок на валидност. Последващите TCP пакети от този източник се наблюдават и, когато е уместно, Knock пренаписва заглавките, така че трафикът на оператора да бъде пренасочен към порта за слушане на LinkPro (2333). Изходящите пакети се коригират, за да представят оригиналния порт обратно на мрежата (портът на източника се пренаписва на 2233). Целта е ясна, но ефективна: да се позволи на атакуващия да достигне до LinkPro през всеки порт, който front-end защитната стена позволява, като същевременно се затруднява съпоставянето на външните регистрационни файлове на защитната стена с вътрешната мрежова активност на хоста.
Как LinkPro се прикрива
LinkPro използва двустепенна стратегия за скриване:
Скриване на ядрото/eBPF : Модулът Hide eBPF инсталира програми Tracepoint и Kretprobe, които прехващат системни извиквания като getdents (за скриване на файлове/директории) и sys_bpf (за скриване на собствените BPF програми). Този подход изисква ядро, изградено с активирана опцията CONFIG_BPF_KPROBE_OVERRIDE.
Резервен вариант за LD_PRELOAD в потребителското пространство : Ако възможностите на ядрото не са налични, LinkPro записва споделена библиотека (libld.so) и поставя пътя ѝ в /etc/ld.so.preload. Тъй като /etc/ld.so.preload кара посочената библиотека да бъде заредена във всеки динамично свързан процес (тези, които използват /lib/ld-linux.so и glibc), имплантираната libld.so закача libc функциите рано (преди собственото поведение на glibc) и променя връщанията от libc извикванията, за да скрие артефактите, които иначе биха разкрили нейното присъствие.
Възможности и набор от команди за руткитове
LinkPro поддържа както интерактивни, така и автоматизирани отдалечени действия. Внедрените функции включват:
- Стартиране на псевдотерминал /bin/bash и изпълнение на интерактивни shell сесии.
- Изпълнение на произволни команди от shell.
- Изброяване на файлове и директории и извършване на файлови операции.
- Изтегляне и запис на файлове на диск.
- Създаване на SOCKS5 прокси тунел за пивотинг и проксиране извън рамките на земята.
Поддръжка на мрежови протоколи и поведение на C2
В активен (напред) режим LinkPro е гъвкав: може да комуникира чрез HTTP, WebSocket, UDP, TCP или DNS транспорти. В пасивен (обратен) режим комуникацията му е ограничена до HTTP, но се възползва от скритостта, защото слуша само след като магическият пакет Knock е отворил временен едночасов команден прозорец.
Поведение при почистване и деинсталиране
Ако процесът получи сигнали за прекратяване, LinkPro се стреми да премахне следите: деинсталира инсталираните eBPF модули и изтрива или възстановява /etc/libld, групирайки го в предишното му състояние, така че системата да изглежда непроменена. Тази умишлена рутина за почистване показва, че операторът е загрижен за избягването на проверка и минимизиране на дългосрочните криминалистични следи.
Оперативен контекст и атрибуция
Кампанията използваше експлойт на Jenkins с висока степен на сериозност, злонамерени изображения на контейнери, множество варианти на задни врати и стелт на ниво ядро - комбинация, която сочи към мотивиран и способен оператор. Не е оповестена окончателна атрибуция; въпреки това, наборът от инструменти и очевидното използване на компромета за проксиране и постоянен отдалечен достъп силно предполагат финансово мотивирана дейност (въртене на сървъри, проксиране за допълнителни прониквания или препродажба на достъп).
Зависимост от ядрото и резервно поведение
Тъй като LinkPro разчита на функциите за отмяна на BPF kprobe за своето скрито прихващане в ядрото, той прилага техниката за скриване на ниво ядро само когато ядрото на хоста разкрие CONFIG_BPF_KPROBE_OVERRIDE. Когато тази възможност на ядрото липсва, LinkPro умишлено се връща към метода на споделената библиотека LD_PRELOAD, за да се скрие в потребителското пространство, осигурявайки скритост в широк спектър от среди.
Заключителна бележка
LinkPro демонстрира как съвременните прониквания могат да комбинират компрометиране на контейнери, поетапни зареждащи програми, инструментация на ядрото (eBPF) и хитри мрежови трикове (активиране на магически пакети и пренаписване на портове), за да поддържат скритост и гъвкавост. Откриването и отстраняването на проблеми изискват внимателна проверка за неоторизирани eBPF програми, неочаквани записи в /etc/ld.so.preload, необичайни системни услуги и мрежови връзки към посочената инфраструктура (криминалистичните индикатори включват IP адреса 56.155.98[.]37, портове 29872, 2333, 2233 и премахнатото име на Docker образа kvlnt/vv).