
CVE-2021-3560 — эксплойт повышения привилегий Polkit через состояние гонки в accounts-daemon D-Bus
CVE-2021-3560 — это локальная уязвимость повышения привилегий в Polkit (ранее PolicyKit) — фреймворке авторизации, используемом в Linux-окружениях рабочего стола. Локальный непривилегированный злоумышленник может использовать состояние гонки в D-Bus-интерфейсе accounts-daemon, чтобы создать привилегированного пользователя, задать ему пароль и в итоге получить доступ root.
accounts-daemon (org.freedesktop.Accounts) — это системный D-Bus-сервис, который управляет учётными записями пользователей (создание, удаление, смена пароля и т. д.). Он предоставляет такие методы, как:
| Метод | Действие |
|---|---|
CreateUser | Создаёт нового системного пользователя |
SetPassword | Устанавливает пароль пользователя |
DeleteUser | Удаляет пользователя |
Эти операции требуют авторизации. Когда поступает D-Bus-вызов, Polkit находится между вызывающей стороной и accounts-daemon:
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
Polkit решает, есть ли у вызывающей стороны разрешение, и если да — передаёт запрос в accounts-daemon для выполнения.
Уязвимость представляет собой гонку типа TOCTOU (Time Of Check, Time Of Use). Вот ключевая идея:
accounts-daemon (например, CreateUser).accounts-daemon завершит обработку, — создание пользователя проходит без надлежащей аутентификации, однако запись о пользователе оказывается неполной (например, без пароля, без домашнего каталога).SetPassword для только что созданного (но не аутентифицированного) пользователя, либо само неполное состояние предоставляет повышенные привилегии.Короче говоря: убейте запрос в нужный момент — и вы обойдёте аутентификацию.
Этот скрипт exploit.sh автоматизирует всю цепочку атаки:
# Clone the repository
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# Make the exploit executable
chmod +x exploit.sh
# Run it
./exploit.sh
После завершения эксплойта вы получите root-оболочку:
whoami
# root

| Компонент | Затронут |
|---|---|
| polkit | ≤ 0.119 (без исправления) |
| accounts-daemon (accountsservice) | Все версии, использующие уязвимый polkit |
Уязвимость исправлена в polkit 0.120 и более поздних версиях.
Дистрибутивы с исправлением (неполный список):
Этот репозиторий предназначен только для образовательных целей и авторизованных исследований безопасности. Не используйте этот эксплойт на системах, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Автор не несёт ответственности за неправомерное использование.
| Шаг | Действие |
|---|
| 1. Калибровка времени | Использует фиктивный вызов CreateUser("nobody") для измерения времени полного D-Bus-цикла и вычисления «окна убийства» |
| 2. Создание пользователя | Отправляет вызов CreateUser для выбранного имени пользователя, запускает его в фоне, ждёт вычисленное окно, затем убивает его — эксплуатируя гонку для создания неавторизованного пользователя |
| 3. Установка пароля | Когда пользователь существует (в неполном состоянии), отправляет вызов SetPassword с той же техникой гонки, чтобы назначить известный пароль |
| 4. Повышение привилегий | Использует su для переключения на нового пользователя, запускает sudo (который работает, потому что пользователь был создан через обойдённый путь авторизации), копирует /bin/bash в /var/tmp/bash с SUID root и запускает root-оболочку |