В новый год с новыми старыми уязвимостями! 25 января командой Qualys был опубликован отчет об уязвимости класса memory corruption в утилите pkexec из компонентов Polkit (бывший PolicyKit). Успешная эксплуатация уязвимости может привести к получению root-привилегий у аутентифицированного локального непривилегированного атакующего (Local Privilege Escalation aka LPE). При этом совсем не важно, запущен демон polkit или нет — для эксплуатации важно наличие уязвимого компонента в системе. Центр мониторинга и реагирования на инциденты информационной безопасности Jet CSIRT компании «Инфосистемы Джет» проанализировал доступную информацию об уязвимости и вывел рекомендации по ее обнаружению и устранению. Добро пожаловать под кат!

Polkit (PolicyKit) — это компонент, контролирующий привилегии на уровне системы в Unix-подобных ОС и позволяющий организовать взаимодействие непривилегированных процессов с привилегированными. Иногда его называют «sudo для systemd». Примеры применения polkit: когда пользователь выключает или перезагружает компьютер, управляет беспроводными подключениями, получает доступ к аудио, сканеру и пр.

Следует отметить, что данная уязвимость — CVE-2021-4034 — не первая уязвимость в PolKit. Еще летом прошлого года публиковалась информация о CVE-2021-3560, 7-летнем баге, который позволял обойти проверку учетных данных при D-Bus запросе, предоставляя атакующему root-привилегии. Текущая уязвимость существует с момента создания pkexec (комит c8c3d83 от 2009 г., добавляющий команду pkexec) — SUID root-программы, предоставляющей интерфейс к Polkit и позволяющей исполнять команды от имени другого пользователя или администратора. 

Суть уязвимости

Уязвимость возникает из-за ошибки в коде pkexec, связанной с неправильной обработкой числа аргументов, когда при отсутствии аргументов (т. е. список аргументов argv, который передается системному вызову execve(), пуст) возможно передать и выполнить «небезопасную» переменную в окружение pkexec. Обычно такие «небезопасные» переменные удаляются из окружения SUID-программ с помощью ld.so до выполнения main()-функции, однако данная уязвимость позволяет вновь ввести подобную переменную. При этом, т. к. у pkexec установлен SUID-бит от root, код выполняется от УЗ root.

Влияние уязвимости

Уязвимость может позволить атакующему, который каким-либо образом смог аутентифицироваться на уязвимом узле, поднять свои привилегии до root, получая полный контроль над уязвимой машиной, т. е. очень сильно облегчается компрометация.

Как понять, подвержены ли ваши дистрибутивы уязвимости

Т. к. pkexec уязвим с момента своего появления, для выявления уязвимых систем рекомендуется проверять их на наличие pkexec с помощью одной из следующих команд:

whereis pkexec

which pkexec

ls -la /usr/bin/pkexec

find / -type f -name pkexec

Уязвимы актуальные версии дистрибутивов Debian, RedHat, Centos, Ubuntu, SUSE и др., вероятно, подвержены *BSD- и Solaris-системы. Стоит отметить, что OpenBSD не подвержена уязвимости, т. к. она не пропускает execve-вызов, если число аргументов argc равно 0.

PoC эксплойты

Для уязвимости уже доступен как минимум один PoC в связи с чрезвычайной простотой ее эксплуатации — https://github.com/berdav/CVE-2021-4034.

Как понять, что были попытки эксплуатации уязвимости

В системных журналах (auth.log) могут присутствовать строки вида:

The value for the SHELL variable was not found the /etc/shells file

The value for environment variable […] contains suspicious content.

однако в оригинальном исследовании подчеркивается, что попытки эксплуатации могут не оставлять следов в журналах.

Инструкции по устранению

Для устранения уязвимости необходимо применить последние исправления от производителя. Перечень вендорских бюллетеней приведен ниже:

В случае, если нет возможности установить исправления или же производитель их еще не выпустил, то в качестве workaround можно удалить SUID-бит у pkexec, выполнив следующую команду от имени привилегированного пользователя:

chmod 0755 /usr/bin/pkexec

(для восстановления chmod 4755 /usr/bin/pkexec)

Вместо заключения

В Unix-подобных ОС используется довольно много программ с выставленным SUID-битом для root. Потенциальное наличие уязвимостей в подобном ПО открывает широкие возможности для атакующих, и мы, вероятно, еще увидим новые уязвимости, подобные PwnKit.