В systemd 228 обнаружена локальная root-уязвимость

В systemd 228 выявлена опасная локальная уязвимость, которая позволяет непривилегированному пользователю выполнить свой код с правами root. Выпуск systemd 228 лежит в основе дистрибутива SUSE Linux Enterprise 12 SP2 и также применялся в Ubuntu Touch 15.04. Debian и RHEL проблеме не подвержены, но не исключено, что проблема перенесена в некоторые дистрибутивы, явно не использующие версию 228, в процессе бэкпортирвоания новых возможностей в старые пакеты с systemd.

Уязвимость вызвана тем, что при использовании таймеров systemd выполнение функции touch() приводит к созданию файлов в директории /run, /var/run и /var/lib/systemd/timers/ с правами 07777. Проблема присутствует в кодовой базе systemd только в выпуске 228 и была около года назад без лишней огласки устранена в выпуске 229. В примечании к исправлению указано, что исправленная ошибка может привести к DoS-атаке через исчерпание дискового пространства в разделе через заполнение файла /run/systemd/show-status, созданного с правами 07777. При этом явно данная проблема уязвимостью помечена не была и не выделялась в общем потоке изменений.

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

Так как файлы создаются под пользователем root для успешной атаки необходимо добиться, чтобы systemd сформировал файл с правами 07777, после чего записать в него исполняемый файл. В дальнейшем остаётся просто запустить этот файл. Адаптировав к данной особенности программу для создания setgid-файлов, созданную для демонстрации похожей уязвимости, исследователям удалось успешно провести тестовую атаку, запустив произвольный исполняемый файл под пользователем root.

   $ ls -la /var/lib/systemd/timers/
   -rwsrwsrwt 1 root root  155 18. Jan 11:37 stamp-fstrim.timer

   $ /var/lib/systemd/timers/stamp-fstrim.timer /bin/sh -p

   # grep bin /etc/shadow
   bin:*:15288::::::

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.