Уязвимость в Glibc ld.so, позволяющая получить права root в системе

Компания Qualys выявила опасную уязвимость (CVE-2023-4911) в компоновщике ld.so, поставляемом в составе системной Си-библиотеки Glibc (GNU libc). Уязвимость позволяет локальному пользователю поднять свои привилегии в системе через указание специально оформленных данных в переменной окружения GLIBC_TUNABLES перед запуском исполняемого файла с флагом suid root, например, /usr/bin/su.

Возможность успешной эксплуатации уязвимости продемонстрирована в Fedora 37 и 38, Ubuntu 22.04 и 23.04, Debian 12 и 13. Предполагается, что уязвимость проявляется и в любых других дистрибутивах, использующих Glibc. Дистрибутивы на базе системной Си-библиотеки Musl, такие как Alpine Linux, проблеме не подвержены. Уязвимость устранена в патче, добавленном 2 октября. Проследить за выпуском обновлений пакетов в дистрибутивах можно на страницах Debian, Ubuntu, RHEL, SUSE/openSUSE, Fedora, Arch, Gentoo, ALT Linux.

Уязвимость вызвана изменением, внесённым в апреле 2021 года и вошедшим в состав выпуска glibc 2.34.
Из-за ошибки в коде разбора строки, указанной в переменной окружения GLIBC_TUNABLES, некорректная комбинация параметров в данной переменной приводит к записи разобранного значения за пределы выделенного буфера. Проблема проявляется когда вместо штатных последовательностей “name=val”, параметры заданы в форме c двойным присвоением “name=name=val”. В этом случае присвоение обрабатывается дважды, вначале как “name=name=val”, а потом как “name=val”. Из-за подобной двойной обработки образуется результат “name=name=val:name=val”, размер которого превышает размер буфера tunestr.

Исследователями подготовлен стабильно работающий эксплоит, который позволяет получить права root при применении практически с любой программой с флагом suid root. Исключение составляют утилита sudo (меняет значение ELF RUNPATH), утилиты chage и passwd в Fedora (защищены отдельными правилами SELinux) и утилита snap-confine в Ubuntu (защищена отдельными правилами AppArmor). Предложенный метод эксплуатации также не работает в RHEL 8 и RHEL 9, хотя данные ветки и подвержены уязвимости (для атаки требуется создание иного эксплоита). Код эксплоита будет опубликован позднее после повсеместного устранения уязвимости. Проверить подверженность своей системы уязвимости можно ниже указанной командой, которая в случае наличия проблемы завершиться крахом:

env -i “GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=A” “Z=’printf ‘%08192x’ 1′” /usr/bin/su –help

Отдельно отмечается устранение в Glibc ещё двух уязвимостей:

  • CVE-2023-4806 – обращение к уже освобождённой области памяти (use-after-free) в функции getaddrinfo(), проявляющееся когда NSS-плагин реализует только call-back-вызовы “_gethostbyname2_r” и “_getcanonname_r”, но не поддерживает вызов “_gethostbyname3_r”. Для эксплуатации уязвимости DNS-сервер должен вернуть для запрошенного хоста большое число адресов IPv6 и IPv4, что приведёт к краху процесса, вызвавшего функцию getaddrinfo для семейства AF_INET6 при выставлении флагов AI_CANONNAME, AI_ALL и AI_V4MAPPED.
  • CVE-2023-5156 – утечка содержимого памяти при вызове функции getaddrinfo для семейства адресов AF_INET6 с выставленными флагами AI_CANONNAME, AI_ALL и AI_V4MAPPED.

Release. Ссылка here.