
Эксплойт на Rust для CVE-2026-31431 — примитив записи в page-cache ядра Linux через AF_ALG splice, позволяющий повысить привилегии до root путём патчинга /etc/passwd или выполнения шеллкода.
Реализация CVE-2026-31431 (Copy Fail) на Rust — примитив записи в page-cache ядра Linux через AF_ALG splice.
Реализация algif_aead в ядре Linux позволяет непривилегированному пользователю записывать произвольные данные в page-cache любого читаемого файла через системный вызов splice(). AEAD-алгоритм authencesn записывает seqno_lo (контролируемые пользователем байты AAD 4-7) в целевой scatterlist по смещению assoclen + cryptlen, что при объединении со страницами page-cache через splice() приводит к произвольной записи 4 байт. Содержимое на диске остаётся неизменным, но все последующие читатели видят повреждённые данные page-cache.
Затронутые ядра: Linux < 6.12.23, < 6.13.11, < 6.14.2
1. --uid — Изменяет поле UID текущего пользователя на 0000 в /etc/passwd через запись в page-cache. После патча su <username> с вашим паролем открывает root-оболочку. Инструмент пытается очистить page-cache после аутентификации и перед запуском оболочки, что снижает вероятность того, что SSH продолжит видеть учётную запись с UID 0. Изменение пароля root не требуется. Работает для любого 4-значного UID (1000-9999).
2. --escalate — Патчит строку root в /etc/passwd через запись в page-cache: root:x:0:0:root:... → root::0:0:root :.... Поле комментария дополняется пробелами для сохранения одинаковой длины строки. После патча su root работает без пароля.
3. --set-password — Сначала повышает привилегии (удаляет пароль root), затем читает новый пароль из stdin и применяет его с помощью chpasswd.
4. Режим по умолчанию (без флагов) — Перезаписывает page-cache бинарного файла su shellcode-нагрузками, зависящими от архитектуры (x86_64, x86, aarch64), затем выполняет su для получения root-оболочки.
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
Изменения page-cache непостоянны — очистка кэша восстанавливает исходное содержимое на диске:
echo 3 > /proc/sys/vm/drop_caches
Этот проект предоставлен только для авторизованного тестирования безопасности и образовательных целей.
| Флаг | Описание |
|---|
--check | Безопасная предварительная проверка: проверка разрешённой цели su и выход |
--escalate | Патч /etc/passwd в page-cache для удаления пароля root, затем su root |
--set-password | Сначала повышение привилегий, затем чтение нового пароля root из stdin и его применение через chpasswd |
--uid | Изменение UID текущего пользователя на 0 в /etc/passwd, затем su <username> |
--backup <path> | Резервное копирование бинарного файла su перед перезаписью |
--exec <path> | Запуск конкретной команды от имени root после перезаписи |
| ОС | Ядро | Результат |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate пройден, --set-password пройден, --uid пройден |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate пройден, --uid пройден |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, ядро пропатчено |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid пройден |
| Alpine Linux edge | 6.19.12 | Эксплойт запускается, запись в page-cache заблокирована исправлением ядра |