Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
WHS4_CVE-2021-4034 — Образовательный PoC и анализ локальной уязвимости повышения привилегий CVE-2021-4034 (PwnKit) в polkit's pkexec, с лабораторией на основе Docker для практического освоения эксплуатации и защиты. | Kitploit
Инструменты/GitHubGitHub/krleejihyeong/whs4_cve-2021-4034
Повышение привилегийАнализ уязвимостейЭксплуатацияCTFТестирование на ПроникновениеОбучение и ОбразованиеЭксплуатация Бинарных ФайловЛаборатории и Практика

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
krleejihyeong/whs4_cve-2021-4034

WHS4_CVE-2021-4034

Образовательный PoC и анализ локальной уязвимости повышения привилегий CVE-2021-4034 (PwnKit) в polkit's pkexec, с лабораторией на основе Docker для практического освоения эксплуатации и защиты.

Репозиторий
142 месяцев назадЕщё не проверено

CVE-2021-4034 (PwnKit) - Локальное повышение привилегий PoC

🔗 Оригинальный проект: berdav/CVE-2021-4034
Этот проект основан на оригинале и является версией, проанализированной и модифицированной в образовательных целях.
Лицензия MIT | Учебное задание White Hat School


📋 Обзор

CVE-2021-4034 — это уязвимость локального повышения привилегий в Linux policykit-1 (PolicyKit). Обычный пользователь может запустить pkexec без аргументов, используя изъяны в структуре памяти процесса, и заставить glib повторно сослаться на строки переменных окружения, которые изначально должны были быть отфильтрованы, что приводит к загрузке вредоносного .so файла и получению root-прав.

⚠️ Только для образовательных целей: этот код следует использовать только в модифицированных системах.
Использование для атак на реальные системы может повлечь юридическую ответственность.


🎯 Краткое описание уязвимости

ПунктСодержание
CVE IDCVE-2021-4034
Название уязвимостиPwnKit
Затронутые версииpolkit 0.105 и более ранние версии без соответствующего патча (тестовая среда: policykit-1 0.105-26ubuntu1 на Ubuntu 20.04)
Тип уязвимостиЛокальное повышение привилегий (LPE)
СерьёзностьКритическая (CVSS 7.8)
Патч версииpolicykit-1 >= 0.105-26ubuntu1.1
Дата обнаруженияИюнь 2021 г. (публичное раскрытие — январь 2022 г.)

Легко ошибиться, думая, что это проблема только Ubuntu. На самом деле это дефект логики самого pkexec, поэтому большинство дистрибутивов, использующих polkit, подвержены этой уязвимости. В таблице выше указана версия Ubuntu 20.04, так как тестовая среда Docker была именно на ней.


🔴 Суть уязвимости

При первом анализе могло показаться, что проблема в отсутствии проверки переменных окружения. Однако при совместном изучении исходного кода и коммита с патчем выясняется, что порядок несколько иной. Настоящая причина кроется в другом, а проблема с переменными окружения — это скорее следствие этой причины. Ниже приведён поток событий в порядке причинно-следственных связей.

1. Что такое pkexec?

pkexec — это SUID-root программа для запроса повышения привилегий через PolicyKit.

# Пример: выполнение команды с root-правами
pkexec /bin/id
pkexec systemctl restart service

Используется обычными пользователями для выполнения определённых задач с правами администратора.


2. Настоящая первопричина: pkexec не обрабатывает случай argc == 0

В функции main() программы pkexec при обработке аргументов командной строки отсутствует проверка случая, когда программа запущена без аргументов (argc == 0). Это и есть истинная отправная точка данной уязвимости.

  • Нормальный запуск: argv = {"pkexec", "команда", NULL} → argc >= 1
  • Атакующий запуск: execve("/usr/bin/pkexec", {NULL}, env) → argc == 0

Когда argc равен 0, в списке argv остаётся только один NULL, обозначающий конец. Однако внутренняя логика pkexec в этой ситуации пытается читать и писать в несуществующий argv[1]. Проблема в том, что Linux при запуске процесса размещает массивы argv и envp (переменные окружения) вплотную друг к другу в памяти. Поэтому argv[1], выходящий за границы массива, на самом деле указывает на envp[0], то есть на первую переменную окружения.

Нормальная ситуация:  argv = [ "pkexec" | NULL ]
Атакуемая ситуация:   argv = [ NULL ]                 ← argc = 0
                    ↑
             Обращение к несуществующему argv[1]
                    ↓
      Чтение и запись envp[0], расположенного в памяти сразу следом (выход за границы)

Почему это опасно:

  • Обычно ld.so перед запуском SUID-программы (pkexec) удаляет опасные переменные окружения, такие как GCONV_PATH, LD_PRELOAD, считая их небезопасными.
  • Однако из-за описанного выхода за границы (OOB) удалённые строки не "восстанавливаются" как переменные окружения, а указатель argv снова может ссылаться на эту строку. То есть значение не оживает, а скорее восстанавливается возможность указателя ссылаться на это значение.
  • Соответствующий коммит с патчем исправляет эту проблему, добавляя проверку, завершающую программу, если argc < 1. (CWE-125 — чтение за пределами, CWE-787 — запись за пределами)

📌 Резюме: "Отсутствие проверки переменных окружения" — это условие, при котором атака возможна, а настоящая первопричина (root cause) — в том, что pkexec не обрабатывает случай argc == 0. Пункт 3 ниже — это следствие этой причины.


3. Следствие: строки, которые должны были быть отфильтрованы, снова становятся доступными

Благодаря OOB-поведению, описанному в пункте 2, в процессе инициализации glib программа pkexec повторно использует эти строки без проверки.

// CVE-2021-4034_exploit.c
char * const env[] = {
    "GCONV_PATH=.",      // изначально должно было быть отфильтровано ld.so
    "CHARSET=PWNKIT",    // несуществующая кодировка
};

execve("/usr/bin/pkexec", args, env);  // argv пуст, создаём argc=0

Проблема:

  • Из-за OOB из пункта 2 эта строка снова становится доступной и попадает в этап инициализации glib.
  • glib не может отличить, является ли это значение нормальной переменной окружения или восстановленной атакующим.

4. Эксплуатация механизма загрузки конвертеров glib

Здесь важно отметить, что glib сам по себе не делает ничего неправильного. Если GCONV_PATH установлен, поиск конвертера по этому пути — это нормальное поведение glib. Проблема в том, что pkexec уже нарушил состояние безопасного выполнения (когда опасные переменные окружения удалены) — glib просто выполняет свою обычную работу, которая и эксплуатируется.

  1. Проверка переменной окружения CHARSET

    CHARSET=PWNKIT
    
  2. Поиск определения конвертера в файле gconv-modules

    module UTF-8// PWNKIT// pwnkit 1
    
  3. Загрузка .so файла из GCONV_PATH

    GCONV_PATH=. → поиск pwnkit.so в текущем каталоге
    
  4. Автоматический запуск функции инициализации .so файла

    // pwnkit.c - автоматически выполняется при загрузке .so файла
    void gconv_init(void *step)
    {
        setuid(0);           // получение root-прав
        setgid(0);
        execve("/bin/sh");   // запуск root shell!
    }
    

    Функцию gconv_init легко назвать "конструктором", но строго говоря, она отличается от C __attribute__((constructor)). Точнее, это функция инициализации, определённая в интерфейсе модуля gconv, которая явно вызывается glib после загрузки .so через dlopen.


5. Полный поток атаки

┌─────────────────────────────────────┐
│ Обычный пользователь (uid=1000)       │
└─────────────────────────────────────┘
          │
          │ 1. Запуск pkexec с пустым argv (argc=0)
          │    + установка вредоносных переменных окружения
          │    GCONV_PATH=.  /  CHARSET=PWNKIT
          ↓
┌─────────────────────────────────────┐
│ Запуск pkexec                         │
│ Отсутствие проверки argc → OOB → повторное использование строк │
└─────────────────────────────────────┘
          │
          │ 2. glib обрабатывает как обычно
          │    Поиск кодировки CHARSET=PWNKIT
          │    Поиск конвертера в GCONV_PATH=.
          ↓
┌─────────────────────────────────────┐
│ Загрузка pwnkit.so                    │
│ (вредоносный .so файл из текущего каталога) │
└─────────────────────────────────────┘
          │
          │ 3. Автоматический запуск функции инициализации gconv (с root-правами!)
          ↓
┌─────────────────────────────────────┐
│ Получение root shell ✅               │
│ uid=0(root) gid=0(root)              │
└─────────────────────────────────────┘

🚀 Быстрый старт

Необходимые требования

  • Docker (или Docker Desktop)
  • git
  • Среда Linux (или WSL 2)

Команды для запуска

Скачать инструмент