## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-NONAMEUSEROSINT-HUE-COPYFAIL-SH
# copyfail-sh
> Никаких гонок. Никаких смещений. Никакого предварительно собранного бинарника, которому нужно слепо доверять.
Реализация 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 байта за раз и запуская его, можно получить рутовую оболочку. Ни окна гонки, ни специфичных для ядра символов, ни повторных попыток.
## Использование
root@kitploit:~
chmod +x copyfail.sh
# Проверка уязвимости системы перед выполнением
./copyfail.sh -c
# Запуск эксплойта (не от root)
./copyfail.sh
# Указание другой setuid-цели
./copyfail.sh -t /usr/bin/passwd
# Вывод всех setuid-root кандидатов в системе
./copyfail.sh -s
### Восстановление su после получения оболочки
Эксплойт перезаписывает только кэш страниц в памяти, файл на диске не трогается. Перезагрузка всё восстанавливает. Если нужно немедленно привести всё в порядок:
root@kitploit:~
# Внутри рутовой оболочки
/usr/bin/su --version # всё ещё работает с диска, если кэш страниц вытеснен
# Или просто перезагрузиться
Если вы использовали `-t` с чем-то отличным от `su`, ситуация та же. Только кэш страниц, диск чист.
## Требования
* Linux (ядро 4.11–7.0, см. ниже)
* `gcc` для компиляции встроенного вспомогательного кода на C
* `python3` для декомпрессии шеллкода (одна строка, пакеты не нужны)
* Модули ядра: `algif_aead`, `authencesn`, `hmac`, `cbc`
Если алгоритм недоступен:
root@kitploit:~
sudo modprobe algif_aead authencesn hmac cbc
Некоторые дистрибутивы содержат блокировку в `/etc/modprobe.d/` в качестве временного обходного решения. Если она есть, удалите её:
root@kitploit:~
sudo rm /etc/modprobe.d/disable-algif{_,-}aead.conf 2>/dev/null
## Затронутые ядра
root@kitploit:~
нижняя граница: 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 ядра напрямую):
root@kitploit:~
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()`.
## Сравнение с другими реализациями
Версия на bash не выигрывает по зависимостям, но это единый скрипт, который можно прочитать целиком перед запуском. Вспомогательный код на C генерируется и компилируется в рантайме из heredoc — нет бинарного блоба для отдельного аудита.
## Ссылки
* copy.fail — официальный сайт и статья
* Блог Xint.io — технический разбор
* Исправление ядра — a664bf3d603d
* CVE-2026-31431 — NVD
* Раскрытие oss-security
* badsectorlabs/copyfail-go — реализация на Go (шеллкоды взяты отсюда)
* xeloxa/copyfail-exploit — реализация на Python
## Благодарности
* **Taeyang Lee и Theori / Xint Code** — обнаружение уязвимости и оригинальный PoC
## Отказ от ответственности
Только для авторизованного тестирования безопасности и исследований. Не запускайте на системах, которыми не владеете или на которые не имеете явного письменного разрешения для тестирования.