DirtyClone: четвёртый удар по ядру Linux через грязный фрагмент

Локальное повышение привилегий до root без следов в файлах и без записей в аудите — CVE-2026-43503 стал четвёртой уязвимостью семейства DirtyFrag. Механизм стар как сама сетевая подсистема, но в 2026 году исследователи нащупали способ превратить zero-copy оптимизацию сетевого стека в примитив записи в файловый кэш.
Суть в одном бите — SKB_FRAG_PAGE_SHARED. Когда фрагмент сетевого пакета (skb) ссылается на страницу памяти, ядро ставит флаг «shared-with-a-file». Эта пометка запрещает коду обращаться с такой страницей как с эксклюзивным буфером для записи. Два хелпера — __pskb_copy_fclone() и skb_shift() — теряют флаг при копировании. Для сетевого стека потеря одного бита не катастрофа, для атакующего — входная точка.
Эксплойт строится на связке file-backed памяти и IPsec. Атакующий сначала заставляет ядро положить в page cache страницы /usr/bin/su (или любого другого setuid-бинарника). Затем эти страницы привязываются к skb — сетевой буфер ссылается прямо на файл в дисковом кэше. Через уязвимый хелпер делается клон пакета, и в процессе снимается флаг «shared». Ядро теперь считает память эксклюзивной — туда можно писать. Дальше пакет прогоняется через loopback IPsec-туннель под контролем атакующего. ESP-дешифрование делает in-place запись прямо в буфер «эксклюзивного» пакета. Перезаписывается кусок логики проверки пароля в /usr/bin/su. Файл на диске не тронут — изменение существует только в page cache. Любой следующий вызов su запускает модифицированный код и даёт root без следа в tripwire, AIDE или auditd. После перезагрузки бинарник возвращается к оригиналу, кэш перестраивается.
Предыдущие CVE серии прокладывали дорогу. В конце апреля 2026 года раскрыли Copy Fail (CVE-2026-31431) — модуль algif_aead давал запись 4 байт в page cache. 13 мая появилась Fragnesia (CVE-2026-46300) — она обошла первый патч DirtyFrag через потерю флага в skb_try_coalesce(). 16 мая исследователь Hyunwoo Kim отправил расширенный патч, закрывающий все оставшиеся места передачи фрагментов. 21 мая коммит 48f6a5356a33 попал в mainline. 23 мая присвоили CVE-2026-43503, 24 мая фикс ушёл в Linux v7.1-rc5, а 25 июня JFrog Security Research опубликовала рабочий эксплойт — впервые публично для этого варианта.
Работает не везде. Главное требование — CAP_NET_ADMIN для настройки loopback IPsec-туннеля. В Debian, Fedora и Ubuntu до 24.04 такой капитейншн получается штатно: анпривиледжные user namespaces включены по умолчанию, локальный пользователь создаёт неймспейс и получает CAP_NET_ADMIN внутри него. Дальше настраивается IPsec — и путь к root открыт. Ubuntu 24.04+ перекрыл маршрут по умолчанию: AppArmor блокирует создание анпривиледжных userns, переменная kernel.unprivileged_userns_clone ограничена. Важная особенность — page cache существует на уровне всего хоста. Если контейнер или неймспейс получил привилегии внутри себя, модификация page cache затронет все процессы на машине. В мультитенантных серверах, CI-раннерах, контейнерных хостах и кластерах Kubernetes с недоверенными пользователями это критично.
У патча видна попытка выйти за рамки одной функции. Были закрыты __pskb_copy_fclone, skb_shift и «другие хелперы передачи фрагментов, где тот же флаг мог потеряться». Это не фикс одного бага — это фикс контракта: любой код, двигающий фрагменты skb, обязан сохранять байт флагов в skb_shinfo()->flags. Потеря одного бита в любом месте превращает zero-copy в write primitive. Бэкпорты ушли в Stable и LTS, бюллетени выпустили Ubuntu, Debian, SUSE и Red Hat (через Bugzilla).
Если обновление невозможно, есть два обходных пути и оба с ценой. sysctl -w kernel.unprivileged_userns_clone=0 отрезает дефолтный маршрут эксплойта — но ломает container-рантаймы, зависящие от анпривиледжных неймспейсов. В других дистрибутивах это user.max_user_namespaces. Чёрный список модулей (modprobe.blacklist=esp4,esp6,rxrpc) убивает IPsec полностью и работает только там, где модули собраны как =m, а не вкомпилированы в ядро (=y).
JFrog, Hyunwoo Kim и мейнтейнеры ядра — три стороны процесса. Исследовательская работа за авторством одного человека закрыла сразу несколько мест, через которые можно было бы зайти в тот же класс багов. JFrog свела всё в рабочий эксплойт-демо и подтвердила срабатывание на Debian, Ubuntu (без блокировки неймспейсов) и Fedora.
Самая неприятная часть истории — впереди. Принцип «класс DirtyFrag, скорее всего, не закончен» остаётся в силе. Любая функция, перемещающая дескрипторы фрагментов без пропагации shared-флага, — кандидат в новый CVE. Для аудита это значит ревизию каждого пути, касающегося skb_shinfo()->flags при передаче фрагментов. Особый интерес для будущих раундов — модули esp4, esp6 и rxrpc. Они уже фигурировали в контексте эксплойта и обходного пути, и через них же, вероятно, пойдут вариации на тему, когда очередной исследователь доберётся до следующего клона пакета.


Новое на сайте

Ссылка