Руткіт LinkPro для Linux
Нещодавнє компрометування середовища 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 — скрипт оболонки, який запускає SSH-сервіс та виконує два інші компоненти.
link — програма з відкритим кодом (vnt), скомпільована/упакована для роботи як VPN/проксі-клієнт, що підключається до vnt.wherewego[.]top:29872. Це дозволяє зловмиснику дістатися до скомпрометованого хоста з будь-якого місця та переходити до інших цілей через нього.
app — завантажувач на основі Rust (відомий як vGet), який отримує зашифроване корисне навантаження vShell з корзини S3, а потім встановлює посилання WebSocket на свій сервер командування та управління (C2) за адресою 56.155.98[.]37.
Додаткові корисні навантаження, доставлені до вузлів Kubernetes
Поряд зі шкідливим зображенням, оператори також розмістили на вузлах два інші компоненти: дроппер, який встановлює ще один бекдор vShell, та 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 стає активним лише після отримання певного «магічного пакета».
- Встановіть персистентність, створивши службу systemd.
- Виконувати команди, отримані від C2.
- Під час завершення роботи або за сигналом (SIGHUP, SIGINT, SIGTERM) видаліть модулі eBPF та видаліть/відновіть модифікацію попереднього завантаження /etc/libld.so, щоб система повернулася до попереднього стану.
Чарівний пакет та механізм активації Knock
Пасивна активація LinkPro залежить від точного TCP-пакета: будь-який TCP-пакет, розмір вікна якого дорівнює 54321, розглядається як «магічний пакет». Коли Knock виявляє цей пакет, він зберігає вихідну IP-адресу та позначає її терміном дії в одну годину. Наступні TCP-пакети з цього джерела контролюються, і, за потреби, Knock перезаписує заголовки, щоб трафік оператора перенаправлявся на порт прослуховування LinkPro (2333). Вихідні пакети коригуються для повернення вихідного порту до мережі (вихідний порт перезаписується на 2233). Мета проста, але ефективна: дозволити зловмиснику отримати доступ до LinkPro через будь-який порт, дозволений зовнішнім брандмауером, одночасно ускладнюючи співвідношення журналів зовнішнього брандмауера з активністю внутрішньої мережі хоста.
Як 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 та виконання інтерактивних сеансів оболонки.
- Виконання довільних команд оболонки.
- Перерахування файлів і каталогів і виконання файлових операцій.
- Завантаження та запис файлів на диск.
- Створення проксі-тунелю 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).