W systemie Linux odkryto błąd umożliwiający LPE (lokalne podniesienie uprawnień) ze zwykłego konta użytkownika do uprzywilejowanego użytkownika systemu „root”. Dla wielu przedsiębiorstw może to być poważne zagrożenie. W sieci istnieje exploit na tą lukę.
Tym razem postanowiliśmy napisać o kolejnym błędzie na Linux, żebyście nie myśleli, że tylko bezpieczeństwo Windows się dla nas liczy ☺ Systemy Linux/Unix są i będą krytycznym elementem środowisk IT, na których pracuje wiele biznesowych aplikacji, usług, baz danych i nie tylko. Nieodpowiednie dbanie o taki system oraz zapewnienie dostępu nawet dla zwykłego użytkownika do takiego serwera może firmę kosztować. I to dużo. Zwłaszcza jeśli atakujący dobrze zna się na systemie operacyjnym i jego słabostkach. Jedną z nich opisujemy poniżej.
Szczegóły podatności
Opisywany błąd dotyczy problemu w kodzie Netfilter, który odkrył Arthur Mongolin.
Otrzymał on numer CVE-2022-34918 i dotyczy przepełnienia bufora sterty w podsystemie Netfilter jądra Linux. Luka może zostać wykorzystana do zwiększenia uprawnień w systemie Ubuntu 22.04.
Dla osób niezaznajomionych ze środowiskiem Linux wyjaśniamy, że Netfilter to framework w jądrze Linux służący do przechwytywania i zmieniania ruchu sieciowego. Jest także nazwą projektu dostarczającego aplikacje do obsługi tego frameworka.
Zbudowany jest z szeregu punktów w kodzie obsługi sieci, w których można umieszczać funkcje odpowiedzialne za analizę i zmianę pakietów sieciowych. Punkty te są pogrupowane w tablice, a funkcje przyłączone w danym punkcie nazywane są łańcuchami.
Struktura filtrowania pakietów netfilter oraz firewall iptables są podstawą większości rozwiązań firewall na serwerach Linux. Zakotwiczenia jądra netfilter są wystarczająco blisko stosu sieciowego, aby zapewnić potężną kontrolę nad pakietami przetwarzanymi przez system, stad też exploitacja tego modułu umożliwia zdobycie największych uprawnień do systemu.
Podczas analizy kodu Netfilter autor odkrycia zwrócił uwagę na wywołanie funkcji „memcpy” (zaznaczonej jako (1) na obrazku) w definicji funkcji nft_set_elem_init (źródło kodu w pliku „/net/netfilter/nf_tables_api.c”).
Dalsze badania i testy kodu Netfilter (między innymi przepełnienia bufora pamięci w stosie jądra systemu) spowodowały, że Artur mógł oszukać system i w wyniku błędu otrzymać najwyższe uprawnienia do niego – czyli użytkownika root, na którym działa usługa Netfilter.
Poniższy schemat podsumowuje różne etapy elem.data w stosie w celu wytworzenia kontrolowanego przepełnienia.
„Losowe dane są przechowywane w stosie, dodanie nowego elementu z danymi NFT_DATA_VALUE prowadzi do danych kontrolowanych przez użytkownika w stosie. Na koniec dodanie drugiego elementu z danymi NFT_DATA_VERDICT spowoduje przepełnienie bufora, a pozostałość danych ostatniego elementu zostanie skopiowana podczas przepełnienia.” – napisał badacz na swoim blogu.
Dostępny Exploit
Autor odkrycia opublikował też w sieci exploit, którego kod źródłowy możecie znaleźć na GitHubie tutaj.
Demo zamieściliśmy poniżej
Jak twierdzi autor: „Metoda eksploatacji opiera się na założeniu, że w specjalnym obszarze pamięci jądra mapowany jest określony adres, co nie zawsze ma miejsce. Więc exploit nie jest w pełni niezawodny, ale nadal ma dobry wskaźnik sukcesu. Drugą wadą ataku polegającego na odłączaniu jest panika jądra, która pojawia się po zakończeniu exploit’a. Można tego uniknąć, znajdując obiekty, które mogą pozostać w pamięci jądra po zakończeniu procesu wykorzystywania.”
Jak sobie radzić z problemem?
Z dobrych informacji jakie mamy dla Was, to że błąd został zgłoszony do zespołu ds. bezpieczeństwa systemu. Ci zaś zaproponowali łatkę, którą autor podatności przetestował i zrecenzował. Znajduje się ona na etapie zatwierdzania. Informacje możecie przeczytać tutaj.
Jak widać nic nie jest bezpieczne i to kwestia czasu zanim znajdzie się obejście/luka.
Zachęcamy do łatania systemów i należytego ich monitorowania ☺
Szczegóły na temat luki możecie znaleźć tutaj.