
Go-порт PoC для Copy Fail для CVE-2026-31431, уязвимости в authencesn ядра Linux, позволяющей запись 4 байт в page cache через AF_ALG и splice. Включает конвейер сборки для нескольких архитектур и подробную техническую документацию.
Этот репозиторий содержит Go-порт публичного PoC для Copy Fail и воспроизводимый конвейер сборки для многоплатформенных Linux-бинарников.
Copy Fail (CVE-2026-31431) — это логическая ошибка в ядре Linux в authencesn, которая позволяет выполнять детерминированную запись 4 байт в данные page cache, доступ к которым осуществляется через AF_ALG + splice().
Используйте этот проект только в средах, где у вас есть явное разрешение на тестирование. Не запускайте этот PoC против систем, которыми вы не владеете или на проверку которых у вас нет письменного разрешения.
Если вы хотите протестировать немедленно, не собирая из исходников, скачайте релизный бинарник и запустите его:
wget https://github.com/ErdemOzgen/copy-fail-cve-2026-31431/releases/download/v1.0.1/copy-fail-cve-2026-31431_linux_amd64
chmod +x copy-fail-cve-2026-31431_linux_amd64
./copy-fail-cve-2026-31431_linux_amd64
Для других архитектур скачайте соответствующий артефакт со страницы релизов GitHub:
Сборка всех Linux-целей:
make clean build-linux
Сборка и генерация контрольных сумм:
make clean checksums
Выходные бинарники в dist/:
copy-fail-cve-2026-31431_linux_amd64copy-fail-cve-2026-31431_linux_arm64copy-fail-cve-2026-31431_linux_386copy-fail-cve-2026-31431_linux_armv7SHA256SUMSЗапуск по умолчанию:
./copy-fail-cve-2026-31431_linux_amd64
Использование пользовательского пути цели:
./copy-fail-cve-2026-31431_linux_amd64 -target /path/to/binary
Отключение выполнения su после запуска:
./copy-fail-cve-2026-31431_linux_amd64 -spawn-su=false
Вывод метаданных сборки:
./copy-fail-cve-2026-31431_linux_amd64 -version
Если выполнение завершается ошибкой на смещении 0 с сообщением, похожим на:
error: copy chunk at offset 0: splice(pipe->AF_ALG): software caused connection abort
ядро, скорее всего, отклонило уязвимый путь AEAD in-place (например, потому что хост пропатчен для CVE-2026-31431 или algif_aead смягчён/отключён).
Быстрые проверки:
uname -r
grep -E "algif_aead|authencesn" /proc/modules
На исправленных системах ожидается, что этот PoC завершится ошибкой.
Согласно публичному раскрытию, уязвимый путь позволяет непривилегированному локальному пользователю влиять на примитив записи 4 байт в содержимое page cache читаемых файлов при определённых условиях.
Важное эксплуатационное свойство заключается в том, что копия page cache в памяти может расходиться с байтами на диске во время выполнения, что может сделать анализ воздействия нетривиальным для команд, полагающихся только на проверки целостности на уровне диска.
Copy Fail примечателен тем, что был заявлен как:
На высоком уровне проблема находится на пересечении трёх механизмов:
AF_ALG.splice().authencesn.В уязвимой конструкции сегменты, поддерживаемые page cache, могут быть связаны в форму запроса, которая позже получает записи во время обработки алгоритма, нарушая ключевое предположение о том, что изменяются только предполагаемые области назначения.
В документированном пути authencesn использует операции с временным буфером на стороне назначения вокруг обработки раскладки ESN и выполняет запись по смещению за пределами ожидаемого контракта вывода при дешифровании.
В сочетании с настройкой AEAD in-place и цепочечными ссылками на scatterlist эта запись может попасть в память, поддерживаемую page cache, для выбранных атакующим областей.
В раскрытии описывается эволюция из нескольких коммитов:
authencesn возникло в более ранней истории интеграции.AF_ALG добавила достижимость из пользовательского пространства с взаимодействием через splice().algif_aead объединила поток источника и назначения таким образом, что это пересечение стало эксплуатируемым.Ключевой урок — композиционный риск: по отдельности разумные изменения могут стать небезопасными в комбинации.
В публичном описании и PoC описывается следующая последовательность:
AF_ALG для authencesn(hmac(sha256),cbc(aes)).splice() для направления данных файла, поддерживаемых page cache, через путь запроса.Go-реализация в этом репозитории повторяет логику этого публичного PoC для исследований и валидации в авторизованных средах.
Сообщённое исправление возвращает уязвимую операцию AEAD in-place в algif_aead к поведению out-of-place.
Концептуально:
AF_ALG, где это операционно возможно).На основе публичного описания:
| Дата | Событие |
|---|---|
| 2026-03-23 | Отчёт отправлен команде безопасности ядра Linux |
| 2026-03-24 | Первоначальное подтверждение |
| 2026-03-25 | Обсуждение/рецензирование патча |
| 2026-04-01 | Исправление закоммичено в mainline |
| 2026-04-22 | Присвоен CVE-2026-31431 |
| 2026-04-29 | Публичное раскрытие |
Опубликованное исследование приписывает обнаружение анализу подсистем с участием человека и помощью ИИ, сосредоточенному на достижимых из пользовательского пространства путях криптокода и происхождении scatterlist/страниц при splice().
main.go: Go-порт PoC.Makefile: детерминированные цели сборки для нескольких архитектур Linux..github/workflows/build.yml: рабочий процесс CI для сборки и артефактов релизов.Файл рабочего процесса: .github/workflows/build.yml
Триггеры:
mainv*workflow_dispatchПоведение:
make clean checksums.v*.Предлагаемый поток релиза:
git tag v1.0.0
git push origin v1.0.0
| Дистрибутив | Версия ядра |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |