
Многоязычные учебные реализации эксплойтов для CVE-2026-31431, локального повышения привилегий в ядре Linux через модуль algif_aead, с безопасным детектором и руководством по использованию в CTF.
Образовательный репозиторий с реализациями эксплойта Copy Fail на нескольких языках.
Создан и поддерживается @shotafry — потому что читать CVE недостаточно. Нужно его воспроизвести.
Copy Fail — это уязвимость локального повышения привилегий (LPE) в ядре Linux, классифицированная как CVE-2026-31431. Она затрагивает криптографическую подсистему ядра, а именно модуль algif_aead, который управляет операциями аутентифицированного шифрования (AEAD) через сокеты AF_ALG.
Ошибка была внесена в 2017 году в ходе оптимизации модуля authencesn и оставалась незамеченной почти 9 лет, присутствуя практически во всех современных дистрибутивах Linux.
Что делает Copy Fail особенным по сравнению с другими историческими LPE:
| Характеристика | Copy Fail | Типичный LPE |
|---|---|---|
| Требуется гонка (race condition) | ❌ Нет | ✅ Да |
| Требуется конкретное смещение в ядре | ❌ Нет | ✅ Да |
| Работает во всех дистрибутивах | ✅ Да | ❌ Обычно нет |
| Надёжность | 100% детерминированно | Переменная |
| Изменяет диск | ❌ Нет (только RAM) | Зависит |
Уязвимость была обнаружена Taeyang Lee из исследовательской команды Theori. Полная цепочка эксплойта была разработана командой Xint Code Research, которая задокументировала процесс, используя анализ с помощью ИИ подсистемы crypto/ ядра Linux.
Публичное раскрытие включает рабочий PoC, полный технический анализ и документацию на copy.fail.
CVE: CVE-2026-31431
CVSS: 7.8 — ВЫСОКАЯ
Вектор: Локальный
Воздействие: Полное повышение привилегий (root)
Дистрибутивы: Все дистрибутивы Linux с ядром >= 2017 без патча
CVSS равен 7.8 и не достигает критического (9+) только потому, что требует предварительного локального доступа — атакующий уже должен иметь сессию в системе. В облачных средах и с контейнерами Docker это требование выполнить значительно проще, чем кажется.
Ядро Linux хранит в RAM файлы, которые недавно читались. Это называется page cache. Когда процесс читает /etc/passwd, ядро не обращается к диску — оно отдаёт копию из RAM. Это быстрее, но создаёт поверхность атаки: если можно изменить эту копию в RAM, не трогая диск, система увидит поддельные данные.
Модуль algif_aead позволяет выполнять операции AEAD из пользовательского пространства через сокеты AF_ALG. Баг находится в оптимизации, внесённой в 2017 году: когда splice() используется для передачи страниц файла в сокет, эти страницы page cache попадают в список рассеивания назначения (записываемый) криптографической операции.
Результат: любой пользователь без привилегий может записать 4 контролируемых байта в любой файл, который он может читать, не касаясь диска.
Пользователь без привилегий
│
▼
Открывает сокет AF_ALG (authencesn)
│
▼
sendmsg() — параметры AEAD с нашими 4 байтами в seqno_lo
│
▼
splice() — файл → pipe → сокет op
[БАГ] Page cache файла попадает в scatterlist назначения
│
▼
recv() запускает операцию AEAD
Аутентификация не проходит (EBADMSG), но scratch-write уже произошёл
│
▼
/etc/passwd (page cache) теперь показывает: пользователь → UID 0
│
▼
su <пользователь> → PAM проверяет реальный пароль → setuid(0) → ROOT
Представь, что у ядра есть книга регистрации замка (/etc/passwd). Copy Fail — это как обнаружить, что если открыть магическую мастерскую замка в очень конкретном порядке, книга регистрации случайно остаётся на твоём рабочем столе — и ты можешь изменить своё звание с «рядового солдата» на «короля» одной ручкой. Архивариус (PAM) проверяет твой пароль, но не проверяет оригинальную книгу, только копию, которая перед ним. Ты король.

>= ~2017 без патча CVE-2026-31431algif_aead доступен и загружаемЭто можно пропустить и сразу попробовать один из эксплойтов, но это также допустимо, если мы не хотим рисковать загрузкой или созданием их и хотим просто посмотреть, работает ли это, но у эксплойтов есть своя функция для проверки, уязвима ли система.
# Посмотреть версию ядра
uname -a
# Проверить, доступен ли алгоритм
grep -i authencesn /proc/crypto
# Проверить, загружен ли модуль
lsmod | grep alg
Если grep -i authencesn /proc/crypto возвращает authencesn(hmac(sha256),cbc(aes)), система уязвима.
| Язык | Требование на цели | Предварительная компиляция |
|---|---|---|
| C | Нет (статический бинарник) | gcc на машине компиляции |
| Python | Python 3.10+ | Нет |
| Rust | Нет (статический бинарник) | rustc на машине компиляции |
| Go | Нет (статический бинарник) | go на машине компиляции |
| Ruby | Ruby + gem fiddle (включён по умолчанию) | Нет |
| Perl | Perl 5 (включён практически во всех Linux) | Нет |
Этот репозиторий содержит эксплойт, реализованный на 6 языках, все функционально эквивалентны, с образовательными комментариями на испанском.
copy_fail_exploit.c → C — статический бинарник, ноль зависимостей
copy_fail_exploit.py → Python — более читаемый, идеален для изучения
copy_fail_exploit.rs → Rust — ирония: «безопасный» язык эксплуатирует ядро
copy_fail_exploit.go → Go — статический бинарник, очень портативный
copy_fail_exploit.rb → Ruby — повсеместно на серверах Rails
copy_fail_exploit.pl → Perl — самый тихий, есть в каждом Linux
test_cve_2026_31431.py → Детектор — проверяет уязвимость без эксплуатации
python3 test_cve_2026_31431.py
# Компиляция
gcc copy_fail_exploit.c -o copy_fail_c
# Dry-run (очищает при выходе, не оставляет следов)
./copy_fail_c
# Полный эксплойт
./copy_fail_c --shell
# Dry-run
python3 copy_fail_exploit.py
# Полный эксплойт
python3 copy_fail_exploit.py --shell