
Ansible playbook для обнаружения и применения смягчения параметров ядра для CVE-2026-31431 (Copy Fail) на парках Debian/Ubuntu/RHEL, с обнаружением только для чтения и идемпотентным применением.
Обнаружение и применение смягчения через параметры ядра для CVE-2026-31431 («Copy Fail») на парке машин Debian / Ubuntu / RHEL-family с помощью Ansible.
Эта CVE — локальная уязвимость повышения привилегий в интерфейсе algif_aead
AF_ALG ядра Linux. Любой непривилегированный локальный пользователь — включая
служебные учётные записи, такие как www-data, mysql, или процессы внутри
скомпрометированного через RCE веб-приложения — может за несколько системных вызовов
довести её до root. Ошибка затрагивает все основные дистрибутивы, выпущенные с 2017 года.
initcall_blacklist=algif_aead_init
в командную строку ядра — при запуске с .-e apply_mitigation=trueЧёрный список через командную строку ядра работает как для встроенных (RHEL-family),
так и для модульных (Debian/Ubuntu) конфигураций, в отличие от часто упоминаемого
обходного пути modprobe blacklist algif_aead.
algif_aead_init() — это функция ядра, которая регистрирует алгоритм aead AF_ALG
в подсистеме крипто-сокетов при загрузке. Параметр командной строки
initcall_blacklist=algif_aead_init указывает ядру пропустить этот initcall.
Уязвимый код по-прежнему присутствует в бинарнике ядра, но
socket(AF_ALG, ..., "aead") возвращает ENOENT, поэтому первый системный вызов
эксплойта завершается неудачей. Нет доступной поверхности — нет повышения привилегий.
Когда вендоры выпустят пропатченные ядра и вы перезагрузитесь в них, смягчение больше не нужно, и его можно удалить.
# 1. Обнаружение (только чтение) — формирует отчёт о состоянии по каждому хосту
ansible-playbook -i inventory check_cve_2026_31431.yml
# 2. Сначала примените смягчение на одном хосте (без автоматической перезагрузки)
ansible-playbook -i inventory --limit <ip-or-host> \
-e apply_mitigation=true check_cve_2026_31431.yml
# 3. Перезагрузите этот хост через ваш обычный механизм
# 4. Повторное обнаружение; убедитесь, что «Mitigation active: yes»
# 5. Разверните на остальной парк партиями
Отчёт уязвимого хоста выглядит так:
═══════════════════════════════════════════
Host: 192.168.1.42
Distro: Ubuntu 24.04
Kernel: 6.8.0-60-generic
Mitigation active: no
Mitigation staged: no
═══════════════════════════════════════════
⚠️ 192.168.1.42: CVE-2026-31431 mitigation is NOT active.
Вне рамок этого рецепта. Ручные однострочники:
# Debian / Ubuntu
sudo sed -i 's/ initcall_blacklist=algif_aead_init//' /etc/default/grub
sudo update-grub
sudo reboot
# RHEL family
sudo grubby --update-kernel=ALL --remove-args="initcall_blacklist=algif_aead_init"
sudo reboot
Путь обнаружения строго только для чтения (uname, чтение /proc/cmdline,
чтение /etc/default/grub, grubby --info=ALL). Проверки используют
failed_when: false, чтобы неожиданный вывод никогда не прерывал плейбук.
ignore_unreachable: true означает, что недостижимые хосты получают понятное
предупреждение «UNREACHABLE — treat as VULNERABLE» вместо сбоя запуска.
Путь применения обёрнут в block/rescue, чтобы один проблемный хост никогда
не останавливал остальные. Правка grub идемпотентна и ограничена условием
mitigation_staged, поэтому повторные запуски ничего не меняют.
bash tests/run-checks.sh all
Этапы: lint (yamllint + ansible-lint) → syntax
(ansible-playbook --syntax-check) → dry-run (выполняет плейбук в
режиме --check против localhost с -c local, оба пути — обнаружение и
применение). Тот же скрипт вызывается матрицей GitHub Actions на
контейнерах debian:12, ubuntu:22.04, ubuntu:24.04 и almalinux:9
при каждом push и pull request.
Что dry-run не проверяет:
update-grub и не инициирует перезагрузку./proc/cmdline внутри CI-контейнера показывает командную строку хоста-раннера,
а не контейнера, поэтому mitigation_active в выводе CI бессмысленен.
CI доказывает, что плейбук выполняется чисто; он не доказывает, что хост
смягчён.Подробнее см. tests/README.md.
Уязвимость обнаружена Taeyang Lee (Theori) и превращена в полноценную цепочку эксплойтов командой Xint Code Research Team, которой и принадлежит заслуга в том, что сообщество безопасности обратило на это внимание. Этот рецепт лишь автоматизирует смягчение, которое они рекомендовали.
Beerware. См. LICENSE. TL;DR: делайте с этим что хотите;
если мы когда-нибудь встретимся — купите мне пива.
AESTECHNO — Hugues Orgitello — проектное бюро электроники, Монпелье, Франция.