DirtyDecrypt — очередная уязвимость класса Copy Fail, предоставляющая права root в Linux

В ядре Linux выявлена уязвимость, по аналогии с уязвимостями Copy Fail, Dirty Frag и Fragnesia, позволяющая непривилегированному пользователю получить права root, перезаписав данные в страничном кэше. Уязвимости присвоено кодовое имя DirtyDecrypt (проблема также упоминается под именем DirtyCBC). Доступен прототип эксплоита.

CVE-идентификатор в примечании к эксплоиту не упоминается, указано лишь, что исследователи выявили проблему 9 мая, после чего сообщили об этом разработчикам ядра, которые ответили, что их находка дублирует другой отчёт об уже исправленной уязвимости. Так как патч с исправлением уже включён в ядро исследователи решили опубликовать разработанный ими эксплоит. Судя по описанию внутри эксплоита, в нём используется уязвимость CVE-2026-31635, исправление для которой было принято в ядро в апреле и вошло в состав ветки 7.0.0 и сформированного 18 апреля выпуска 6.18.23. Проблема проявляется начиная с ядра 6.16.

Как и в случае с серией уязвимостей Dirty Frag новая уязвимость присутствует в драйвере RxRPC, реализующем семейство сокетов AF_RXRPC и одноимённый RPC-протокол, работающий поверх UDP. Проблема вызвана ошибкой при проверке размера данных в функции rxgk_verify_response() — вместо проверки «if (auth_len › len)» в коде было указано «if (auth_len ‹ len)», что приводило к передаче в функцию rxgk_decrypt_skb() данных с размером, больше допустимого. При выполнении функции rxgk_decrypt_skb() расшифровка данных осуществлялась с подстановкой изменений напрямую в страничный кэш для исключения лишней буферизации. Из-за неверной проверки размера возникала возможность перезаписи данных в страничном кэше по выбранному смещению.

Эксплуатация уязвимости сводится к чтению файла программы с флагом suid root (для его оседании в страничном кэше) и замене в страничном кэше части кода программы кодом для запуска /usr/bin/sh. Последующий запуск программы приведёт к тому, что в память будет загружен не оригинальный исполнядолжен бытьемый файл с накопителя, а изменённая копия из страничного кэша. В качестве suid-программ в эксплоите предусмотрена возможность использования «/usr/bin/su», «/bin/su», «/usr/bin/mount», «/usr/bin/passwd» и «/usr/bin/chsh».

Для эксплуатации уязвимости при сборке ядра должна быть активна опция CONFIG_RXGK, а для автозагрузки доступен модуль ядра rxrpc.ko (в некоторых системах он не собирается). Статус устранения уязвимостей в дистрибутивах можно оценить на данных страницах: Debian, Ubuntu, SUSE/openSUSE, RHEL, Arch,
Fedora. В качестве обходного пути защиты можно заблокировать загрузку модуля ядра rxrpc:


   sh -c "printf 'install rxrpc /bin/falsen' > /etc/modprobe.d/dirtydecrypt.conf; rmmod rxrpc 2>/dev/null; true"

Дополнительно можно отметить публикацию в списке рассылки разработчиков ядра Linux патчей, полностью отключающих в crypto API (AF_ALG) оптимизации, использующие прямое обращение к страничному кэшу при расшифровке с использованием алгоритмов «skcipher» и «aead». Оптимизации исключают лишнюю буферизацию данных, но создают риски возникновения серьёзных уязвимостей. Предполагается, что их отключение приведёт лишь к незначительному снижению производительности из-за появления дополнительной операции копирования в отдельный буфер. Патчи приняты сопровождающим подсистему crypto API и включены в ветку «cryptodev», в которой развиваются возможности для передачи в основной состав будущих выпусков ядра Linux.

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