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

наскоро Qualy's пусна новината, че е идентифицирал уязвимост (CVE-2021-4034) en системен компонент polkit (по-рано PolicyKit), който се използва в дистрибуции, за да позволи на непривилегированите потребители да извършват действия, които изискват повишени права за достъп.

Уязвимост позволява на непривилегирован локален потребител да повиши привилегиите си до root потребител и да получите пълен контрол над системата. Проблемът е с кодово име PwnKit и се отличава с това, че създава работещ експлойт, който работи с настройки по подразбиране в повечето дистрибуции на Linux.

Споменава се, че проблемът съществува в помощната програма pkexec, включена в PolKit, който идва с основния флаг SUID и е предназначен да изпълнява команди с привилегиите на други потребители според правилата на PolKit.

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

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 не позволява предаване на стойност null argc при извикване на execve().

Проблемът съществува от май 2009 г., когато беше добавена командата pkexec. Поправката за уязвимостта в PolKit все още е налична като корекция (версията на корекцията не е формирана), но тъй като разработчиците на дистрибуцията бяха уведомени за проблема предварително, повечето дистрибуции пуснаха актуализация по същото време. след разкриване на информация за уязвимостта.

Накрая ако се интересувате да научите повече за това, можете да проверите подробностите в следната връзка.


Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

  1. Отговорен за данните: Мигел Анхел Гатон
  2. Предназначение на данните: Контрол на СПАМ, управление на коментари.
  3. Легитимация: Вашето съгласие
  4. Съобщаване на данните: Данните няма да бъдат съобщени на трети страни, освен по законово задължение.
  5. Съхранение на данни: База данни, хоствана от Occentus Networks (ЕС)
  6. Права: По всяко време можете да ограничите, възстановите и изтриете информацията си.