Компания Qualys выявила опасную уязвимость (CVE-2023-6246) в стандартной Си-библиотеке Glibc, позволяющую через манипуляции с запуском SUID-приложений добиться выполнения своего кода с повышенными привилегиями. Исследователи смогли разработать рабочий эксплоит, позволяющий получить права root через манипуляцию с аргументами командной строки при запуске утилиты su.
Уязвимость вызвана переполнением буфера в функций __vsyslog_internal(), используемой при вызове функций syslog() и vsyslog(). Проблема возникает из-за ошибки при попытке вывода через макрос SYSLOG_HEADER слишком длинного имени приложения. При попытке расширения буфера с учётом длинного имени возникает сбой, после которого данные записываются в старый буфер изначального меньшего размера.
При организации атаки через утилиту su атакующий может изменить имя процесса при запуске приложения через замену значения argv[0], которое используется для получения информации об имени программы при выводе в лог, и добиться контролируемой перезаписи данных за пределами выделенного буфера. Далее переполнение можно использовать для перезаписи структуры nss_module в библиотеке nss для создания разделяемой библиотеки и её загрузки с правами root.
Проблема проявляется начиная с выпуска glibc 2.37, опубликованного в августе 2022 года и включающего изменение, обрабатывающее ситуацию с попыткой записи слишком больших сообщений. Вносящее уязвимость исправление было бэкпортировано в ветку glibc 2.36 и пакеты дистрибутивов с более старыми версиями glibc, так как отмеченное исправление устраняло уязвимость CVE-2022-39046, приводящую к утечке данных из кучи. Получилось так, что исправление неопасной уязвимости привело к появлению критической проблемы. Примечательно, что о похожей уязвимости в функции vsyslog() из состава библиотеки libc 5.4.3 сообщалось ещё в 1997 году.
Наличие уязвимости подтверждено в Debian 12/13, Ubuntu 23.04/23.10 и
Fedora 37-39. Работа эксплоита для получения непривилегированным пользователем прав root продемонстрирована в полностью обновлённом окружении Fedora 38 со всеми включёнными в конфигурации по умолчанию механизмами защиты. Уязвимость может быть эксплуатирована только локально, так как требует передачи более 1024 байт через параметр argv[0] или аргумент ident в функции openlog().
Исправление уязвимости включено несколько часов назад в кодовую базу Glibc и войдёт в состав завтрашнего обновления Glibc 2.39, наряду с исправлением ещё двух уязвимостей (CVE-2023-6779, CVE-2023-6780) , также затрагивающих код __vsyslog_internal() и приводящих к переполнению буфера. Более того, компания Qualys предупредила о выявлении переполнения буфера в реализации функции qsort(), которое не было отнесено разработчиками Glibc к числу уязвимостей, так как эксплуатация подразумевает использование в качестве аргумента при вызове qsort нетипичной функции сравнения, возвращающей разницу сравниваемых параметров.
Статус устранения уязвимостей в дистрибутивах можно оценить на данных страницах: Debian, Ubuntu, SUSE, RHEL, Fedora, Arch Linux, Gentoo, Slackware. Протестировать подверженность системы уязвимости можно следующей командой: