
Анализирует CVE-2026-31431 — уязвимость AEAD в AF_ALG ядра Linux, предоставляя безопасный детектор, лабораторный эксплойт для повышения привилегий (LPE) и QEMU-лабораторию с ядрами A/B для проверки.
algif_aead «Copy Fail»: анализИсследование безопасности CVE-2026-31431 (CVSS 3.1 7.8 HIGH,
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H): три компоновочных
дефекта проектирования в цепочке AF_ALG AEAD складываются в
детерминированную, свободную от гонок запись 4 байт в page-cache по любому смещению любого читаемого файла — копия на диске остаётся чистой, поэтому контрольные суммы на диске ничего не видят.
Публичный эксплойт («Copy Fail», Theori/Xint) превращает его в локальный
root (LPE) с помощью 732 байт Python; ошибка присутствовала в каждом ядре
с 2017 по 2026 год.
72548b093ee3 (2017) заставил _aead_recvmsg расшифровывать на месте,
связывая страницы тега запроса в доступный для записи целевой SGL.splice(file → pipe → socket) подаёт в эти слоты тега
страницы page-cache любого читаемого файла (zero copy).authencesn записывает свой 4-байтовый scratch ESN — значение находится в
полезной нагрузки sendmsg — ровно по адресу
, т.е. в первый байт тега: выбранное вами
смещение файла. Это происходит проверки тега, поэтому даже
запрос с выполняет запись.AAD[4..8)dst[assoclen + cryptlen]-EBADMSG| Утверждение | Доказательство |
|---|---|
| Первопричина выведена из коммитов исправления и исходников ядра, а не из блогов | finding-sheet |
| Декодирование публичного PoC проверено end-to-end по последовательности системных вызовов | finding-sheet |
| Лабораторные ядра A/B с дельтой = ровно коммит исправления, оба загружаются | lab/scripts/build.sh + lab/out/ab-diffstat.txt |
Уязвимое ядро выполняет AEAD-расшифровку authencesn через AF_ALG (smoke) | lab/scripts/run.sh vuln → SMOKE=ok |
Откат без сопутствующего коммита вызывает панику в crypto_authenc_esn_decrypt (первоначальная находка) | lab/scripts/run.sh patched → NULL deref, воспроизводимо |
| Безопасный детектор: VULNERABLE на уязвимом (запись срабатывает несмотря на EBADMSG, диск остаётся CLEAN), NOT-DETECTED на полном исправлении | poc/detector.c в лаборатории → строки DETECTOR-RESULT |
| Замыкание LPE в лаборатории: uid 1000 патчит 4 байта page-cache SUID-бинарника и читает root-only флаг; копия на диске доказанно нетронута через чтение debugfs на уровне блоков | poc/lpe.c + lab/rootfs/tools/secretgate.c → LPE-RESULT: ROOT-FLAG-CAPTURED, DISKCLEAN=ok |
| Воспроизведение публичной записи в page-cache в изолированной лаборатории с атрибуцией | вывод детектора выше + lab README |
| SGL-стресс: 5 форм на обоих ядрах — без краха, без зависания ядра (честный отрицательный результат) + два задокументированных отклонения контракта AF_ALG | poc/sgl-stress.c в лаборатории → строки SGL-STRESS |
# сборка трёх ядер + инструментов + пробного диска в Docker (~15 мин при первом запуске)
lab/scripts/build.sh
# загрузка оракула A/B/C (QEMU в Docker, KVM при наличии)
lab/scripts/run.sh vuln # DETECTOR VULNERABLE + LPE ROOT-FLAG-CAPTURED + DISKCLEAN=ok
lab/scripts/run.sh patchedfull # DETECTOR NOT-DETECTED + LPE NOT-VULNERABLE
lab/scripts/run.sh patched # NULL deref в authencesn (разрыв в серии сопутствующих исправлений)
Завершённая цепочка записи в page-cache следует опубликованному подходу
Theori / Xint Code («Copy Fail», авторы, которым приписывается находка) с
атрибуцией — см. раздел prior-art в finding-sheet. Оригинальная работа в этом репозитории: карта механики, привязанная к коммитам исправления; находка неполной серии исправлений (паника authencesn при откате без сопутствующего коммита и её окно в стабильных релизах); безопасный дифференциальный детектор page-cache-против-диска, который никогда не трогает файлы, которые нам не принадлежат; замыкание LPE в лаборатории против специально созданной SUID-цели (secretgate — никакой реальный бинарник никогда не является целью); исследование граничных случаев SGL (честный отрицательный результат плюс два задокументированных отклонения контракта AF_ALG); и верифицированная атрибуция веток всех восьми коммитов исправления.
| Документ | Что это |
|---|---|
| docs/finding-sheet.md | Одностраничный даташит: версии, CVSS, первопричина, коммиты исправления, поверхность атаки |
| docs/report-ptes.md | Отчёт по структуре PTES (7 фаз) с лабораторными доказательствами |
| docs/research-writeup.md | Повествование об исследовании — методология, тупики, переносимые уроки, сравнение с предыдущими работами |
docs/ finding sheet · отчёт PTES · исследовательский writeup
poc/ detector.c (безопасный оракул) · lpe.c (LPE в лаборатории) · sgl-stress.c (исследование SGL)
lab/ Лаборатория ядер QEMU: 5.15.203 ± исправление (A/B) + пост-сопутствующий 5.15.y (C)
lab/rootfs/ secretgate.c — специально созданная SUID-цель (единственное, что когда-либо атакуется)
72548b093ee3 «crypto: algif_aead - copy AAD from src to dst» (2017)a664bf3d603d «crypto: algif_aead - Revert to operating out-of-place»
(+ 8 стабильных бэкпортов — см. finding-sheet)Образовательный исследовательский артефакт. Запускайте только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение. Уязвимость исправлена — используйте актуальное ядро из стабильных веток 2026 года или новее.