PDA

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


Suicide
10.01.2019, 15:19
В компоненте systemd-journald, отвечающем за ведение логов в systemd, выявлены (https://seclists.org/oss-sec/2019/q1/54) три уязвимости, позволяющие непривилегированному атакующему повысить свои привилегии в системе и выполнить код с правами root. Уязвимости проявляются во всех дистрибутивах, использующих systemd, за исключением SUSE Linux Enterprise 15, openSUSE Leap 15.0 и Fedora 28/29, компоненты systemd в которых собраны с включением в GCC защиты "-fstack-clash-protection".

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

При написании эксплоита использована техника Stack Сlash (https://www.opennet.ru/opennews/art.shtml?num=46724), суть которой в создании условий когда содержимое переполненной кучи оказывается в области стека или, наоборот, стек может переписать область кучи, что проявляется в ситуациях, когда стек и куча размещаются смежно и прилегают друг к другу (область стека следует сразу за памятью, выделенную под кучу). Предложенный эксплоит подтверждает предположение (https://grsecurity.net/an_ancient_kernel_hole_is_not_closed.php), что защиты от атак класса Stack Сlash на уровне ядра Linux недостаточно. При этом атака успешно блокируется при пересборке в GCC с включенной опцией "-fstack-clash-protection".

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

Для обхода данной защиты из параллельно выполняемого потока systemd-journald было инициировано состояние гонки (https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D 0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8) (race condition), позволяющее успеть захватить управление до краха процесса из-за записи в страницу памяти, доступную только для чтения. В процессе изучения первой уязвимости всплыли ещё две проблемы. Вторая уязвимость CVE-2018-16865 позволяет создать похожие условия наложения стека и кучи через запись очень большого сообщения в файл /run/systemd/journal/socket. Третья уязвимость CVE-2018-16866 проявляется если отправить syslog-сообщение c последним символом ":". Из-за ошибки разбора строки следующий за ним символ конца строки '\0' будет отброшен и в логе окажется кусок буфера за пределами '\0', что позволяет узнать адреса стека и mmap.

Уязвимость CVE-2018-16864 проявляется (https://github.com/systemd/systemd/commit/ae018d9bc900d6355dea4af05119b49c67945184) с апреля 2013 года (появилась в systemd 203), но пригодна для эксплуатации только после изменения (https://github.com/systemd/systemd/commit/ac2e41f5103ce2c679089c4f8fb6be61d7caec07), внесённого в systemd 230 в феврале 2016 года. Уязвимость CVE-2018-16865 проявляется (https://github.com/systemd/systemd/commit/cf244689e9d1ab50082c9ddd0f3c4d1eb982badc) с декабря 2011 года (systemd 38) и доступна (https://github.com/systemd/systemd/commit/c4aa09b06f835c91cea9e021df4c3605cff2318d) для эксплуатации с апреля 2013 года (systemd 201). Проблемы CVE-2018-16864 и CVE-2018-16865 устранены (https://github.com/systemd/systemd/pull/11374)несколько часов назад в master-ветке systemd. Уязвимость CVE-2018-16866 появилась (https://github.com/systemd/systemd/commit/ec5ff4445cca6a1d786b8da36cf6fe0acc0b94c8) в июне 2015 года (systemd 221) и устранена (https://github.com/systemd/systemd/commit/a6aadf4ae0bae185dc4c414d492a4a781c80ffe5) в августе 2018 года (не проявляется в systemd 240). Публикация рабочего эксплоита отложена до выпуска исправлений дистрибутивами. В настоящий момент в дистрибутивах уязвимости пока остаются неисправленными (Debian (https://security-tracker.debian.org/tracker/CVE-2018-16865), Ubuntu (https://people.canonical.com/~ubuntu-security/cve/2018/CVE-2018-16865.html), RHEL (https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16865), Fedora (https://bugzilla.redhat.com/show_bug.cgi?id=1664973), SUSE (https://bugzilla.novell.com/show_bug.cgi?id=CVE-2018-16865)).

10.01.2019

https://www.opennet.ru/opennews/art.shtml?num=49931​