Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
copy_fail — Эксплойт PoC на Rust для LPE CVE-2026-31431 в ядре Linux (запись в page-cache через AF_ALG), а также защита на этапе выполнения с помощью eBPF, блокирующая создание сокетов AF_ALG через LSM или kprobe без перезагрузки. | Kitploit
Инструменты/GitHubGitHub/spensercai/copy_fail
Оборонительные ИнструментыПовышение привилегийФреймворки для эксплойтовАнализ уязвимостейЭксплуатацияВиртуализация для безопасностиЭксплуатация Бинарных Файлов
GitHubspensercai/copy_fail

copy_fail

Эксплойт PoC на Rust для LPE CVE-2026-31431 в ядре Linux (запись в page-cache через AF_ALG), а также защита на этапе выполнения с помощью eBPF, блокирующая создание сокетов AF_ALG через LSM или kprobe без перезагрузки.

Репозиторий
3335 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Сайт
Поделиться

Copy Fail — CVE-2026-31431

CVE-2026-31431 (Copy Fail) — это локальная уязвимость повышения привилегий в модуле algif_aead ядра Linux (подсистема AF_ALG). Логическая ошибка, внесённая в августе 2017 года, позволяет любому непривилегированному локальному пользователю записать 4 контролируемых байта в page cache любого читаемого файла через AF_ALG + splice(), а затем выполнить повреждённый setuid-бинарник для получения root. Эксплойт детерминированный — без гонок, без офсетов ядра, без краха системы. Он затрагивает все основные дистрибутивы Linux с ядрами от 4.14 до 7.0-rc.

CVSS: 7.8 | Исправлено в: ядро 7.0, 6.19.12, 6.18.22 | Исправление в mainline: коммит a664bf3d603d

Источники: copy.fail, The Hacker News, уведомление CloudLinux

Структура проекта

crates/
├── exp/                            # Эксплойт PoC (реализация на Rust)
├── copy_fail_guard/                # Пользовательский загрузчик eBPF — режим LSM
├── copy_fail_guard-ebpf/           # Программа eBPF LSM (не в workspace)
├── copy_fail_guard_kprobe/         # Пользовательский загрузчик eBPF — режим kprobe
└── copy_fail_guard_kprobe-ebpf/    # Программа eBPF kprobe (не в workspace)
scripts/
└── build_guard.sh                  # Сборка в один клик → вывод в dist/

Обзор уязвимости

Корневая причина — цепочка из трёх независимых функций ядра, небезопасно взаимодействующих друг с другом:

  1. Сокет AF_ALG — открывает крипто-API ядра непривилегированному пользовательскому пространству
  2. splice() — передаёт данные файла с нулевым копированием как ссылки на page cache (не копии) в scatterlist криптоподсистемы
  3. AEAD-шаблон authencesn — использует выходной буфер вызывающего как временное пространство, записывая 4 байта по адресу dst[assoclen + cryptlen]

В 2017 году оптимизация на месте в algif_aead.c (72548b093ee3) сделала req->src == req->dst, связав страницы page cache с доступным для записи выходным scatterlist. Когда authencesn записывает свои временные байты, он выходит за пределы выходного буфера в связанные страницы page cache. Атакующий контролирует:

  • Какой файл: любой файл, читаемый текущим пользователем
  • Какой офсет: определяется офсетом splice, длиной splice и assoclen
  • Какие 4 байта: берутся из байтов AAD 4–7 (seqno_lo), задаваемых в sendmsg()

Повреждённая страница никогда не помечается как грязная — файл на диске не затрагивается, но execve() читает из page cache. Повредите setuid-бинарник → root.

crates/exp — Эксплойт PoC

Реализация на Rust публичного PoC на Python объёмом 732 байта. Нацелен на /usr/bin/su, вставляет его страницы page cache в AEAD-сокет AF_ALG и перезаписывает их сжатой shell-нагрузкой.

Сборка

Требуется Rust 1.85+ (edition 2024).

cargo build --release -p copy_fail

Бинарник только для Linux. На других платформах он завершается с ошибкой Unsupported.

Запуск

Предупреждение: Это эксплуатирует реальную уязвимость ядра. Запускайте только на системах, которыми вы владеете и управляете, в идеале — на одноразовой виртуальной машине.

  1. Загрузите ВМ с уязвимым ядром (любой массовый дистрибутив с ядром < 7.0 / < 6.19.12 / < 6.18.22).

  2. Скопируйте собранный бинарник в ВМ и запустите его от непривилегированного пользователя:

    ./target/release/copy_fail
    
  3. Уязвимая система: появляется root-шелл (#). Выполните whoami, чтобы подтвердить root.

  4. Не уязвимая система (исправленное ядро): операция AF_ALG завершается ошибкой, или бинарник su ведёт себя нормально. Вы увидите ошибку или обычный запрос пароля su.

Средство защиты — copy_fail_guard

Средство защиты ядра в реальном времени, которое блокирует CVE-2026-31431 без обновления ядра или перезагрузки. Оно использует eBPF для перехвата создания сокетов AF_ALG, отсекая первый шаг эксплойта.

Предоставляются два режима. Загрузчик в один клик автоматически выбирает лучший доступный режим:

Режим LSMРежим kprobe
Как блокируетВозвращает -EPERM (создание сокета запрещено)SIGKILL (процесс убит)
Требования к ядру≥ 5.7 с параметром загрузки lsm=bpf≥ 5.3, без специальных параметров
Нужна перезагрузка для включенияВозможно (если lsm=bpf ещё не задан)Нет
Точка перехватаLSM-хук socket_createkprobe на __sys_socket

Как это работает

┌──────────────────────────────────────────────────┐
│  run_guard.sh                                    │
│  • Определяет поддержку BPF LSM                  │
│  • LSM доступен  → copy_fail_guard (EPERM)       │
│  • LSM недоступен → copy_fail_guard_kprobe (KILL)│
└──────────────┬───────────────────────────────────┘
               │
┌──────────────▼───────────────────────────────────┐
│  Программа eBPF                                  │
│  если семейство сокета == 38 (AF_ALG)            │
│     → блокировать (EPERM или SIGKILL)            │
│  иначе                                           │
│     → разрешить                                  │
└──────────────────────────────────────────────────┘

Влияние на систему

Блокировка AF_ALG оказывает почти нулевое влияние на типичные системы:

  • Не затрагиваются: dm-crypt/LUKS, kTLS, IPsec/XFRM, OpenSSL/GnuTLS/NSS (сборки по умолчанию), SSH, криптография keyring ядра — они используют крипто-API ядра напрямую, а не через AF_ALG
  • Потенциально затрагиваются: приложения, явно настроенные на использование AF_ALG (например, OpenSSL с включённым движком afalg, некоторые пути аппаратного ускорения криптографии во встраиваемых системах)
  • Производительность: нулевые накладные расходы для всего, что не вызывает socket(AF_ALG, ...)

Сборка

Сборка в один клик (рекомендуется):

./scripts/build_guard.sh

Это автоматически устанавливает недостающие тулчейны (nightly, bpf-linker), компилирует все программы eBPF и пользовательские загрузчики и выводит всё в dist/:

dist/
├── copy_fail_guard.bpf.o          # Программа eBPF LSM
├── copy_fail_guard_kprobe.bpf.o   # Программа eBPF kprobe
├── copy_fail_guard                 # Пользовательский загрузчик (LSM)
├── copy_fail_guard_kprobe          # Пользовательский загрузчик (kprobe)
└── run_guard.sh                    # Автовыбор: sudo ./run_guard.sh

Скопируйте каталог dist/ на любую целевую машину и выполните sudo ./run_guard.sh для активации защиты.

Ручная сборка (по шагам):

Шаг 1: Скомпилируйте программы eBPF (обязательно на Linux):

# Вариант LSM
cd crates/copy_fail_guard-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

# Вариант kprobe
cd crates/copy_fail_guard_kprobe-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

Шаг 2: Соберите пользовательские загрузчики:

cargo build --release -p copy_fail_guard -p copy_fail_guard_kprobe

Запуск

Рекомендуется — автоматический выбор лучшего режима:

sudo ./dist/run_guard.sh

Вручную — запуск конкретного режима:

# Режим LSM (требуется lsm=bpf)
sudo GUARD_BPF_OBJ=path/to/copy_fail_guard.bpf.o RUST_LOG=info ./copy_fail_guard

# Режим kprobe (работает везде)
sudo GUARD_BPF_OBJ=path/to/copy_fail_guard_kprobe.bpf.o RUST_LOG=info ./copy_fail_guard_kprobe

Нажмите Ctrl-C, чтобы отключить программу eBPF и восстановить нормальное поведение.

Проверка защиты

С запущенной защитой в одном терминале:

# В другом терминале попробуйте эксплойт:
./target/release/copy_fail
# Режим LSM:   "error: Operation not permitted"
# Режим kprobe: "已杀死" / "Killed"

# Или проверьте напрямую через Python:
python3 -c "import socket; socket.socket(38, 5, 0)"
# Режим LSM:   PermissionError: [Errno 1] Operation not permitted
# Режим kprobe: Killed

Текущие ограничения

Скачать инструмент