В systemd-journald выявлены три уязвимости, позволяющие получить права root

В компоненте systemd-journald, отвечающем за ведение логов в systemd, выявлены три уязвимости, позволяющие непривилегированному атакующему повысить свои привилегии в системе и выполнить код с правами root. Уязвимости проявляются во всех дистрибутивах, использующих systemd, за исключением SUSE Linux Enterprise 15, openSUSE Leap 15.0 и Fedora
28/29, компоненты systemd в которых собраны с включением в GCC защиты «-fstack-clash-protection».

Уязвимости CVE-2018-16864 и CVE-2018-16865 позволяют создать условия для записи данных вне границ выделенного блока памяти, а уязвимость CVE-2018-16866 даёт возможность прочитать содержимое внешних областей памяти. Исследователями подготовлен рабочий прототип эксплоита, который при помощи уязвимостей CVE-2018-16865 и CVE-2018-16866 позволяет получить права root после примерно 10 минут атаки на системах с архитектурой i386 и 70 минут на системах amd64. Работа эксплоита проверена в Debian 9.5.

При написании эксплоита использована техника Stack Сlash, суть которой в создании условий когда содержимое переполненной кучи оказывается в области стека или, наоборот, стек может переписать область кучи, что проявляется в ситуациях, когда стек и куча размещаются смежно и прилегают друг к другу (область стека следует сразу за памятью, выделенную под кучу). Предложенный эксплоит подтверждает предположение, что защиты от атак класса Stack Сlash на уровне ядра Linux недостаточно. При этом атака успешно блокируется при пересборке в GCC с включенной опцией «-fstack-clash-protection».

Уязвимость CVE-2018-16864 была обнаружена после разбора ситуации, когда передача приложениям, сохраняющим данные в лог через вызов syslog(), большого числа аргументов командной строки (несколько мегабайт) приводит к краху процесса systemd-journald. Анализ показал, что манипулируя строкой с аргументами командной строки можно осуществить управляемое наложение хвоста кучи на начало стека, но для успешной атаки требуется обойти применяемую в ядре технику защиты «stack guard-page», суть которой в подстановке граничных страниц памяти, обращение к которым приводит к генерации исключения (page-fault).

Для обхода данной защиты из параллельно выполняемого потока systemd-journald было инициировано состояние гонки (race condition), позволяющее успеть захватить управление до краха процесса из-за записи в страницу памяти, доступную только для чтения. В процессе изучения первой уязвимости всплыли ещё две проблемы. Вторая уязвимость CVE-2018-16865 позволяет создать похожие условия наложения стека и кучи через запись очень большого сообщения в файл /run/systemd/journal/socket. Третья уязвимость CVE-2018-16866 проявляется если отправить syslog-сообщение c последним символом «:». Из-за ошибки разбора строки следующий за ним символ конца строки » будет отброшен и в логе окажется кусок буфера за пределами », что позволяет узнать адреса стека и mmap.

Уязвимость CVE-2018-16864 проявляется с апреля 2013 года (появилась в systemd 203), но пригодна для эксплуатации только после изменения, внесённого в systemd 230 в феврале 2016 года. Уязвимость CVE-2018-16865 проявляется с декабря 2011 года (systemd 38) и доступна для эксплуатации с апреля 2013 года (systemd 201). Проблемы CVE-2018-16864 и CVE-2018-16865 устранены несколько часов назад в master-ветке systemd.
Уязвимость CVE-2018-16866 появилась в июне 2015 года (systemd 221) и устранена в августе 2018 года (не проявляется в systemd 240). Публикация рабочего эксплоита отложена до выпуска исправлений дистрибутивами. В настоящий момент в дистрибутивах уязвимости пока остаются неисправленными (Debian, Ubuntu, RHEL, Fedora, SUSE).

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

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

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