Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
CVE-2022-0185 – podatność w jądrze Linuksa – eskalacja uprawnień do root
Opisywaliśmy niedawno eskalację uprawnień do admina na systemach Windows, do kolekcji podobna podatność w Linuksie:
Badacz wspomina, że ma przykładowe exploity działające na Ubuntu oraz na googlowy COS (Container-Optimized OS):
We currently have created functional LPE exploits against Ubuntu 20.04 and container escape exploits against Google’s hardened COS.
Podatność została wprowadzona w jądrze 5.1-rc1 (2019 rok) i jest załatana w tym patchu.
~Michał Sajdak
Patch:
– if (len > PAGE_SIZE – 2 – size)
+ if (size + len + 2 > PAGE_SIZE)
na czym polega różnica? ;/
W komentarzu w tym commiecie jest to wyjaśnione. W C takie porównanie będzie porównaniem intów bez znaku (unsigned int), co może prowadzić do sytuacji, kiedy warunek jest negatywny przy dużym size i małym len.
cytując commit z linku do patcha: so a large value of „size” results in a high positive value instead of a negative value as expected
Czyli przy dużym „size” równanie zjeżdża na minus i przekręca się licznik, natomiast po patchu nie ma tego problemu.
PAGE_SIZE z reguły jest 4096, size jest typu unsigned int, więc całe „PAGE_SIZE – 2 – size” będzie też działaniem typu unsigned int i przy size równym 4095 lub większym zamiast zejść poniżej zera, wystrzeli w kosmos do 4 miliardów (integer underflow). Wyjdzie z tego coś w stylu „len > 4294967295”, więc nie przerwie działania funkcji po przekroczeniu PAGE_SIZE, natomiast przy dodawaniu się nie przekręci i prawidłowo przerwie działanie.
Masz objaśnienie powyżej na tej samej stronie po angielsku…
To jest odejmowanie bez znaku, wiec jak wynik „PAGE_SIZE – 2 – size” wyjdzie poniżej zera, to jest traktowany jako duża liczba dodania.
btw:
Moderacja widzę bez poczucia humoru nie przepościła mojego „exploita” ;)
Jest napisane powyżej:
The „PAGE_SIZE – 2 – size” calculation in legacy_parse_param() is an unsigned type so a large value of „size” results in a high positive value instead of a negative value as expected.
Zresztą zgadłęm to bez sprawdzania — jeden z częstszych błędów — jeśli ktoś słabo rozumie artmetykę bitową :)
Pewnie porównanie unsignedi i int dla jak size +2 jest większy od page size to się pewnie przekręcał unsigned i nie była to prawda po zamianie nie będzie takiego przypadku
Odpowiedź jest w zamieszczonym linku do patcha:
The „PAGE_SIZE – 2 – size” calculation in legacy_parse_param() is an unsigned type so a large value of „size” results in a high positive value instead of a negative value as expected.
Potrzebuje CAP_SYS_ADMIN do działania, czyli wymaga włączonych namespace dla użytkowników.
Ubuntu; nie jest od dawna Linuxem….
Proszę nie bełtać w głowach czytelnikom.
pozdrawiam.
Dlaczego?
Jeden jest tylko linux i to Arch Linux :P
A tak na serio, to Ubuntu już dawno zatraciło pierwotne założenia Linuxa. Linux miał być systemem dającym użytkownikowi pełną kontrolę nad każdym aspektem jego działania. Każdy proces, każdy wysłany pakiet danych, każdy wyświetlony piksel mógł podlegać kontroli użytkownika.
Niestety Ubuntu idzie w stronę Win/iOS – coraz więcej funkcjonalności działa sama sobie bez kontroli użytkownika, a co gorsza użytkownik nawet gdyby chciał, to tej kontroli już nie uzyska. Oczywiście chodzi o „komfort użytkowania” dla przeciętnego zjadacza chleba, który osiąga się kosztem ograniczenia prywatności i zachowania „władzy” nad własnym urządzeniem. Tylko, że wtedy dla laika Win/iOS będzie lepszym rozwiązaniem.
Z Archa (i pochodnych) spokojnie korzystają również ludzie nietechniczni, chociaż muszą czasem pogrzebać na forach jak podłączyć telewizor do komputera. Cóż… coś za coś.
Troche a’propos:
jakis czas temu musialem cos sprawdzic i podgladalem ruch ze swiezo zainstalowanego Ubuntu.
Zauwazylem, ze mimo mojej nieaktywnosci regularnie wysyla pakiety do odleglego hosta o nic nie mowiacej nazwie. Zaniepokoilo mnie to. Przyjrzalem sie zawartosci pakietow i okazalo sie, ze kabluje do jakiegos ukrytego w chmurze serwisu firmy Ubuntu (NIE w domenie zwiazanej z Ubuntu).
Oczywiscie NIE pytal podczas instalacji o zgode ani nie znalazlem normalnego sposobu wylaczenia tego szpiegowania.