
Golang-переписывание эксплойта локального повышения привилегий Copy Fail (CVE-2026-31431), повреждающего кэш страниц для получения root на системах Linux.
732 байта до root на каждом крупном дистрибутиве Linux
CVE-2026-31431 (Copy Fail) — логическая ошибка в криптографическом шаблоне authencesn ядра Linux. Она позволяет непривилегированному локальному пользователю выполнить детерминированную контролируемую запись 4 байт в page cache любого читаемого файла в системе.
CONFIG_CRYPTO_AUTHENC (практически все крупные дистрибутивы с 2017 года)Ошибка объединяет два поведения:
AF_ALG + splice: splice() передаёт страницы page cache по ссылке в scatterlist сокета AF_ALG. Для режима in-place расшифровки AEAD страницы тега (из page cache целевого файла) остаются привязанными к выходному scatterlist через sg_chain().
Запись в scratch-область authencesn: crypto_authenc_esn_decrypt() использует dst[assoclen + cryptlen] (за пределами тега, в страницах page cache) как scratch-пространство для перестановки порядкового номера ESN, записывая 4 байта, контролируемые атакующим, и никогда не восстанавливая их.
Повреждённая страница никогда не помечается как грязная, поэтому файл на диске остаётся неизменным. Но именно page cache в памяти фактически читается — что делает повреждение немедленно видимым во всей системе.
Эксплойт повреждает page cache /usr/bin/su (или любого setuid-бинарника) небольшим шеллкодом, по 4 байта за раз. После всех итераций запуск su выполняет полезную нагрузку и даёт root-оболочку.
python3 exp.py
go run exp.go
go build -ldflags "-w -s" -trimpath -o exp exp.go
tinygo build -o exp exp.go
| Возможность | Подробности |
|---|---|
Этот репозиторий опубликован исключительно в образовательных целях и для защитных исследований. Не используйте этот код на системах, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
| Переносимость |
| Один и тот же скрипт работает на Ubuntu, Amazon Linux, RHEL, SUSE и других — без смещений под каждый дистрибутив |
| Компактность | Python-эксплойт занимает ~732 байта |
| Скрытность | Обходит путь записи VFS; страница никогда не помечается грязной; контрольные суммы на диске не изменяются |
| Кросс-контейнерность | Page cache общий для контейнеров — вектор побега из контейнера (см. часть 2) |