Новая уязвимость DirtyDecrypt в ядре Linux позволяет получить права root через страничный кэш

linux

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

Проблема кроется в драйвере RxRPC, который реализует семейство сокетов AF_RXRPC и одноимённый протокол удалённого вызова процедур (RPC), работающий поверх UDP. Именно в этом компоненте была допущена ошибка при проверке размера данных в функции rxgk_verify_response(). Вместо корректного условия "if (auth_len > len)" в коде оказалось "if (auth_len < len)". Такая путаница приводила к тому, что в функцию расшифровки "rxgk_decrypt_skb()" передавались данные с размером, превышающим допустимый. При выполнении этой функции расшифровка осуществлялась с подстановкой изменений напрямую в страничный кэш, чтобы избежать лишней буферизации. Из-за неверной проверки размера возникала возможность перезаписать данные в страничном кэше по произвольному смещению. Именно это и позволяет злоумышленнику модифицировать содержимое исполняемых файлов, которые уже загружены в кэш.

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

Для успешной атаки необходимо, чтобы при сборке ядра была активна опция "CONFIG_RXGK". Проверить это можно командой "grep CONFIG_RXGK /boot/config-$(uname -r)". Кроме того, должен быть доступен модуль ядра "rxrpc.ko" - в некоторых системах он не собирается по умолчанию. Разработчики эксплоита проверили его работу в Fedora, а также предполагают, что уязвимость проявляется в ядрах из Arch Linux и openSUSE Tumbleweed.

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

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

Для системных администраторов и пользователей, которые не могут немедленно обновить ядро, существует обходной путь защиты. Можно заблокировать загрузку модуля ядра "rxrpc" с помощью следующей команды:

Эта мера предотвратит загрузку уязвимого драйвера, но может нарушить работу приложений, использующих протокол RxRPC. Поэтому более правильным решением является установка обновлённого ядра с патчем. Статус исправления в различных дистрибутивах можно отследить на страницах Debian, Ubuntu, SUSE/openSUSE, RHEL, Arch и Fedora.

Уязвимость DirtyDecrypt - очередное напоминание о том, как даже небольшая ошибка в проверке границ может привести к полному компрометации системы. Она также подчёркивает важность осторожного использования оптимизаций, которые обходят стандартные механизмы копирования при записи (COW). Разработчикам ядра стоит уделить особое внимание аудиту всех мест, где расшифровка выполняется непосредственно в страничном кэше без предварительной проверки выделения памяти. Для пользователей же главный вывод - не затягивать с обновлением системы и по возможности применять рекомендованные обходные меры, пока официальный патч не будет установлен.

Ссылки

Комментарии: 0