PwnKit — новая критическая уязвимость Linux из 2009 года

Как работает PwnKit

Во вторник 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»).

Добавить комментарий

Спасибо, что поделились