
Реализация copyfail на Bash (CVE-2026-31431)
Никаких гонок. Никаких смещений. Никакого предварительно собранного бинарника, которому нужно слепо доверять.
Реализация CVE-2026-31431 (Copy Fail) на bash. Скрипт компилирует минимальный вспомогательный код на C в рантайме. Слой bash отвечает за определение архитектуры, декомпрессию полезной нагрузки и выбор цели; слой C выполняет непосредственное взаимодействие с ядром (сокеты AF_ALG, splice, sendmsg), которое bash самостоятельно не может осуществить.
Подробный технический разбор см. на copy.fail.
Ошибка находится в algif_aead — интерфейсе сокетов AF_ALG AEAD ядра. Оптимизация in-place 2017 года позволяет страницам кэша страниц оказаться в записываемом списке рассеяния (scatterlist) операции расшифровки authencesn. Если передать правильные входные данные через splice(), получается детерминированная запись 4 байт в кэш страниц любого читаемого файла, включая setuid-бинарники, которые вам не принадлежат.
Перезаписывая /usr/bin/su шеллкодом по 4 байта за раз и запуская его, можно получить рутовую оболочку. Ни окна гонки, ни специфичных для ядра символов, ни повторных попыток.
chmod +x copyfail.sh
# Проверка уязвимости системы перед выполнением
./copyfail.sh -c
# Запуск эксплойта (не от root)
./copyfail.sh
# Указание другой setuid-цели
./copyfail.sh -t /usr/bin/passwd
# Вывод всех setuid-root кандидатов в системе
./copyfail.sh -s
Эксплойт перезаписывает только кэш страниц в памяти, файл на диске не трогается. Перезагрузка всё восстанавливает. Если нужно немедленно привести всё в порядок:
# Внутри рутовой оболочки
/usr/bin/su --version # всё ещё работает с диска, если кэш страниц вытеснен
# Или просто перезагрузиться
Если вы использовали -t с чем-то отличным от su, ситуация та же. Только кэш страниц, диск чист.
gcc для компиляции встроенного вспомогательного кода на Cpython3 для декомпрессии шеллкода (одна строка, пакеты не нужны)algif_aead, authencesn, hmac, cbcЕсли алгоритм недоступен:
sudo modprobe algif_aead authencesn hmac cbc
Некоторые дистрибутивы содержат блокировку в /etc/modprobe.d/ в качестве временного обходного решения. Если она есть, удалите её:
sudo rm /etc/modprobe.d/disable-algif{_,-}aead.conf 2>/dev/null
нижняя граница: torvalds/linux 72548b093ee3 август 2017, v4.14
(переработка iov_iter в AF_ALG,
которая ввела примитив записи
файловой страницы через splice
в scatterlist AEAD)
верхняя граница: torvalds/linux a664bf3d603d апрель 2026, mainline
(откат оптимизации in-place 2017;
исходный и целевой scatterlists
теперь разделены, страницы кэша
страниц больше не могут оказаться
записываемым криптовыходом)
Между этими двух коммитами: все основные дистрибутивы, которые не применили исправление. Ubuntu, RHEL, SUSE, Amazon Linux, Debian — все были подтверждены уязвимыми на момент раскрытия. Бэкпорты для дистрибутивов начали появляться около 2026-04-29. Чтобы проверить конкретное ядро, найдите a664bf3d603d (или его бэкпорт для дистрибутива) в changelog.
| Архитектура | Статус |
|---|---|
| x86_64 | ✓ |
| aarch64 | ✓ |
| i386 / i686 | ✓ |
| armv7l | ✓ |
Навсегда: обновите ядро.
Обходное решение (блокирует сокет AF_ALG; не затрагивает IPsec/XFRM, который использует крипто API ядра напрямую):
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null
Контейнеры: добавьте seccomp-профиль, блокирующий создание сокетов AF_ALG, и установите allowPrivilegeEscalation: false в контексте безопасности пода. Это включает no_new_privs, что не позволяет ядру учитывать setuid-биты при execve().
| Python | Go | Bash | |
|---|---|---|---|
| Зависимости | python3 | нет (статический бинарник) | gcc + python3 |
| Предварительно собранный бинарник | нет | да | нет |
| Один файл | да | нет | да |
| Этап компиляции | нет | нет | да (встроенная, автоматическая) |
Версия на bash не выигрывает по зависимостям, но это единый скрипт, который можно прочитать целиком перед запуском. Вспомогательный код на C генерируется и компилируется в рантайме из heredoc — нет бинарного блоба для отдельного аудита.
Только для авторизованного тестирования безопасности и исследований. Не запускайте на системах, которыми не владеете или на которые не имеете явного письменного разрешения для тестирования.