
Copy Fail - CVE-2026-31431 - Реализация на C для Red Team и авторизованных тестов на проникновение, с усиленной защитой. ⚠️ Правовое уведомление: Этот инструмент предназначен исключительно для авторизованных исследований безопасности, авторизованного тестирования на проникновение и защитного анализа. Используйте только на системах, которыми вы владеете или на которые имеете явное письменное разрешение на тестирование. Несанкционированный доступ к компьютерным системам является незаконным.
Улучшенная реализация на C для операций redteam и авторизованного тестирования на проникновение.
⚠️ Юридическое уведомление: Этот инструмент предназначен исключительно для авторизованных исследований безопасности, авторизованного тестирования на проникновение и защитного анализа. Используйте только на системах, которые вам принадлежат или на тестирование которых вы имеете явное письменное разрешение. Несанкционированный доступ к компьютерным системам является незаконным.
🚀 Основная разработка перенесена на GitLab.
Этот репозиторий активно поддерживается здесь. Для сообщений об ошибках и внесения вклада, пожалуйста, используйте GitLab.
Этот проект представляет собой улучшенный, готовый к эксплуатации порт на C эксплойта локального повышения привилегий CVE-2026-31431 («Copy Fail»), первоначально раскрытого компаниями Theori и Xint 29 апреля 2026 года.
Исходное доказательство концепции было написано на Python и предназначено для демонстрации исследования. Наша реализация превращает его в инструментарий уровня redteam, обладающий:
| Атрибут | Значение |
|---|---|
| Дата раскрытия | 29 апреля 2026 г. |
| Исследователи | Theori (Jinoh Kang, Yonghwi Jin, Seunghyun Lee), Xint |
| Описание | https://copy.fail/ |
| Исходный PoC | theori-io/copy-fail-CVE-2026-31431 (Python) |
| Порт на C (базовый) | tgies/copy-fail-c от Tony Gies |
| Затронутые ядра | Linux 4.14 -- 6.14 (до патча с коммитом a664bf3d603d) |
| Серьёзность | CVSS 7.8 (Высокая) -- локальное повышение привилегий |
Уязвимость находится в подсистеме криптографии AF_ALG ядра Linux. Шаблон AEAD authencesn реализует оптимизацию на месте для расшифровки: когда зашифрованный текст поступает через splice() из кэша страниц файла, ядро повторно использует ту же страницу как для источника, так и для приёмника.
Последовательность атаки:
/usr/bin/su) только для чтенияauthencesn(hmac(sha256),cbc(aes)) через AF_ALGsplice() из кэша страниц целевого файлаexecve() целевого файла -- ядро загружает мутировавшие страницы из кэша, предоставляя полномочия setuid-rootКлючевой момент: индекс (inode) на диске никогда не изменяется. Изменяется только кэш страниц в памяти, что делает судебное обнаружение значительно более сложным по сравнению с традиционными эксплойтами перезаписи файлов.
Этот проект расширяет оригинальное исследование улучшениями, ориентированными на redteam, в девяти модулях.
patch_chunk.c)| Особенность | Оригинал | Наша реализация |
|---|---|---|
| Управление сокетами | Новый сокет на каждый фрагмент | Повторное использование сокета (~60% меньше системных вызовов) |
| Верификация | Нет | mmap + memcmp с автоматическим повтором (3 попытки) |
| Параллельная запись | Только последовательно | Параллельная на основе fork (до 16 процессов) |
| Коды ошибок | Бинарный успех/неудача | Гранулярные: 0=проверено, 1=пропатченное ядро, -1=фатальная |
| Выделение кучи | malloc в горячем пути | Только стек (нет джиттера выделения) |
target_discovery.c)su, sudo, passwd, pkexec, mount, ping и др./snap (нетрадиционные setuid)anti_forensics.c)| Техника | Назначение |
|---|---|
posix_fadvise(POSIX_FADV_DONTNEED) | Пофайловое вытеснение кэша страниц |
echo 3 > /proc/sys/vm/drop_caches | Глобальный сброс кэша (после получения root) |
utimensat() timestomp | Восстановление исходных atime/mtime |
| Самоуничтожение | Перезапись бинарника дроппера нулями перед exec |
| Очистка памяти | volatile обнуление чувствительных буферов |
memfd_exec.c)kworker, anon_inode, eventfd (сливается с /proc/$pid/fd/)stage1.c)| Канал | Скрытность | Скорость | Приоритет запасного варианта |
|---|---|---|---|
| Встроенный | Максимальная | Мгновенно | Последний (воздушный зазор) |
| HTTP напрямую | Средняя | <1с | Первый |
| Системный curl/wget | Низкая | 1-3с | Второй (поддержка HTTPS) |
| DNS TXT | Высокая | Медленно | Третий (обход брандмауэра) |
stage2_template.c)SIGUSR1 (запуск), SIGUSR2 (статус), SIGTERM (завершение)[kworker/N:0] в ps/topproc_hide.c)/proc/$pid/cmdlineSSH_*, AWS_*, TOKEN* и т.д.setsid() + setpgid() для независимости от терминалаsignal_trigger.c)| Режим | Поведение | Сценарий использования |
|---|---|---|
trigger_oneshot() | Сон → запуск → исполнение → выход | «Ударил и убежал» |
trigger_daemon() | Сон → запуск → исполнение → цикл | Постоянный имплант |
trigger_auto() | Сон с таймаутом как запасной вариант | Необслуживаемые операции |
Ожидание с нулевой загрузкой CPU: sigsuspend() вместо циклов опроса.
sleep_jitter.c)