LinkPro Linux Rootkit
Niedawne włamanie do środowiska Amazon Web Services (AWS) ujawniło wcześniej nieudokumentowanego rootkita GNU/Linux, śledzonego jako LinkPro. Ten backdoor wyróżnia się podwójnym wykorzystaniem modułów eBPF: jednego zestawu do ukrywania artefaktów, a drugiego, który działa jak ukryty wyzwalacz – „pukanie”, które uruchamia funkcję zdalnego sterowania dopiero po wykryciu specjalnie spreparowanego pakietu TCP. Łańcuch ataku i mechanizmy rootkita ilustrują wyrafinowanego operatora, który łączy nadużycia kontenerów, ukrywanie na poziomie jądra i elastyczną aktywację sieci, aby utrudnić wykrywanie i korelację kryminalistyczną.
Spis treści
Wektor infekcji i początkowe wdrożenie
Włamanie rozpoczęło się od wykorzystania ujawnionej instancji Jenkinsa podatnej na lukę CVE‑2024‑23897 (CVSS 9.8). Z tego punktu atakujący wprowadzili złośliwy obraz Dockera (kvlnt/vv, usunięty z Docker Hub) do wielu klastrów Kubernetes. Obraz wykorzystywał bazę Kali Linux i zawierał niewielki folder aplikacji, którego celem było ustanowienie trwałości, dostępu zdalnego i umożliwienie pobrania backdoora.
Wewnątrz złośliwego obrazu Dockera
Folder aplikacji obrazu zawierał trzy kluczowe pliki o różnych rolach:
start.sh — skrypt powłoki, który uruchamia usługę SSH i wykonuje pozostałe dwa komponenty.
link — program typu open source (vnt) skompilowany/spakowany tak, aby działał jako klient VPN/proxy, łączący się z vnt.wherewego[.]top:29872. Pozwala to atakującemu dotrzeć do zainfekowanego hosta z dowolnego miejsca i za jego pośrednictwem przekierować na inne cele.
aplikacja — program do pobierania oparty na języku Rust (nazywany vGet), który pobiera zaszyfrowany ładunek vShell z kontenera S3, a następnie nawiązuje połączenie WebSocket ze swoim serwerem poleceń i kontroli (C2) pod adresem 56.155.98[.]37.
Dodatkowe ładunki dostarczane do węzłów Kubernetes
Oprócz złośliwego obrazu, operatorzy umieścili na węzłach również dwa inne komponenty: dropper instalujący kolejny backdoor vShell oraz LinkPro, rootkita napisanego w języku Golang. LinkPro został zaprojektowany do działania w jednym z dwóch trybów – pasywnym (odwrotnym) lub aktywnym (do przodu) – w zależności od konfiguracji. W trybie pasywnym oczekuje na aktywację specjalnym pakietem sieciowym; w trybie aktywnym inicjuje kontakt z samym C2. Tryb do przodu obsługuje pięć protokołów transportowych (HTTP, WebSocket, UDP, TCP, DNS), natomiast tryb odwrotny ogranicza komunikację do protokołu HTTP.
Jak LinkPro przetrwał
Całkowite działanie i trwałość złośliwego oprogramowania przebiegają według jasnej sekwencji:
- Zainstaluj moduł Hide eBPF. Ten moduł zawiera programy Tracepoint i Kretprobe eBPF służące do ukrywania procesów i aktywności sieciowej LinkPro.
- Jeśli instalacja modułu Hide eBPF się nie powiedzie — lub jeśli został on wyłączony — zainstaluj bibliotekę współdzieloną w /etc/libld.so i dodaj tę ścieżkę do /etc/ld.so.preload jako awaryjny mechanizm ukrywania.
- W przypadku pracy w trybie odwrotnym (pasywnym) zainstaluj moduł Knock eBPF. Knock zawiera program XDP i program TC, więc kanał C2 staje się aktywny dopiero po otrzymaniu określonego „magicznego pakietu”.
- Ustanowić trwałość poprzez utworzenie usługi systemd.
- Wykonuj polecenia otrzymane z C2.
- Podczas wyłączania systemu lub po otrzymaniu sygnału (SIGHUP, SIGINT, SIGTERM) odinstaluj moduły eBPF i usuń/przywróć modyfikację wstępnego ładowania pliku /etc/libld.so, aby system powrócił do poprzedniego stanu.
Pakiet Magiczny i Mechanizm Aktywacji Pukania
Pasywna aktywacja LinkPro zależy od precyzyjnego pakietu TCP: każdy pakiet TCP, którego rozmiar okna wynosi 54321, jest traktowany jako „magiczny pakiet”. Po wykryciu pakietu przez Knock, zapisuje źródłowy adres IP i oznacza go godzinnym okresem ważności. Kolejne pakiety TCP z tego źródła są monitorowane i, w razie potrzeby, Knock przepisuje nagłówki, tak aby ruch operatora był przekierowywany na port nasłuchujący LinkPro (2333). Pakiety wychodzące są dostosowywane tak, aby wyświetlać w sieci oryginalny port (port źródłowy jest przepisywany na 2233). Cel jest prosty, ale skuteczny: umożliwić atakującemu dotarcie do LinkPro przez dowolny port dozwolony przez zaporę sieciową, jednocześnie utrudniając korelację zewnętrznych logów zapory z wewnętrzną aktywnością sieciową hosta.
Jak LinkPro się ukrywa
LinkPro stosuje dwustopniową strategię ukrywania:
Ukrywanie jądra/eBPF : Moduł Hide eBPF instaluje programy Tracepoint i Kretprobe, które przechwytują wywołania systemowe, takie jak getdents (do ukrywania plików/katalogów) i sys_bpf (do ukrywania własnych programów BPF). To podejście wymaga jądra z włączoną opcją CONFIG_BPF_KPROBE_OVERRIDE.
Zapasowy mechanizm LD_PRELOAD w przestrzeni użytkownika : Jeśli funkcja jądra nie jest dostępna, LinkPro zapisuje bibliotekę współdzieloną (libld.so) i umieszcza jej ścieżkę w pliku /etc/ld.so.preload. Ponieważ plik /etc/ld.so.preload powoduje załadowanie wskazanej biblioteki do każdego procesu dynamicznie linkowanego (używającego /lib/ld-linux.so i glibc), wszczepiony plik libld.so przechwytuje funkcje libc wcześnie (przed zachowaniem samego glibc) i modyfikuje wyniki wywołań libc, aby ukryć artefakty, które w przeciwnym razie ujawniłyby jego obecność.
Możliwości rootkitów i zestaw poleceń
LinkPro obsługuje zarówno interaktywne, jak i zautomatyzowane działania zdalne. Jego zaimplementowane funkcje obejmują:
- Uruchomienie pseudoterminala /bin/bash i uruchomienie interaktywnych sesji powłoki.
- Wykonywanie dowolnych poleceń powłoki.
- Wyliczanie plików i katalogów oraz wykonywanie operacji na plikach.
- Pobieranie i zapisywanie plików na dysku.
- Utworzenie tunelu proxy SOCKS5 do przełączania i obsługi proxy dla gospodarstw domowych.
Obsługa protokołu sieciowego i zachowanie C2
W trybie aktywnym (do przodu) LinkPro jest elastyczny: może komunikować się za pomocą transportów HTTP, WebSocket, UDP, TCP lub DNS. W trybie pasywnym (do tyłu) jego komunikacja jest ograniczona do HTTP, ale korzysta z funkcji stealth, ponieważ nasłuchuje dopiero po otwarciu tymczasowego, godzinnego okna poleceń pakietu Knock Magic.
Czyszczenie i zachowanie dezinstalacji
Jeśli proces otrzyma sygnały zakończenia, LinkPro dąży do usunięcia śladów: odinstalowuje zainstalowane moduły eBPF i usuwa lub przywraca plik /etc/libld, grupując go do poprzedniego stanu, dzięki czemu system wydaje się niezmieniony. Ta celowa procedura czyszczenia wskazuje na obawy operatora dotyczące unikania i minimalizowania długoterminowych śladów kryminalistycznych.
Kontekst operacyjny i atrybucja
W kampanii wykorzystano lukę w zabezpieczeniach Jenkinsa o wysokim stopniu zagrożenia, złośliwe obrazy kontenerów, wiele wariantów backdoorów oraz mechanizm ukrywania się na poziomie jądra – połączenie to wskazuje na zmotywowanego i sprawnego operatora. Nie ujawniono jednoznacznie źródła, jednak zestaw narzędzi i widoczne wykorzystanie włamania do obsługi serwerów proxy i trwałego dostępu zdalnego zdecydowanie sugerują działania motywowane finansowo (pivoting, obsługa serwerów proxy w celu przeprowadzania dodatkowych włamań lub odsprzedaż dostępu).
Zależność jądra i zachowanie awaryjne
Ponieważ LinkPro opiera się na funkcjach nadpisywania kprobe BPF do dyskretnego przechwytywania jądra, stosuje technikę ukrywania na poziomie jądra tylko wtedy, gdy jądro hosta ujawnia CONFIG_BPF_KPROBE_OVERRIDE. W przypadku braku tej funkcji jądra, LinkPro celowo ucieka się do metody biblioteki współdzielonej LD_PRELOAD, aby ukryć się w przestrzeni użytkownika, zapewniając ukrycie w szerokim zakresie środowisk.
Uwaga końcowa
LinkPro demonstruje, jak współczesne włamania mogą łączyć w sobie kompromitację kontenerów, ładowanie etapowe, instrumentację jądra (eBPF) oraz sprytne sztuczki sieciowe (aktywację magicznego pakietu i przepisywanie portów), aby zachować niewidzialność i elastyczność. Wykrywanie i naprawa wymagają starannej inspekcji pod kątem nieautoryzowanych programów eBPF, nieoczekiwanych wpisów w pliku /etc/ld.so.preload, nietypowych usług systemd oraz połączeń sieciowych ze wskazaną infrastrukturą (wskaźniki śledcze obejmują adres IP 56.155.98[.]37, porty 29872, 2333, 2233 oraz usuniętą nazwę obrazu Dockera kvlnt/vv).