Неделю назад я писал про CVE-2026-31431 - 732 байта Python и ты root. Баг в крипто-подсистеме ядра, через splice() и page cache. Казалось бы - ну нашли, ну пропатчили, живём дальше
А вчера V4bel выкатил DirtyFrag. Два новых бага того же класса. Тот же принцип - через splice() загоняем страницы файла в ядерную криптографию, ядро расшифровывает "на месте" и перезаписывает содержимое прямо в page cache. Только теперь не через AF_ALG, а через два других модуля - ESP (IPsec) и RxRPC
👀 Два пути к root. Выбирай какой нравится
Первый - через ESP. Создаём XFRM-ассоциацию с UDP-инкапсуляцией, засовываем страницы /usr/bin/su в пайплайн через splice(), ядро делает in-place расшифровку и пишет 4 байта куда мы скажем. Повторяем - записываем 192-байтный шеллкод поверх su. Запускаем su - получаем root. Звучит знакомо? Это буквально тот же паттерн, что и Copy Fail, только через другую подсистему. Баг в ядре с января 2017 года
Второй - через RxRPC, и вот тут красиво. Вместо перезаписи бинарника - патчим /etc/passwd. Создаём rxkad-токен с нужным ключом шифрования, ядро через rxkad_verify_packet_1() делает pcbc(fcrypt) расшифровку прямо по странице файла. Три splice-операции с перекрытием - и строка root:x:0:0: превращается в root::0:0:. Пустой пароль. su root, Enter, всё. Причём нужный ключ шифрования подбирается в юзерспейсе - полностью офлайн, без единого обращения к ядру. Один детерминированный триггер в конце. Этот баг с июня 2023 года
Ни одной гонки. Ни одного race condition. Детерминированная логика - настроил параметры, дёрнул расшифровку, page cache перезаписан. Если что-то пошло не так - ядро не падает, можно повторить
Проверено на Ubuntu 24.04, RHEL 10.1, openSUSE Tumbleweed, CentOS Stream 10, AlmaLinux 10, Fedora 44. Компилируется одной строкой:
gcc -O0 -Wall -o exp exp.c -lutil
И вот тут начинается самое интересное - CVE нет. Патча нет. Ни для одного дистрибутива. Потому что кто-то сломал эмбарго до того, как вендоры успели выкатить фиксы. Исследователь связался с linux-distros@openwall, те попросили опубликовать - и он опубликовал. Полный исходник, компиляция, запуск. На момент публикации - zero-day в чистом виде
Что мы имеем. Dirty Pipe в 2022 - page cache через пайпы. Copy Fail неделю назад - page cache через AF_ALG. DirtyFrag вчера - page cache через ESP и RxRPC. Три разных подсистемы, один и тот же баг-класс. Ядро Linux полно мест, где криптооперации делаются «на месте» по данным из splice(). Каждое такое место - потенциальная запись в page cache. Сколько ещё таких мест в ядре - вопрос открытый. Подозреваю - не мало 👀
Митигация прямо сейчас (патча-то нет):
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf
rmmod esp4 esp6 rxrpc 2>/dev/null
Что может сломаться - ESP модули нужны для IPsec VPN. Если у вас site-to-site IPsec или strongSwan - подумайте дважды. RxRPC на Ubuntu загружен по умолчанию, но реально его использует только AFS (Andrew File System). Если у вас нет AFS - смело отключайте
Три года, девять лет. Два бага лежали рядом и ждали. Один исследователь, один эксплойт, один claude, все дистрибутивы. И на момент публикации - ни одного патча. Вот вам и координированное раскрытие