
Повышение привилегий через race condition в polkit
Повышение привилегий через race condition в polkit.
CVE-2021-3560 — это race condition в polkit, который позволяет неавторизованному локальному пользователю получить права root. Уязвимость существует в том, как polkit обрабатывает ошибки D-Bus при обрыве соединения.
Для определения оптимального тайминга выполните команду:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:testuser string:"Test User" int32:1
В коде используется диапазон от половины real времени ± 0.003.
Почему важен тайминг?
Если убить процесс слишком рано — запрос не успеет отправиться
Если убить слишком поздно — polkit успеет проверить авторизацию и отклонит
Нужно попасть в "золотое окно", когда polkit уже получил запрос, но еще не проверил авторизацию
Как работает эксплойт?
Отправляется D-Bus запрос на создание пользователя с параметром int32:1 (добавление в группу wheel)
Запрос обрывается на середине (race condition)
Polkit не успевает завершить проверку авторизации
D-Bus не может найти отправителя
Polkit неправильно обрабатывает ошибку и присваивает UID = 0 (root)
Пользователь создается без аутентификации
Отправляется запрос на установку пароля для нового пользователя (с тем же таймингом)
Статистика успеха
Пользователь может создаться с 1-2 попыток
Для присвоения пароля требуется больше попыток
100 итераций дают высокую вероятность успеха
Если эксплойт не сработает, попробуйте:
Расширить TIMING_RANGE в коде
Запустить скрипт несколько раз
Убедиться, что вы в SSH-сессии (не в графической)