Уязвимость PolKit позволяла получить root-доступ в большинстве дистрибутивов Linux.

Недавно 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 до сих пор доступно в виде патча (версия исправления не сформирована), но поскольку разработчики дистрибутива были уведомлены о проблеме заранее, большинство дистрибутивов выпустили обновление одновременно с раскрытием информации. информации об уязвимостях.

В конце концов если вам интересно узнать об этом больше, вы можете проверить подробности в по следующей ссылке.


Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

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