PwnKit — нова критична вразливість Linux родом з 2009 року
У вівторок 26 січня компанія Qualys повідомила, що знайшла вразливість (CVE-2021-4034) у PolKit (раніше PolicyKit) — частині Unix-систем. З цим компонентом ОС непривілейовані користувачі можуть виконувати дії, котрим потрібні права рівнем вище. Проблему знайшли лише зараз, але вона була з травня 2009 року, коли розробники додали команду pkexec.
Вразливості дали ім’я PwnKit, і з нею локальний користувач без привілеїв може підвищити права до root. Так хто завгодно може взяти систему під свій повний контроль, а експлойти можна створити майже для всіх дистрибутивів Linux.
Як працює PwnKit?
Вразливість перебуває в утиліті pkexec, яка постачається з прапором SUID root. Її головне призначення — запускати команди через привілеї інших користувачів за правилами з PolKit.
Якщо неправильно обробляються аргументи командного рядка, які направлені в pkexec, користувач без привілеїв може уникнути аутентифікації та запустити код із root-правами. За умови, що утиліта працюватиме з файлом, у якого виставлена ознака SUID root, будь-яка атака буде успішною.
Утиліта pkexec не перевіряє лічильник аргументів командного рядка на коректність, коли процес запускається. Автори думали, що в масиві argv спочатку завжди йтиме ім’я процесу, а за ним або значення NULL, або назва команди, яка запускається через pkexec.
Перевірки лічильника аргументів на відповідність вмісту масиву argv немає і вважалося, що він буде більше ніж 1. Але якщо процесу передати порожній масив (а функція execve таке дозволяє), pkexec зчитував NULL як ім’я процесу, а пам’ять поза буфера — як вміст масиву.
У пам’яті після масиву argv йде масив envp зі змінними оточення. Якщо в масиві argv порожньо, pkexec отримує дані про команду першого елемента масиву, яку запустили з підвищеними привілеями. argv[1] дорівнює envp[0], що дає зловмиснику контролювати його вміст.
Коли pkexec отримує значення argv[1], утиліта починає шукати повний шлях до файлу через файлові шляхи в PATH і намагається записати вказівник на рядок з повним шляхом в argv[1]. Тому перезапишеться значення першої змінної оточення, адже argv[1] збігається з envp[0].
Якщо зловмисник правильно попрацює з ім’ям першої змінної оточення, він може підставити іншу змінну в pkexec і зробити завантаження в процес своєї бібліотеки, що розділяється.
Робочий експлойт робить підставляння змінної GCONV_PATH. Якщо в ній перевизначити шлях, завантажуватиметься не звичайна бібліотека, а бібліотека зловмисника. Її обробники виконуються одночасно з виведенням помилки, коли pkexec ще працює з root-правами й доки не почалася перевірка повноважень запуску.
Що робити з PwnKit?
Вразливість працює шляхом пошкодження пам’яті, але експлуатується без урахування апаратної архітектури. Експлойт точно працює з Debian, CentOS, Ubuntu та Fedora, але й інші дистрибутиви в небезпеці. Публічно він не доступний, але дослідники кажуть, що його просто відтворити.
Тому якнайшвидше встановіть оновлення з виправленнями. До речі, з OpenBSD атака не працюватиме, бо ядро системи не дозволяє передати нульове значення argc під час виклику execve().
Вже готові патчі, а над корегувальним випуском зараз працюють. Розробники дізналися про вразливість раніше спільноти, тому в RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo та Arch Linux проблему вже вирішили. Якщо потрібно негайно розв’язати проблему, потрібно прибрати прапор SUID root з програми /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).