February 28, 2022

Очевидная ошибка программиста, которую никто не замечал 12 лет, позволяет кому угодно легко стать админом в ОС Linux, Solaris и BSD

Новая уязвимость в компоненте Polkit (pkexec) затрагивает стандартные конфигурации всех крупных дистрибутивов Linux. Брешь, которую разработчики не замечали более 12 лет, позволяет злоумышленнику запросто заполучить права администратора Linux-системы. Машины под управлением Solaris и некоторых BSD-систем также в опасности.

12-летняя уязвимость Polkit

Большинство популярных дистрибутивов Linux в конфигурации по умолчанию содержит уязвимое ПО, с помощью которого злоумышленник может получить права администратора на целевой машине.

Опасная брешь имеется в одном из компонентов Polkit (ранее – PolicyKit), инструментария для предоставления непривилегированным процессам возможности выполнения действий, требующих повышенных прав доступа. Этим компонентом является pkexec – утилита, позволяющая выполнить команду от имени другого пользователя, которым может быть и root (администратор). Ввиду специфической функциональности программы исполняемый файл pkexec принадлежит root и имеет установленный атрибут SUID, что позволяет любому пользователю системы свободно отправлять его на запуск.

По словам Бхарата Джоги (Bharat Jogi), специалиста ИБ-компании Qualys, наличие бреши удалось подтвердить в стандартных конфигурациях дистрибутивов Ubuntu, Debian, Fedora и CentOS. В блоге компании говорится, что другие популярные сборки Linux скорее всего тоже подвержены уязвимости. Не исследованы, но, вероятно, под угрозой находятся Solaris и BSD-системы за исключением OpenBSD.

Уязвимость в Polkit позволяет получить привилегированный доступ в большинстве дистрибутивов Linux

Примечательно, что ошибка присутствует в pkexec с самой ее первой версии, которая вышла в мае 2009 г. Таким образом, уязвимости уже более 12 лет. К счастью для администраторов Linux, ее удаленная эксплуатация невозможна – злоумышленнику необходимо иметь доступ к непривилегированной учетной записи в системе, на которую совершается атака, а вредоносную активность в некоторых случаях можно заметить при анализе логов.

Время принимать меры

Уязвимости присвоены идентификатор CVE-2021-4034 и имя PwnKit, опасность оценена в 7,8 балла из 10 возможных (высокий уровень).

Qualys обнаружила ее еще в ноябре 2021 г., но в соответствии с политикой ответственного раскрытия сперва уведомила о ней разработчиков Polkit и затронутых дистрибутивов. Таким образом, к моменту выхода публикации о бреши вендоры «больших» дистрибутивов успели выпустить патчи. Администраторы машин, работающих под управлением дистрибутивов, в которых проблема еще не была исправлена, могут в качестве временной меры вручную убрать атрибут SUID с pkexec.

Qualys не планирует публиковать эксплойт, однако, по словам представителей ИБ-компании, методика использования уязвимости настолько тривиальна, что различные версии эксплойтов начнут циркулировать в Сети в ближайшие несколько дней и без дополнительной помощи со стороны.

Некоторые технические подробности

Как объясняет Джоги, к возникновению уязвимости привели ошибки программистов, допущенные при написании функции main() утилиты pkexec.

Функция main() является точкой входа в программу. Среди ее аргументов – переменные argc и argv. При запуске программы операционная система помещает в argv перечень всех параметров командой строки, заданных пользователем, argc, в свою очередь, содержит информацию о количестве этих параметров.

В случае с pkexec в функции main() происходит разбор аргументов и производится поиск отправленной на выполнение пользователем программы в файловой системе. Если задан относительный путь (то есть упомянуто название программы без места ее расположения, например, nano вместо /usr/bin/nano), вызывается специальная функция, которая восстанавливает абсолютный путь при помощи анализа переменной окружения PATH, которая в Linux объясняет системе, где нужно искать те или иные исполняемые объекты. Затем осуществляется системный вызов execve() для выполнения программы, вопрос поиска местоположения которой был ранее решен.

Проблема заключается в том, что разработчики неправильно реализовали разбор аргументов функции main(). В результате, упрощенно говоря, даже если pkexec запускается без параметров, код все равно обращается к массиву argv, выполняя в конечном счете как чтение, так и запись за пределами выделенного ему участка памяти.

Важно, что в этой области памяти как раз находится массив envp, содержащий переменные окружения, в том числе PATH. Благодаря этому злоумышленник может при помощи нехитрых манипуляций с именами файлов подменить значение переменной окружения, к примеру, LD_PRELOAD, и заставить систему загрузить разделяемую библиотеку и выполнить ее код с полномочиями root.

В рабочем эксплойте, подготовленном Qualys, осуществляются подмена значения переменной GCONV_PATH, обычно содержащей путь к утилите iconv, которая служит для преобразования текста из одной кодировки в другую. Манипуляции с LD_PRELOAD и другими «небезопасными» переменными окружения на практике не проходят, поскольку динамический компоновщик ld.so устраивают их «зачистку» при запуске программ с атрибутом SUID еще до выполнения функции main().