Уязвимость в 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.

Источник: http://www.opennet.ru/opennews/art.shtml?num=59867