
Доказательство концепции, демонстрирующее выход из контейнера в Amazon EKS путем эксплуатации уязвимости Dirty Frag (CVE-2026-43284) — повреждения page-cache ядра через общие слои образов и привилегированные DaemonSets.
Proof-of-concept, демонстрирующий, как обычный, непривилегированный Kubernetes Pod может достичь выполнения кода на уровне узла в Amazon EKS, эксплуатируя уязвимость Dirty Frag — повреждение page-cache ядра Linux — через общие слои образов контейнеров.
Основной примитив атаки: любой привилегированный DaemonSet, разделяющий слои образов с контролируемым атакующим контейнером, может быть использован для побега из контейнера. Данный PoC использует kube-proxy как один конкретный пример, но техника обобщается на любую привилегированную рабочую нагрузку в кластере.
Проверено на Amazon EKS (ядро 6.12.80) — непривилегированный pod записывает [*] success в файловую систему хоста через привилегированный DaemonSet kube-proxy:

Предупреждение: Этот репозиторий опубликован исключительно в образовательных и защитных целях. Используйте его только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
Dirty Frag (CVE-2026-43284) — это уязвимость повреждения page-cache ядра Linux в пути приёма xfrm/ESP. В затронутом пути esp_input() может пропустить skb_cow_data() для нелинейного skb без frag_list, что позволяет crypto_authenc_esn_decrypt() сохранить 4 байта контролируемых атакующим данных в страницу page-cache, доступную через splice().
Файл на диске не изменяется. Повреждённые байты находятся в page-cache ядра и наблюдаются последующими читателями той же закэшированной страницы файла.
Полные подробности об исходной уязвимости см. в V4bel/dirtyfrag.
Атака использует три свойства, которые часто сосуществуют в кластерах Kubernetes:
privileged: true, hostNetwork: true, широкие capabilities и т. д.), которые периодически выполняют бинарные файлы из своих образов.Когда эти условия совпадают, непривилегированный pod может повредить бинарный файл в общем слое образа, а привилегированный DaemonSet на том же узле непреднамеренно выполнит повреждённый бинарный файл со своими повышенными привилегиями — достигая полного выполнения кода на уровне узла.
Цель уязвимости НЕ ограничивается kube-proxy. Любой привилегированный DaemonSet (агенты мониторинга, плагины CNI, сборщики логов, агенты безопасности и т. д.), чей образ контейнера разделяет слои с контролируемым атакующим образом, является жизнеспособной целью.
Этот проект вдохновлён моделью эксплуатации Kubernetes, задокументированной в Copy Fail Kubernetes PoC, но использует другой примитив ядра.
| Свойство | Copy Fail | Dirty Frag |
|---|---|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 |
| Путь в ядре | AF_ALG + splice() | xfrm/ESP + splice() |
| Требование к пространствам имён | Не требуется | Требуются пользовательские пространства имён |
| Основная используемая capability | Нет в исходном контейнере | CAP_NET_ADMIN внутри нового сетевого пространства имён |
| Соответствующий модуль | algif_aead | esp4 |
| Практическое отличие | Не работает, если вектор AF_ALG заблокирован | Актуально, когда AF_ALG недоступен, но ESP и пользовательские пространства имён включены |
Цепочка атаки состоит из трёх этапов: повреждение page-cache, распространение между контейнерами и привилегированное выполнение.
Бинарный файл PoC выполняет следующую последовательность из непривилегированного контейнера:
unshare(CLONE_NEWUSER | CLONE_NEWNET).splice() и специально сформированный ESP-ввод для запуска уязвимого пути ядра.Права на запись в целевой файл не требуются. Файл на диске не изменяется — повреждается только page-cache в памяти.
Контейнерные рантаймы обслуживают чтение из нижних слоёв overlay через page-cache ядра. Если контейнер PoC и kube-proxy разделяют один и тот же файл нижнего слоя, оба наблюдают одни и те же закэшированные страницы.
Образ EKS в этом репозитории построен на основе:
public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023
Эта база выбрана для соответствия слою пользовательского инструментария kube-proxy EKS, используемому в проверенной среде.
Когда kube-proxy в следующий раз выполняет пропатченный бинарный файл семейства iptables, ядро загружает повреждённые закэшированные страницы. Полезная нагрузка PoC монтирует корневое устройство хоста и записывает файл-маркер в /root/res.
Ожидаемое содержимое маркера:
[*] success
┌──────────────────────────────┐ ┌────────────────────────┐ ┌──────────────────────────┐
│ Pod PoC │ │ Page Cache ядра │ │ DaemonSet kube-proxy │
│ непривилегированный контейнер│ │ │ │ привилегированный контейнер│
│ │ │ │ │ │
│ 1. unshare user+net ns │ │ │ │ │
│ 2. установка xfrm SA │ │ │ │ │
│ 3. splice целевого бинарника│────▶│ бинарник общего слоя │────▶│ выполняет пропатченный │
│ через путь ESP │ │ page cache пропатчен │ │ бинарник, полезная │
│ │ │ │ │ нагрузка работает с │
│ │ │ │ │ привилегиями уровня узла│
└──────────────────────────────┘ └────────────────────────┘ └──────────────────────────┘