Уязвимость в ld.so OpenBSD

Динамический загрузчик ld.so, входящий в состав OpenBSD, при определённых условиях может для SUID/SGID-приложения оставить переменную окружения LD_LIBRARY_PATH и таким образом позволить загрузить сторонний код в контексте процесса, выполняемого с повышенными привилегиями. Патчи с исправлением уязвимости доступны для релизов 6.5 и 6.6. Бинарные патчи (syspatch) для платформ amd64, i386 и arm64 уже запущены в производство и должны быть доступны для загрузки к моменту публикации данной новости.

Суть проблемы: в ходе работы ld.so сначала извлекает из окружения значение переменной LD_LIBRARY_PATH, с помощью функции _dl_split_path() превращает его в массив строк — путей к каталогам. Если позднее выясняется, что текущий процесс запущен SUID/SGID-приложением, то созданный массив и, собственно, переменная LD_LIBRARY_PATH очищаются. При этом, если в ходе работы _dl_split_path() столкнётся с нехваткой памяти (что трудно из-за наличия явного ограничения на размер переменных окружения в 256 кБайт, но теоретически возможно), то переменная _dl_libpath получит значение NULL, и последующая проверка значения этой переменной заставит пропустить вызов _dl_unsetenv(«LD_LIBRARY_PATH»).

Уязвимость найдена специалистами Qualys, так же, как и несколько ранее раскрытых проблем. Выявившие уязвимость исследователи безопасности отметили оперативность решения проблемы: патч был подготовлен, и обновления выпущены в течение трёх часов после получения уведомления проектом OpenBSD.

Дополнение: Проблеме присвоен номер CVE-2019-19726. В списке рассылки oss-security сделан официальный анонс, включающий прототип эксплоита, работающий в OpenBSD 6.6, 6.5, 6.2 и 6.1 на архитектурах
amd64 и i386 (эксплоит может быть адаптирован и для других архитектур).
Проблема эксплуатируема в установке по умолчанию и позволяет непривилегированному локальному пользователю выполнить код с правами root через подстановку библиотеки при запуске suid-утилит chpass или passwd. Для создания необходимых для эксплуатации условий нехватки памяти используется установка ограничения RLIMIT_DATA через setrlimit.

Источник: opennet.ru

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