Критична уязвимост в PolKit, позволяваща получаване на root достъп в повечето дистрибуции на Linux

Компания Qualys откри уязвимост (CVE-2021-4034) в системния компонент Polkit (бившият PolicyKit), използван в дистрибутивите за организиране на действия, изискващи повишени права на достъп от непривилегировани потребители. Уязвимостта позволява на непривилегирован локален потребител да повиши своите права до потребител root и да получи пълен контрол над системата. Проблемата получи кодово име PwnKit и е забележителна с подготвения работещ експлоит, работещ по подразбиране в повечето дистрибутиви на Linux.

Проблемата е налична в утилитата pkexec, част от PolKit, предоставена с флага SUID root и предназначена за стартиране на команди с привилегии на друг потребител съгласно зададените правила на PolKit. Поради неправилната обработка на аргументите, подадени на командния ред в pkexec, непривилегирован потребител можеше да заобиколи удостоверяването и да стартира своя собствен код с права root, независимо от зададените правила за достъп. За атаката не е важно какви настройки и ограничения са зададени в PolKit, достатъчно е изпълняемият файл на утилитата pkexec да има зададен признак SUID root.

Pkexec не проверява коректността на броя на аргументите (argc) на командния ред, подадени при стартиране на процеса. Разработчиците на pkexec предполагат, че първият запис в масива argv винаги съдържа името на процеса (pkexec), а вторият или стойността NULL, или името на командата, която трябва да бъде стартирана чрез pkexec. Тъй като броят на аргументите не е проверяван спрямо действителното съдържание на масива и се предполага, че винаги е по-голям от 1, в случай на предаване на празен масив argv, което позволява функцията execve в Linux, pkexec възприема стойността NULL като първи аргумент (името на процеса), а следващата извън границите на буфера памет - като следващото съдържание на масива.

Проблемата е, че след масива argv в паметта се намира масив envp, съдържащ променливи на средата. Така че при празен масив argv, pkexec извлича данните за изпълняваната с повишени права команда от първия елемент на масива с променливи на средата (argv[1] става идентичен на envp[0]), съдържанието на който може да бъде контролирано от атакуващия.

След получаване на стойността argv[1], pkexec опитва да определи пълния път до изпълняемия файл, като вземе предвид файловите пътища в PATH и да запише указателя на строката с пълния път обратно в argv[1], което води до презаписване на стойността на първата променлива на средата, тъй като argv[1] е идентичен на envp[0]. Чрез манипулация с името на първата променлива на средата, атакуващият може да направи подмяна на друга променлива на средата в pkexec, например, да подмени променливата на средата „LD_PRELOAD“, която не се допуска в suid-програмите, и да организира зареждането на своята споделена библиотека в процеса.

В работния експлойт се извършва подмяна на променливата GCONV_PATH, която се използва за определяне на пътя до библиотеката за преобразуване на символи, динамично зареждана при извикването на функцията g_printerr(), в кода на която се използва iconv_open(). Преопределяйки пътя в GCONV_PATH, атакуващият може да постигне зареждане на нестандартната библиотека iconv, а не на своята библиотека, чийто обработчици ще бъдат изпълнени по време на извеждането на съобщение за грешка в етапа, когато pkexec все още работи с права root и преди проверката на правомощията за стартиране.

Отбелязва се, че въпреки че проблемът е причинен от повредена памет, той може надеждно и повторяемо да се експлоатира независимо от използваната хардуерна архитектура. Подготвеният експлоит е успешно тестван в Ubuntu, Debian, Fedora и CentOS, но може да се използва и в други дистрибутиви. Оригиналният експлоит все още не е наличен публично, което свидетелства, че той е тривиален и може лесно да бъде възпроизведен от други изследователи, поради което в многопотребителските системи е важно колкото се може по-скоро да се инсталира обновление с корекция. Polkit също е наличен за BSD системи и Solaris, но изучаването на възможността за експлоатация в тях не е извършвано. Известно е само, че атаката не може да бъде извършена в OpenBSD, тъй като ядрото на OpenBSD не допуска предаване на нулево значение за argc при извикване на execve().

Проблемът присъства от май 2009 г., от времето на добавяне на командата pkexec. Корекцията на уязвимостта в PolKit все още е налична под формата на патч (коригиращият релийз не е съставен), но тъй като разработчиците на дистрибутиви са били предварително уведомени за проблема, повечето дистрибутиви публикуваха обновление едновременно с разкритията за уязвимостта. Проблемът е отстранен в RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux и Manjaro. Като временно решение за блокиране на уязвимостта може да се премахне флагът SUID root от програмата /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



Източник: opennet.ru
Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster