
Инструментарий для безопасного обнаружения CVE-2026-31431 "Copy Fail" и CVE-2026-43284 "Dirty Frag" — локальное повышение привилегий в модуле algif_aead ядра Linux, затрагивающее все основные дистрибутивы с 2017 года.
Безопасные средства обнаружения для двух семейств уязвимостей локального повышения привилегий в ядре Linux — Copy Fail (CVE-2026-31431) и Dirty Frag (CVE-2026-43284 / CVE-2026-43500) — обе затрагивают все основные дистрибутивы с 2017 года, обе могут быть эксплуатированы любым непривилегированным локальным пользователем, и обе требуют независимых мер смягчения.
Эти проверки не открывают сокетов и не выполняют криптографических или сетевых операций. Обнаружение основано исключительно на версии ядра, метаданных пакетов дистрибутива, состоянии модулей и активных флагах смягчения — все данные доступны для чтения без
sudo.
Применение смягчения Copy Fail НЕ защищает от Dirty Frag. Обе проверки должны быть запущены, и оба смягчения должны быть применены независимо.
.
├── cve-2026-31431-check.sh Copy Fail probe (all output modes)
├── copy_fail_userparameter.conf Zabbix agent UserParameter — Copy Fail
├── zabbix_template_copy_fail.yaml Zabbix 6.4 template — Copy Fail
├── copy_fail_auditd.rules auditd behavioral detection — Copy Fail
├── cve-2026-43284-check.sh Dirty Frag probe (all output modes)
├── dirty_frag_userparameter.conf Zabbix agent UserParameter — Dirty Frag
├── wazuh_sca/
│ └── copy_fail_sca.yml Wazuh SCA compliance policy
└── ansible/
└── copy_fall_scan.yml Fleet-wide Ansible scan playbook
Для эксплуатации требуется следующая цепочка системных вызовов:
socket(AF_ALG, SOCK_SEQPACKET, 0)
bind(fd, {alg_type="aead", alg_name="authencesn(hmac(sha256),cbc(aes))"})
accept(fd, ...)
splice(suid_binary_fd, op_fd) ← page cache fed into crypto subsystem
sendmsg / recvmsg ← 4-byte scratch write lands in page cache
Ни один из этих вызовов не затрагивается проверкой. Обнаружение основано на:
.ko на диске (автоматически загружаемый)modprobe.d и флаг командной строки initcall_blacklistchmod +x cve-2026-31431-check.sh
./cve-2026-31431-check.sh # human-readable
./cve-2026-31431-check.sh --json # machine-readable
./cve-2026-31431-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-31431-check.sh --zabbix # integer 0/1/2 for Zabbix item
Коды возврата: 0 = ЗАПЛАЧЕНО или СМЯГЧЕНО · 1 = УЯЗВИМО · 2 = НЕИЗВЕСТНО
Скрипт автоматически сравнивает с этими порогами и устанавливает вердикт «ЗАПЛАЧЕНО», когда текущий пакет соответствует порогу или превышает его.
На RHEL, AlmaLinux, Rocky Linux и их производных модуль algif_aead встроен в ядро. Обходной путь через modprobe.d не действует. Работает только initcall_blacklist=algif_aead_init в параметрах командной строки ядра. Проверка обнаруживает это и явно предупреждает.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Frag объединяет две ошибки быстрого пути дешифрования на месте, обнаруженные Hyunwoo Kim (@v4bel), раскрытые ~2026-05-07, через неделю после Copy Fail:
esp4, esp6); исправление upstream f4c50a4034e6rxrpc); исправление upstream aa54b1d27fe0Эксплойт присоединяет страницы pipe из кеша страниц /usr/bin/su в качестве фрагментов буфера сокета, затем запускает дешифрование на месте с помощью выбранного атакующим ключа — записывая произвольные байты непосредственно в кешированную копию setuid-бинарника, не затрагивая файл на диске.
Смягчение Copy Fail (черный список algif_aead) НЕ предотвращает Dirty Frag.
chmod +x cve-2026-43284-check.sh
./cve-2026-43284-check.sh # human-readable
./cve-2026-43284-check.sh --json # machine-readable
./cve-2026-43284-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-43284-check.sh --zabbix # integer 0/1/2 for Zabbix item
Проверка независимо проверяет esp4, esp6 и rxrpc и сообщает отдельные булевы значения cve_43284_safe / cve_43500_safe в JSON-выводе.
esp4 и esp6 — это преобразования ESP на стороне ядра, используемые IPsec (strongSwan, Libreswan). Внесение их в черный список нарушает работу IPsec-туннелей. Проверка обнаруживает активное использование IPsec через ip xfrm state и обнаружение демонов, и соответствующим образом корректирует рекомендации по устранению:
modprobe.d для всех трёх модулей.rxrpc в черный список, если он не нужен):
# RHEL-family
sysctl -w user.max_user_namespaces=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
# Ubuntu / Debian
sysctl -w kernel.unprivileged_userns_clone=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
| Дистрибутив | CVE-2026-43284 | CVE-2026-43500 (rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | N/A — rxrpc не поставляется на RHEL 8 |
| RHEL / Rocky / Alma 9.x |
Для систем, ожидающих исправленное ядро, немедленно примените черный список modprobe.d (с учетом оговорки об IPsec).
AlmaLinux / RHEL 8 вообще не собирает модуль rxrpc. Проверка автоматически помечает kernel_vuln_rxrpc=not_affected на RHEL/Rocky/Alma 8.x.
Разверните обе проверки на каждом контролируемом хосте:
mkdir -p /etc/zabbix/scripts
install -m 750 -o zabbix -g zabbix cve-2026-31431-check.sh /etc/zabbix/scripts/
install -m 750 -o zabbix -g zabbix cve-2026-43284-check.sh /etc/zabbix/scripts/
cp copy_fail_userparameter.conf /etc/zabbix/zabbix_agentd.d/
cp dirty_frag_userparameter.conf /etc/zabbix/zabbix_agentd.d/
systemctl restart zabbix-agent # or zabbix-agent2
Импортируйте zabbix_template_copy_fail.yaml через Configuration → Templates → Import.
Предоставляемые элементы UserParameter:
Шаблон Copy Fail включает триггер HIGH при status=1, WARNING при status=2. sudo не требуется — все файлы, читаемые обоими скриптами, доступны для чтения всем.
install -m 755 cve-2026-31431-check.sh /usr/lib/nagios/plugins/
install -m 755 cve-2026-43284-check.sh /usr/lib/nagios/plugins/
# NRPE — add to /etc/nagios/nrpe.cfg:
command[check_copy_fail]=/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios
command[check_dirty_frag]=/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios
# CheckMK local checks:
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios); RC=$?
echo "$RC CVE-2026-31431 - $OUT"' > /usr/lib/check_mk_agent/local/copy_fail
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios); RC=$?
echo "$RC CVE-2026-43284 - $OUT"' > /usr/lib/check_mk_agent/local/dirty_frag
chmod +x /usr/lib/check_mk_agent/local/copy_fail \
/usr/lib/check_mk_agent/local/dirty_frag
Обнаруживает активную попытку эксплуатации в процессе, дополняя обе статические проверки.
cp copy_fail_auditd.rules /etc/audit/rules.d/
augenrules --load
# Watch for unexpected AF_ALG callers:
ausearch -k copy_fail_af_alg --interpret | \
grep -v -E 'cryptsetup|veritysetup|systemd-crypt|kcapi'
Заготовки правил Wazuh (уровень 13 / 15) встроены в комментарии файла .rules.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
Результаты: Security → SCA → Filter by policy cve_2026_31431_copy_fail
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml
# Limit to a subset:
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml --limit webservers
Записывает JSON для каждого хоста + summary.txt в /tmp/copy_fail_results/ на управляющем узле. Плейбук завершается с ненулевым кодом, если любой хост УЯЗВИМ.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| Модули | algif_aead | esp4, esp6, rxrpc |
| Появился | Авг 2017 (ядро 4.14) | Янв 2017 / Июн 2023 |
| Смягчение | modprobe.d черный список для algif_aead | modprobe.d черный список для esp4/esp6/rxrpc |
| Скрипт проверки | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| Дистрибутив | Исправлено в | Уведомление |
|---|
| RHEL / Rocky / Alma 8.10 | kernel-4.18.0-553.123.1.el8_10 | Rocky 2026-05-11 |
| RHEL / Rocky / Alma 9.7 | kernel-5.14.0-611.54.1.el9_7 | same |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | same |
| Debian 11 (bullseye) | linux 5.10.251-3 | DLA-4560-1 |
| Debian 12 (bookworm) | linux 6.1.170-1 | DSA-6243-1 |
| Debian 13 (trixie) | linux 6.12.85-1 | DSA-6238-1 |
| Ubuntu 22.04 / 24.04 | Нет исправленного ядра на данный момент — смягчение kmod через USN-8226-1 | USN-8226-1 |
| SLES 12 SP5 | kernel-default 4.12.14-122.299.1 | SUSE-SU-2026:1669-1 |
| SLES 15 SP5 | kernel-default 5.14.21-150500.55.144.1 | SUSE-SU-2026:1670-1 |
| SLES 15 SP6 | kernel-default 6.4.0-150600.23.92.1 | SUSE-SU-2026:1671-1 |
| SLES 15 SP7 | kernel-default 6.4.0-150700.53.40.1 | SUSE-SU-2026:1669-1 |
| SLES 16.0 | kernel-default 6.12.0-160000.29.1 | SUSE advisory |
| Ожидается |
| Ожидается |
| Debian / Ubuntu / SLES | Ожидается | Ожидается |
| Ключ | Тип | Значение |
|---|
copy_fail.status | int | 0=безопасно · 1=уязвимо · 2=неизвестно |
copy_fail.detail | str | Человекочитаемый вердикт Copy Fail |
dirty_frag.status | int | 0=безопасно · 1=уязвимо · 2=неизвестно |
dirty_frag.detail | str | Человекочитаемый вердикт Dirty Frag |
| Дистрибутив | Copy Fail | Dirty Frag |
|---|