Уязвимость в Glibc, позволяющая поднять привилегии в системе

В стандартной библиотеке Glibc выявлена уязвимость (CVE-2018-1000001), вызванная переполнением через нижнюю границу буфера в функции realpath(), проявляющимся при возврате относительного пути системным вызовом getcwd(). Изначально ядро Linux возвращало в getcwd() только абсолютные пути, но затем в ядре 2.6.36 поведение было изменено, но функции Glibc не были адаптированы на обработку относительных путей.

Относительные пути возвращаются при достаточно редкой ситуации, когда процесс не меняет текущую директорию после выполнения вызова chroot и путь к корню оказывается вне области текущего дерева каталогов. Начиная с ядра Linux 2.6.36 начальная часть такого пути заменяется на строку «(unreachable)». Непривилегированный пользователь может добиться аналогичного эффекта сменив текущую директорию процесса на путь в другом пространстве имён. Так как в Glibc не производится проверка на спецстроку «(unreachable)», то атакующий может создать каталог «(unreachable)» и использовать его как начало относительного пути. Манипулируя ссылками на предыдущие каталоги при помощи элементов пути «/..//» можно добиться смещения указателя на область до начала выделенного буфера и переписать область памяти перед буфером содержимым части пути.

Выявившие уязвимость исследователи подготовили рабочий прототип эксплоита, позволяющий поднять свои привилегии до прав root через манипуляцию с исполняемыми файлами с флагом suid root, в которых вызывается функция realpath(). В эксплоите используется утилита /sbin/unmount, которая вызывает realpath() в коде инициализации локали, выполняемом до сброса привилегий. Для инициирования появления относительного пути в эксплоите используется пространство имён идентификаторов пользователя, т.е. атака возможна только при активации поддержки «user namespaces» (sysctl kernel.unprivileged_userns_clone=1). Работа эксплоита продемонстрирована в Debian Stretch на системе с архитектурой amd64.

Обновление пакетов с устранением уязвимости уже выпущено для SUSE и openSUSE. Исправление пока недоступно для Ubuntu, Debian, Fedora и RHEL.

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

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

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