28.11.2021

Уязвимость в Polkit, позволяющая повысить свои привилегии в системе

В компоненте Polkit, используемом в дистрибутивах для организации выполнения непривилегированными пользователями действий, требующих повышенных прав доступа (например, монтирования USB-накопителя), выявлена уязвимость (CVE-2021-3560), позволяющая локальному пользователю получить права root в системе. Уязвимость устранена в версии Polkit 0.119.

Проблема проявляется начиная с выпуска 0.113, но многие дистрибутивы, включая RHEL, Ubuntu, Debian и SUSE, бэкпортировали уязвимую функциональность в пакеты на основе более старых выпусков Polkit (исправления пакетов уже доступны в дистрибутивах).

Проблема проявляется в функции polkit_system_bus_name_get_creds_sync(), получающей идентификаторы (uid и pid) процесса, запрашивающего повышение привилегий. Процесс идентифицируется Polkit через присвоение уникального имени в DBus, которое в дальнейшем используется для проверки привилегий. Если процесс отключается от dbus-daemon перед самым запуском обработчика polkit_system_bus_name_get_creds_sync, то вместо уникального имени обработчик получает код ошибки.

Уязвимость вызвана тем, что возвращённый код ошибки не обрабатывается должным образом и функция polkit_system_bus_name_get_creds_sync() возвращает значение TRUE вместо FALSE, несмотря на то, что не смогла сопоставить процесс с uid/pid и проверить запрошенные для процесса привилегии. Код, из которого была вызвана функция polkit_system_bus_name_get_creds_sync(), считает, что проверка была выполнена успешно и запрос на повышение привилегий поступил от root, а не от непривилегированного пользователя, что даёт возможность выполнить привилегированные действия без дополнительной аутентификации и подтверждения полномочий.

Источник.