Недавно Qualys выпустил новость о том, что обнаружил уязвимость (CVE-2021-4034) en компонент системы Полкит (ранее PolicyKit), который используется в дистрибутивах, чтобы позволить непривилегированным пользователям выполнять действия, требующие повышенных прав доступа.
Уязвимость позволяет непривилегированному локальному пользователю повышать свои привилегии до пользователя root и получить полный контроль над системой. Проблема носит кодовое название PwnKit и примечательна тем, что создает работающий эксплойт, который работает с настройками по умолчанию в большинстве дистрибутивов Linux.
Упоминается, что проблема существует в утилите pkexec, входящей в состав PolKit, который поставляется с корневым флагом SUID и предназначен для запуска команд с привилегиями других пользователей в соответствии с правилами PolKit.
Из-за неправильной обработки аргументов из командной строки, переданной в pkexec, непривилегированный пользователь может обойти аутентификацию и запустить ваш код от имени пользователя root, вне зависимости от установленных правил доступа. Для атаки, какие бы настройки и ограничения ни были установлены в PolKit, достаточно установить корневой атрибут 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 до сих пор доступно в виде патча (версия исправления не сформирована), но поскольку разработчики дистрибутива были уведомлены о проблеме заранее, большинство дистрибутивов выпустили обновление одновременно с раскрытием информации. информации об уязвимостях.
В конце концов если вам интересно узнать об этом больше, вы можете проверить подробности в по следующей ссылке.