Prototyp rootkita dla Linuksa wykorzystujący io_uring do omijania analizatorów wywołań systemowych

Badacze z firmy ARMO zaprezentowali możliwość tworzenia rootkitów, które nie wykorzystują specyficznych wywołań systemowych do wykonywania typowych operacji, takich jak odczyt/zapis plików i odbiór poleceń z zewnętrznego serwera. Zamiast wywołań systemowych do przeprowadzania operacji sieciowych i plikowych zaproponowano użycie interfejsu asynchronicznego wejścia/wyjścia io_uring, wspieranego od jądra Linux 5.1.

Istota metody polega na tym, że zamiast oddzielnych wywołań systemowych do uzyskiwania dostępu do plików i przeprowadzania operacji sieciowych (read/write, recv/send/connect/bind/listen) można korzystać z ogólnych wywołań systemowych io_uring (io_uring_enter, io_uring_setup, io_uring_register itd.), które nie są analizowane przez typowe narzędzia w celu wykrycia złośliwej aktywności. Interfejs io_uring wspiera około 60 różnych operacji. W trakcie rozwoju znajduje się możliwość pozwalająca na uruchamianie nowych procesów przez io_uring.

Aby zademonstrować działanie metody, przygotowano prototyp rootkita Curing, który wykonuje takie działania, jak odbieranie poleceń z zewnętrznego serwera i przesyłanie/zmiana plików. W demonstracji wykorzystano wysyłanie żądania do portu TCP 8888 zewnętrznego hosta oraz przesyłanie zawartości pliku „/etc/shadow”. Zakłada się, że po pomyślnym skompromitowaniu systemu i uzyskaniu praw roota, atakujący instaluje rootkita, aby utrwalić swoje obecność na złamanym systemie.

W przeprowadzonym eksperymencie aktywność rootkita Curing nie została zauważona przez narzędzia monitorujące Falco i Tetragon, stosowane do identyfikacji związanych z bezpieczeństwem anomalii na hostach i w kontenerach (wspierana jest integracja z infrastrukturą opartą na Kubernetes). Wspomniane narzędzia wykorzystują przechwytywanie wywołań systemowych do analizy takich zdarzeń, jak uruchamianie procesów, aktywność sieciowa i operacje na plikach, ale nie uwzględniają możliwości korzystania z podsystemu io_uring do podobnych operacji. Większość dostępnych na Linux komercyjnych systemów wykrywania i reagowania na incydenty bezpieczeństwa opiera się również na przechwytywaniu wywołań systemowych.

Aby wykluczyć omijanie narzędzi do monitorowania sieciowej i plikowej aktywności, zamiast przechwytywania wywołań systemowych zaleca się wykorzystanie mechanizmu KRSI (Kernel Runtime Security Instrumentation), który pojawił się w jądrze Linux 5.7 i umożliwia przywiązanie programów BPF do dowolnych haków LSM. Na przykład, KRSI na poziomie haków LSM umożliwia śledzenie operacji na plikach, dostępu do sieci oraz uruchamiania procesów, niezależnie od tego, czy operacje te są inicjowane za pomocą specyficznych wywołań systemowych, czy za pomocą io_uring.

Wcześniej podsystem io_uring był obiektem krytyki z powodu regularnie pojawiających się poważnych podatności. W odpowiedzi na prośby użytkowników, którzy chcieli prostego narzędzia do wyłączania io_uring bez rekompilacji jądra, w jądro Linux 6.6 dodano sysctl io_uring_disabled. Firma Google domyślnie wyłączyła io_uring w ChromeOS, Androidzie i na swoich serwerach, tłumacząc, że zła sytuacja z bezpieczeństwem w io_uring przeważa nad korzyściami z jego zastosowania w celu zwiększenia wydajności.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster