Dirty Frag: новая уязвимость повышения привилегий в ядре Linux через zero-copy
Dirty Frag: цепочка уязвимостей на zero-copy пути ядра Linux, отравляющая page cache через связку xfrm-ESP и RxRPC. Поражает почти все мейнстримные дистрибутивы с 2017 года, позволяет повышение привилегий до root без пароля.
Опять
Честно говоря, не думал, что буду писать еще один пост о повышении привилегий в ядре так скоро.
Прошло всего восемь дней с статьи о Copy Fail. Черный список algif_aead едва успели вбить в терминал, патч еще не остыл — и тут Dirty Frag.
Что еще абсурднее — меры mitigation от Copy Fail абсолютно неэффективны против Dirty Frag. В этот раз атака целит в совершенно другие подсистемы ядра — xfrm-ESP и RxRPC — так что отключение algif_aead не имеет значения.
Dirty Pipe (2022), Copy Fail (2026.04), Dirty Frag (2026.05)… Каждый раз «поражает почти все дистрибутивы с 2017». Знаете, что это значит? Почти десятилетие любой, кто входил в любой непривилегированный аккаунт на вашей системе, имел возможность тихо стать root.
Таймлайн
| Дата | Событие |
|---|---|
| 2017-01 | xfrm-ESP уязвимость введена коммитом cac2661c53f3 (существовала 9 лет) |
| 2023-06 | RxRPC уязвимость введена коммитом 2dc334f1a63a |
| 2026-04-29 | Исследователь Hyunwoo Kim сообщает RxRPC и полный эксплойт |
| 2026-05-07 | Детали уязвимости отправлены в linux-distros с эмбарго 5 дней |
| 2026-05-07 | В тот же день третья сторона публикует детали ESP(xfrm), эмбарго нарушено |
| 2026-05-08 | На момент написания — официального патча нет |
Анализ влияния
| Метрика | Значение |
|---|---|
| Тип | Детерминированная логическая ошибка |
| Успешность | 100% с первого запуска |
| Поражение | Почти все дистрибутивы с 2017 |
| След на диске | Нет — только page cache, исчезает после перезагрузки |
Технические принципы
splice() внедряет ссылку на page cache только для чтения в frag-слот сетевого буфера (skb) → принимающее ядро выполняет in-place криптооперации над frag (src == dst указывают на ту же память) → то, что должно было быть дешифровкой, становится прямой записью (STORE) в read-only page cache → код su заменяется ELF-файлом root-shell.
Уязвимость 1: xfrm-ESP запись в page cache
Функция esp_input() на пути дешифровки IPsec ESP. При определенных условиях обходит Copy-on-Write и пишет прямо в page cache. Атакующий контролирует и куда писать (смещение в файле), и что писать (4 байта через seq_hi).
Требуется CAP_NET_ADMIN — но атакующий может создать user namespace.
Уязвимость 2: RxRPC запись в page cache
Функция rxkad_verify_packet_1() на пути дешифровки Kerberos в протоколе RxRPC. Пишет 8 байт за операцию. Критично: не требует никаких привилегий, и Ubuntu загружает rxrpc.ko по умолчанию.
PoC
Полный эксплойт: github.com/V4bel/dirtyfrag
git clone https://github.com/V4bel/dirtyfrag.gitcd dirtyfrag && gcc -O0 -Wall -o exp exp.c -lutil && ./expИдея: подготовить 192-байтовый минимальный ELF (root-shell), разбить на 48 фрагментов по 4 байта (для xfrm-ESP), зарегистрировать XFRM SA для каждого фрагмента, и каждый раз через splice() запускать in-place запись. После 48 итераций su заменен на root-shell.
Временные меры защиты
Официальных патчей ядра пока нет. Временное решение — выгрузить и заблокировать модули:
sudo sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf"sudo rmmod esp4 esp6 rxrpc 2>/dev/nullОчистить page cache:
echo 3 | sudo tee /proc/sys/vm/drop_cachesГонка вооружений с AI-ускорением
За последние годы AI-инструменты аудита кода позволили исследователям вычищать уязвимости, прятавшиеся почти десятилетие, за часы. Copy Fail был найден AI-инструментом Xint Code за один час. Dirty Frag хоть и найден вручную, но относится к тому же семейству.
Kernel LPE уязвимости перешли с одной в год на одну в месяц, а теперь — одну в неделю?
Пока upstream ядра не пересмотрит парадигму «in-place операций на zero-copy путях», я гарантирую — это не последняя.