
Это моя простая реализация эксплойта для уязвимости PwnKit.
Примечание: Этот репозиторий и его содержимое являются частью дипломного проекта (GrAL), созданного исключительно в образовательных целях и для академических исследований.
Этот репозиторий содержит проверку концепции (PoC — Proof of Concept) для уязвимости CVE-2021-4034 (также известной как PwnKit). Эта уязвимость повреждения памяти затрагивает компонент pkexec из Polkit в Linux-системах. При запуске pkexec с пустым списком аргументов (argc == 0) переменными окружения можно манипулировать так, чтобы принудить загрузку произвольной общей библиотеки, таким образом добиваясь локального повышения привилегий.
Ниже описаны шаги, необходимые для подготовки среды выполнения с целью эксплуатации этой ошибки. Этот процесс показывает, как используется ошибка чтения/записи памяти в pkexec:
gconv)Этот эксплойт злоупотребляет тем, как GLib обрабатывает преобразование символов при попытке вывести сообщение об ошибке. Для этого первым шагом является создание определённой структуры каталогов, которая будет служить для GLib локальным хранилищем модулей преобразования GCONV.
Ключ к уязвимости — внедрение переменной окружения GCONV_PATH с использованием записи за границы массива, вызванной состоянием argc == 0 в pkexec. Таким образом программа принуждается к использованию аномальной кодировки символов, что указывает GLib на необходимость поиска модулей преобразования символов в контролируемом каталоге, созданном на предыдущем шаге.
.so)Для выполнения нашего кода необходимо скомпилировать общую библиотеку (shared object или .so). Когда pkexec попытается обработать кодировку символов, которую не сможет найти, он загрузит эту библиотеку из нашего поддельного каталога gconv. Поскольку pkexec является бинарником с установленным SUID-битом (он выполняется от имени root), при загрузке этой библиотеки наш код получит root-привилегии, получив полный контроль над системой (например, открыв root-оболочку).
gconv-modulesНаконец, в этом локальном каталоге необходимо создать конфигурационный файл gconv-modules. Этот файл действует как индекс: он сообщает GLib, какую конкретную библиотеку (.so) нужно загрузить для преобразования запрошенной конкретной кодировки символов. Этот файл связывает преобразование, запрашиваемое pkexec, с общей библиотекой, созданной на шаге 3.
В проекте есть Makefile для автоматизации компиляции C-бинарника и очистки окружения.
Для компиляции проекта: $ make
Для очистки созданных файлов (временных, папок и бинарников): $ make clean