
Toolkit di mitigazione per la use-after-free di IPv4 TCP inet_opt/ireq_opt: audit dell'esposizione, regole nft di drop dei SYN con opzioni IP, rilevamento tramite tcpdump e builder kpatch/livepatch per kernel EL.
Use-after-free IPv4 TCP inet_opt/ireq_opt (fix upstream e3f33b0a,
kfree → kfree_rcu in inet_sock_destruct() + tcp_v4_reqsk_destructor()).
Trigger: SYN del client che trasporta opzioni IPv4 (ihl > 5) — senza opzioni
l'oggetto soggetto alla race ireq_opt non viene mai allocato. L'exploit
remote-root dichiarato richiede inoltre un listener MPTCP.
| file | richiede root | scopo |
|---|---|---|
cve-audit.sh | no | report di esposizione e patchabilità in sola lettura |
cve-mitigate.sh | apply/undo | drop nft dei SYN con opzioni IP, disattivazione MPTCP opzionale |
nft-rules.txt | — | il ruleset autonomo (nft -f nft-rules.txt) |
cve-detect.sh | modalità capture | sensore tcpdump per la forma dei pacchetti dell'exploit |
kpatch-el-build.sh | build/install | builder kpatch/livepatch validato per la famiglia EL |
klp-handcraft-build.sh | build/load | modulo klp scritto a mano per kernel IBT su cui kpatch-build non può essere eseguito (EL10) |
patches/CVE-2026-98432.patch | — | fix upstream, pronto per kpatch-build |
tests/run-tests.sh | no | harness (caricamento ruleset in netns + e2e del builder con stub) |
./cve-audit.sh # where do I stand?
./cve-mitigate.sh apply --with-mptcp-off # closes trigger + claimed root path
./cve-detect.sh count 30 # anyone probing with IP options?
sudo ./kpatch-el-build.sh --name CVE-2026-98432 \
--expect inet_sock_destruct,tcp_v4_reqsk_destructor \
[--sign priv.pem cert.pem] [--install] \
patches/CVE-2026-98432.patch
# verify: cat /sys/kernel/livepatch/CVE-2026-98432/enabled -> 1
./cve-mitigate.sh status # keep until 100% patched, then:
./cve-mitigate.sh undo
| target | note |
|---|---|
| EL7 (3.10) | non vulnerabile (il codice del trigger è arrivato nella 4.4); il builder funziona comunque per altre patch |
| EL7h/EL8 (4.18) | vulnerabile; kernel-debuginfo fornisce /usr/src/debug/kernel-*/linux-*; kpatch-build da EPEL |
| EL9 (5.14) | vulnerabile; kernel compilato con gcc-toolset — il builder antepone automaticamente il corrispondente /opt/rh/gcc-toolset-* |
| EL10 (6.12) | IBT: kpatch-build 0.9.11 rifiuta i kernel con CONFIG_X86_KERNEL_IBT=y (dynup/kpatch#1320) — usare klp-handcraft-build.sh; la firma dei moduli è imposta con Secure Boot/lockdown |
| CloudLinux 8/9/10 | l'id della distro non è nell'elenco di supporto di kpatch-build, quindi il builder passa sempre esplicitamente -s/-c/-v; i debuginfo provengono dal kernel-debuginfo di AlmaLinux/CentOS corrispondente a rpm -qf /boot/vmlinuz-$(uname -r) |
I debuginfo su RHEL richiedono l'abilitazione dei repository, ad es.
dnf --enablerepo='*debug*' debuginfo-install -y $(rpm -qf /boot/vmlinuz-$(uname -r))
(subscription-manager repos --enable=rhel-9-appstream-rpms ecc. sugli host non fatturati).
CONFIG_LIVEPATCH=y + CONFIG_KALLSYMS=y nella configurazione in esecuzione..comment delegato a kpatch-build; la ricerca del toolset avviene qui).--expect) — un terzo oggetto modificato inatteso è un fallimento netto.sign-file opzionale con la tua coppia di chiavi + ricontrollo di modinfo sig_type;
registra il certificato tramite MOK per Secure Boot.--install inserisce in /var/lib/kpatch/$(uname -r)/, carica tramite
kpatch/insmod, abilita kpatch.service per la persistenza al riavvio.uname -r della flotta../kpatch-el-build.sh ... --install; conferma
/sys/kernel/livepatch/<name>/enabled == 1.hping3 -S -p <port> --tcp-opts ...
verso un listener mentre si alterna net.ipv4.tcp_migrate_req=1 sul canary;
una variante del kernel con KASAN e un udelay() artificiale dentro
ip_options_build() dovrebbe riprodurre la UAF senza la patch e restare
silenziosa con essa.uname -r resti invariato (livepatch non lo incrementa), kpatch list,
dmesg -w per taint e stalli di transizione klp
(/sys/kernel/livepatch/<name>/transition deve scendere a 0).Harness: tutti i controlli passano su una VM AlmaLinux 10.2 (kernel 6.12.0-211.64.1.el10_2).
Ruleset nft reali vengono caricati ed elencati dentro un netns nuovo; filtri pcap
compilati contro tcpdump live; pipeline del builder esercitata end-to-end contro
un kpatch-build stubbato con un fixture .ko reale e feed di simboli iniettati.
Verificato dal vivo su quella VM EL10:
klp-handcraft-build.sh --load ha compilato e abilitato una livepatch:
/sys/kernel/livepatch/klp_CVE_2026_98432/enabled=1, transizione completata,
sysfs elenca inet_sock_destruct,1 + tcp_v4_reqsk_destructor,1; il normale
TCP (HTTP 200) non è influenzato. Il .ko non firmato contamina il kernel; il lockdown
di Secure Boot lo rifiuterebbe (la VM girava senza firma).kpatch-build (dynup 0.9.11, compilato dai sorgenti) fallisce in modo netto su EL10
con "kernel option CONFIG_X86_KERNEL_IBT not supported" — il builder
ora esegue un preflight su questo e rimanda alla via handcraft. Un'esecuzione reale di
kpatch-build con diff binario resta non testata su EL8/EL9.prerouting priority -310 funziona per lo stesso motivo.
Esegui una volta il percorso felice sul tuo canary EL prima di fidartene in un incidente.