Критична вразливість у 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[0] | argv[1] | … | argv [argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-option" NULL "value" "PATH=name" 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 не допускає передачу при виклику execve() нульового значення argc.

Проблема є з травня 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

Додати коментар або відгук