30.06.2022

Уязвимости в networkd-dispatcher, позволяющие получить права root

Исследователи безопасности из компании Microsoft выявили две уязвимости (CVE-2022-29799, CVE-2022-29800) в сервисе networkd-dispatcher, получившие кодовое имя Nimbuspwn и позволяющие непривилегированному пользователю выполнить произвольные команды с правами root. Проблема устранена в выпуске networkd-dispatcher 2.2. Информации о публикации обновлений дистрибутивами пока нет (Debian, RHEL, Fedora, SUSE, Ubuntu, Arch Linux).

Networkd-dispatcher применяется во многих дистрибутивах Linux, включая Ubuntu, использующих для настройки параметров сети фоновый процесс systemd-networkd, и выполняет функции сходные с NetworkManager-dispatcher, т.е. занимается запуском скриптов при изменении состояния сетевого соединения, например, применяется для запуска VPN после установки основного сетевого соединения.

Связанный с networkd-dispatcher фоновый процесс выполняется с правами root и принимает сигналы о событиях через шину D-Bus. Информация о событиях, связанных с изменением состояния сетевых соединений, отправляется сервисом systemd-networkd. Проблема в том, что непривилегированные пользователи могут сформировать событие о несуществующем состоянии и инициировать запуск своего скрипта, который будет выполнен с правами root.

Systemd-networkd рассчитан на запуск только системных скриптов-обработчиков, размещённых в каталоге /etc/networkd-dispatcher и не доступных для замены пользователем, но из-за уязвимости (CVE-2022-29799) в коде обработки файлового пути имелась возможность выхода за пределы базового каталога и запуска произвольных скриптов. В частности, при формировании файлового пути к скрипту использовались переданные через D-Bus значения OperationalState и AdministrativeState, в которых не производилась чистка спецсимволов. Атакующий мог сгенерировать собственное состояние, в имени которого присутствовали символы «../» и перенаправить обращение networkd-dispatcher в другой каталог.

Вторая уязвимость (CVE-2022-29800) связана с состоянием гонки — между проверкой параметров скрипта (принадлежность root) и его запуском имелся небольшой промежуток времени, достаточный чтобы заменить файл и обойти проверку на принадлежность скрипта пользователю root. Кроме того, в networkd-dispatcher отсутствовала проверка на символические ссылки, в том числе при запуске скриптов через вызов subprocess.Popen, что существенно упростило организацию атаки.

Техника эксплуатации:

  • Создаются каталог «/tmp/nimbuspwn» и символическая ссылка «/tmp/nimbuspwn/poc.d», указывающая на каталог «/sbin», который используется для прохождение проверки на наличие исполняемых файлов, принадлежащих root.
  • Для исполняемых файлов из «/sbin» создаются файлы с аналогичным именем в каталоге «/tmp/nimbuspwn», например, для файла «/sbin/vgs» создаётся исполняемый файл «/tmp/nimbuspwn/vgs», принадлежащий непривилегированному пользователю, в который помещается код, который желает запустить атакующий.
  • По D-Bus процессу networkd-dispatcher отправляется сигнал с указанием в OperationalState значения «../../../tmp/nimbuspwn/poc». Для отправки сигнала в пространстве имён «org.freedesktop.network1» использовалась возможность подключения своих обработчиков к systemd-networkd, например, через манипуляции с gpgv или epmd, или можно воспользоваться тем, что systemd-networkd не запущен по умолчанию (например, в Linux Mint).
  • После получения сигнала Networkd-dispatcher выполняет построения списка исполняемых файлов, принадлежащих пользователю root и доступных в каталоге «/etc/networkd-dispatcher/../../../tmp/nimbuspwn/poc.d», который на деле ссылается на «/sbin».
  • В момент, когда список файлов получен, но скрипт ещё не запущен, символическая ссылка перенаправляется с «/tmp/nimbuspwn/poc.d» на «/tmp/nimbuspwn» и networkd-dispatcher запустит с правами root cкрипт, размещённый атакующим.

Источник.