
Strumenti di rilevamento sicuri per CVE-2026-31431 "Copy Fail" e CVE-2026-43284 "Dirty Frag" — una escalation di privilegi locali nel modulo algif_aead del kernel Linux che colpisce tutte le distribuzioni principali dal 2017.
Strumenti di rilevamento sicuri per due famiglie correlate di vulnerabilità di escalation dei privilegi locali del kernel Linux — Copy Fail (CVE-2026-31431) e Dirty Frag (CVE-2026-43284 / CVE-2026-43500) — entrambe che interessano tutte le distribuzioni principali dal 2017, entrambe sfruttabili da qualsiasi utente locale non privilegiato, ed entrambe che richiedono mitigazioni indipendenti.
Questi probe non aprono socket e non eseguono operazioni crittografiche o di rete. Il rilevamento si basa esclusivamente sulla versione del kernel, sui metadati dei pacchetti della distribuzione, sullo stato del modulo e sui flag di mitigazione attivi — tutti leggibili a livello mondiale senza
sudo.
Applicare la mitigazione di Copy Fail NON protegge da Dirty Frag. Entrambe le sonde devono essere eseguite ed entrambe le mitigazioni applicate indipendentemente.
.
├── cve-2026-31431-check.sh Sonda Copy Fail (tutte le modalità di output)
├── copy_fail_userparameter.conf Parametro utente agente Zabbix — Copy Fail
├── zabbix_template_copy_fail.yaml Template Zabbix 6.4 — Copy Fail
├── copy_fail_auditd.rules Rilevamento comportamentale auditd — Copy Fail
├── cve-2026-43284-check.sh Sonda Dirty Frag (tutte le modalità di output)
├── dirty_frag_userparameter.conf Parametro utente agente Zabbix — Dirty Frag
├── wazuh_sca/
│ └── copy_fail_sca.yml Politica di conformità Wazuh SCA
└── ansible/
└── copy_fall_scan.yml Playbook di scansione Ansible per intera flotta
L'exploit richiede questa esatta catena di syscall:
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
Nessuna di queste viene toccata dalla sonda. Il rilevamento si basa su:
.ko su disco (caricabile automaticamente)modprobe.d e flag cmdline 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
Codici di uscita: 0 = PATCHED o MITIGATED · 1 = VULNERABLE · 2 = UNKNOWN
Lo script confronta automaticamente queste soglie e imposta il verdetto su PATCHED quando il pacchetto in esecuzione soddisfa o supera la soglia.
Su RHEL, AlmaLinux, Rocky Linux e derivati, algif_aead è compilato nel kernel. Il workaround di modprobe.d non ha effetto. Solo initcall_blacklist=algif_aead_init nella riga di comando del kernel funziona. La sonda lo rileva e avvisa esplicitamente.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Frag combina due bug di decrittazione in-place nel fast-path scoperti da Hyunwoo Kim (@v4bel), divulgati ~07-05-2026, una settimana dopo Copy Fail:
esp4, esp6); upstream fix f4c50a4034e6rxrpc); upstream fix aa54b1d27fe0L'exploit attacca pagine pipe dalla cache delle pagine di /usr/bin/su come frammenti di buffer di socket paginati, quindi guida la decrittazione in-place con una chiave scelta dall'attaccante — scrivendo byte arbitrari direttamente nella copia cached di un binario setuid, senza toccare il file su disco.
La mitigazione di Copy Fail (blacklist algif_aead) NON impedisce 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
La sonda controlla esp4, esp6 e rxrpc indipendentemente e riporta booleani separati cve_43284_safe / cve_43500_safe nell'output JSON.
esp4 e esp6 sono le trasformazioni ESP lato kernel utilizzate da IPsec (strongSwan, Libreswan). Blacklistarli rompe i tunnel IPsec. La sonda rileva l'uso attivo di IPsec tramite ip xfrm state e rilevamento del demone, e adatta di conseguenza i consigli di remediation:
modprobe.d per tutti e tre i moduli.rxrpc separatamente se non necessario):
# 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
| Distribuzione | CVE-2026-43284 | CVE-2026-43500 (rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | N/D — rxrpc non distribuito su RHEL 8 |
| RHEL / Rocky / Alma 9.x |
Per i sistemi in attesa di un kernel patchato, applicare immediatamente la blacklist modprobe.d (tenendo conto della caveat IPsec).
AlmaLinux / RHEL 8 non compila affatto il modulo rxrpc. La sonda contrassegna automaticamente kernel_vuln_rxrpc=not_affected su RHEL/Rocky/Alma 8.x.
Distribuisci entrambe le sonde su ogni host monitorato:
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
Importa zabbix_template_copy_fail.yaml tramite Configurazione → Template → Importa.
Elementi UserParameter forniti:
Il template di Copy Fail include un trigger ALTO per status=1, AVVISO per status=2. Non richiede sudo — ogni file letto da entrambi gli script è leggibile da tutti.
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
Rileva un tentativo di exploit attivo in corso, complementando entrambe le sonde statiche.
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'
Gli stub delle regole Wazuh (livello 13/15) sono incorporati nei commenti del file .rules.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
Risultati: Sicurezza → SCA → Filtra per 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
Scrive JSON per host + summary.txt in /tmp/copy_fail_results/ sul controller. Il play esce con codice non zero se un host è VULNERABLE.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| Modulo/i | algif_aead | esp4, esp6, rxrpc |
| Introdotta | Agosto 2017 (kernel 4.14) | Gennaio 2017 / Giugno 2023 |
| Mitigazione | Blacklist modprobe.d per algif_aead | Blacklist modprobe.d per esp4/esp6/rxrpc |
| Script di sonda | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| Distribuzione | Patchata il | Avviso |
|---|
| 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 | Nessun kernel patchato ancora — mitigazione kmod tramite 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 | Avviso SUSE |
| In attesa |
| In attesa |
| Debian / Ubuntu / SLES | In attesa | In attesa |
| Chiave | Tipo | Significato |
|---|
copy_fail.status | int | 0=sicuro · 1=vulnerabile · 2=sconosciuto |
copy_fail.detail | str | Verdetto leggibile di Copy Fail |
dirty_frag.status | int | 0=sicuro · 1=vulnerabile · 2=sconosciuto |
dirty_frag.detail | str | Verdetto leggibile di Dirty Frag |
| Distribuzione | Copy Fail | Dirty Frag |
|---|