## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-CTZISME-COPYFAIL-GUARD
# copyfail-guard
   
CLI на Python без зависимостей, который проверяет, выглядит ли Linux-хост подверженным CVE-2026-31431 («Copy Fail») **без запуска эксплойта**. Он также может применить консервативное временное смягчение, когда затронутый компонент загружается как модуль ядра. Поддерживает Debian/Ubuntu, RHEL/Rocky/AlmaLinux, Fedora и SUSE.
root@kitploit:~
pip install copyfail-guard
copyfail-guard
## Предыстория
CVE-2026-31431 — это логическая ошибка в интерфейсе ядра `algif_aead` (AF_ALG AEAD socket), которая позволяет непривилегированному локальному пользователю выполнить контролируемую запись 4 байт в page cache любого читаемого файла, что приводит к повышению привилегий до root. CVSS 7.8, присутствует с ядра 4.14, исправлена в стабильных выпусках начиная с апреля 2026 года. Существует публичный эксплойт, и уязвимость внесена в CISA KEV.
## Почему бы просто не запустить эксплойт?
Некоторые проверки уязвимостей сводятся к «запусти эксплойт и посмотри, сработает ли он». Это не лучшая идея на production-хостах. copyfail-guard использует подход без эксплойта. Он не пытается вызвать ошибку, изменить setuid-бинарники или доказать эксплуатируемость. Вместо этого он проверяет состояние хоста (версию ядра, статус загрузки модуля, конфигурацию modprobe) и сообщает, выглядит ли машина подверженной.
## Что делает этот инструмент
`fix` намеренно минимален — он **не** вызывает ваш менеджер пакетов. Постоянное устранение требует обновления ядра через обычный механизм обновления вашего дистрибутива.
## Установка
root@kitploit:~
pip install copyfail-guard
Или запустите напрямую из клонированного репозитория без установки:
root@kitploit:~
PYTHONPATH=src python3 -m copyfail_guard detect
## Использование
root@kitploit:~
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
### detect (по умолчанию)
root@kitploit:~
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — УЯЗВИМ
Дистрибутив: Ubuntu 24.04.1 LTS (семейство debian)
Ядро: 6.8.0-50-generic (ветка 6.12, исправлено в 6.12.85)
Модуль: algif_aead — загружен как .ko
Смягчение: отсутствует
Рекомендуемые действия:
1. Примените смягчение сейчас:
sudo copyfail-guard fix
2. Обновите ядро для постоянного исправления:
Обновите ядро на этой системе до 6.12.85 или новее (до той версии,
которую поставляет ваш дистрибутив после интеграции исправления CVE-2026-31431), затем перезагрузитесь.
### fix
Всегда сначала просматривайте результат с помощью `--dry-run` перед применением:
root@kitploit:~
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Предварительные проверки (Linux, хост, root)
[skip] Будет записана блокировка modprobe [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Будет предпринята попытка выгрузить algif_aead (сейчас не загружен) [algif_aead]
[skip] Будет добавлена запись аудита [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Предварительные проверки (Linux, хост, root)
[ ok ] Записана блокировка modprobe [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] Выгружен algif_aead [algif_aead]
[ ok ] Добавлена запись аудита [/var/log/copyfail-guard.log]
Следующий шаг для постоянного исправления:
Обновите ядро до версии с исправлением CVE-2026-31431, используя
обычный механизм обновления вашего дистрибутива, затем перезагрузитесь.
Если модуль в данный момент используется, шаг выгрузки может завершиться неудачей. В этом случае постоянное правило modprobe всё равно может быть установлено успешно, и copyfail-guard сообщит о сбое выгрузки как о записи действия с предупреждением, а не будет делать вид, что модуль был удалён.
### JSON-вывод
`--json` выводит структурированный документ в stdout, подходящий для jq, Ansible или SOAR-конвейеров:
root@kitploit:~
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
## Коды выхода
## Вердикты
## Удаление смягчения
После обновления до исправленного ядра используйте подкоманду `reset`, чтобы удалить правило modprobe, установленное командой `fix`:
root@kitploit:~
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Будет удалён /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] Удалён /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
Перезагрузитесь, чтобы algif_aead снова мог загрузиться при необходимости.
`reset` идемпотентен — если файл уже отсутствует, он завершается с кодом 0 и сообщением «нечего делать». Затем перезагрузитесь.
## Примечания
**Контейнеры.** `fix` отказывается работать внутри контейнера, потому что `/proc/modules` отражает ядро хоста, но контейнер не имеет полномочий загружать или выгружать модули. Запускайте copyfail-guard непосредственно на хосте.
**Встроенный`algif_aead`.** Некоторые ядра компилируют `algif_aead` непосредственно в образ (`CONFIG_CRYPTO_USER_API_AEAD=y`). Смягчение через modprobe неэффективно в такой конфигурации; единственное решение — обновление ядра. `detect` сообщает `unmitigable_builtin` в этом случае. Запуск `fix` всё равно установит правило modprobe (которое предотвращает загрузку любой сосуществующей загружаемой копии), но встроенный экземпляр не затрагивается — обновление ядра и перезагрузка являются единственным реальным решением.
**`blacklist` против `install … /bin/false`.** Обе директивы блокируют обычную автозагрузку, но `install algif_aead /bin/false` сильнее, потому что она также блокирует обычные явные вызовы `modprobe algif_aead`. Достаточно привилегированный администратор всё равно может обойти политику modprobe, например, используя низкоуровневые инструменты загрузки модулей или специальные флаги modprobe. copyfail-guard всегда устанавливает более сильную форму. Если в вашей системе уже есть обычная директива `blacklist`, инструмент сообщает `mitigated`, но выводит примечание с рекомендацией обновления.
**SELinux/AppArmor.** Записи в `/etc/modprobe.d/` на RHEL обычно наследуют `system_u:object_r:modules_conf_t:s0` от родительского каталога, поэтому ручная переназначение метки обычно не требуется для файла, который записывает copyfail-guard.
**initramfs.** `algif_aead` обычно не включается в загрузочный образ в основных дистрибутивах, поэтому copyfail-guard не запускает `update-initramfs -u` или `dracut -f` после установки правила modprobe. Если ваш дистрибутив или локальная сборка включает `algif_aead` в initramfs, следуйте рекомендациям вашего дистрибутива по ядру/модулям.
## Лицензия
Apache 2.0 — см. LICENSE.