CVE-2021-3156: Przepełnienie bufora sterty w sudo
Napisał: Patryk Krawaczyński
27/01/2021 w Bezpieczeństwo Brak komentarzy. (artykuł nr 768, ilość słów: 564)
Zespół badawczy Qualys odkrył lukę przepełnienia sterty w sudo – prawie wszechobecnym narzędziu dostępnym w głównych systemach operacyjnych typu *nix. Każdy nieuprzywilejowany użytkownik posiadający dostęp do powłoki systemowej może uzyskać uprawnienia administratora (root) na hoście, którego dotyczy luka (przy domyślnej konfiguracji sudo). Sudo to potężne narzędzie, które jest zawarte w większości, jeśli nie we wszystkich systemach operacyjnych na systemach Unix i Linux. Umożliwia użytkownikom uruchamianie programów z uprawnieniami innego użytkownika. Luka sama w sobie ukrywała się na widoku prawie od 10 lat. W lipcu 2011 roku została wprowadzona zmiana (commit 8255ed69) i dotyczy ona wszystkich starszych wersji od 1.8.2 do 1.8.31p2 oraz wszystkich stabilnych wersji od 1.9.0 do 1.9.5p1 w ich domyślnej konfiguracji.
Udane wykorzystanie tej luki pozwala każdemu nieuprzywilejowanemu użytkownikowi uzyskać uprawnienia administratora na podatnym serwerze. Badacze bezpieczeństwa z firmy Qualys byli w stanie niezależnie zweryfikować lukę i opracować wiele wariantów eksploitów oraz uzyskać pełne uprawnienia użytkownika root na Ubuntu 20.04 (sudo 1.8.31
), Debian 10 (sudo 1.8.27
) i Fedorze 33 (sudo 1.9.2
). Inne systemy operacyjne i dystrybucje również mogą być podatne na eksploity.
Kiedy sudo uruchamia polecenie w trybie powłoki, albo przez opcję wiersza poleceń -s
lub -i
, modyfikuje znaki specjalne w argumentach polecenia za pomocą odwrotnego ukośnika ("\"
– ang. backslash). Wtyczka polityki sudoers usunie wtedy zmodyfikowane znaki specjalne z argumentów przed oceną polityki sudoers (która nie oczekuje znaków specjalnych), jeśli polecenie jest uruchamianie w trybie powłoki. Błąd w kodzie usuwającym zmodyfikowane znaki specjalne powoduje odczytanie ostatniego znaku w łańcuchu znaków, jeśli kończy się on niezmodyfikowanym znakiem odwrotnego ukośnika. W normalnych okolicznościach, błąd ten byłby nieszkodliwy, ponieważ sudo usuwa wszystkie odwrotne ukośniki w argumentach polecenia. Jednakże, z powodu innego błędu – tym razem w kodzie parsującym (dokonującym analizy składniowej ciągu znaków w celu ustalenia jej struktury) wiersz poleceń, możliwe jest uruchomienie polecenia sudoedit
z opcjami -s
lub -i
ustawiając w ten sposób flagę wskazującą na włączony tryb powłoki. Ponieważ polecenie nie jest w rzeczywistości wykonywane, sudo nie modyfikuje znaków specjalnych. Ostatecznie kod decydujący o modyfikacji znaków specjalnych nie sprawdza czy polecenie jest rzeczywiście wykonywane, a tylko czy flaga dla trybu powłoki jest ustawiona. Ta niespójność tworzy błąd możliwy do wykorzystania.
Aby sprawdzić, czy Twoja wersja sudo
jest podatna na ataki, można użyć następującego polecenia:
sudoedit -s '\' `perl -e 'print "A" x 65536'`
Jeśli otrzymasz komunikat o użyciu (usage:
) lub błędzie, sudo
nie jest podatne na ataki. Jeśli wynikiem jest błąd segmentacji (Segmentation fault
), sudo
jest podatne na ataki:
agresor@darkstar:~$ sudoedit -s '\' `perl -e 'print "A" x 65536'` Segmentation fault agresor@darkstar:~$ sudo apt install -y sudo Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be upgraded: sudo 1 upgraded, 0 newly installed, 0 to remove and 4 not upgraded. Need to get 428 kB of archives. After this operation, 0 B of additional disk space will be used. Get:1 ubuntu.com/ubuntu bionic-updates/main amd64 sudo amd64 1.8.21p2-3ubuntu1.4 [428 kB] Fetched 428 kB in 0s (2,222 kB/s) (Reading database ... 223754 files and directories currently installed.) Preparing to unpack .../sudo_1.8.21p2-3ubuntu1.4_amd64.deb ... Unpacking sudo (1.8.21p2-3ubuntu1.4) over (1.8.21p2-3ubuntu1.3) ... Setting up sudo (1.8.21p2-3ubuntu1.4) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... agresor@darkstar:~$ sudoedit -s '\' `perl -e 'print "A" x 65536'` usage: sudoedit [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt]
Więcej informacji: CVE-2021-3156: Heap-Based Buffer Overflow in Sudo (Baron Samedit), Buffer overflow in command line unescaping