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

24.01.2017 15:14

В 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 (по ошибке передаётся значение "-1"). Проблема присутствует в кодовой базе 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::::::