
Kubernetes DaemonSet per rilevare e correggere CVE-2026-31431 (GHSA-2274-3hgr-wxv6) — LPE algif_aead tramite blacklist di modprobe
Gravità: Alta (CVSS 7.8 — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-31431 è una vulnerabilità di escalation dei privilegi locale nel modulo algif_aead del kernel Linux (interfaccia socket crittografica AF_ALG AEAD). Un utente locale con privilegi ridotti può sfruttare operazioni errate sui buffer in-place per ottenere accesso root completo. Tutti i pool di nodi AKS che eseguono kernel Linux precedenti alla patch upstream sono potenzialmente interessati.
Il modulo algif_aead non è richiesto per i normali carichi di lavoro Kubernetes o AKS. La sua blacklist elimina completamente la superficie di attacco.
Un pod viene eseguito su ogni nodo Linux. All'avvio e successivamente ogni 60 secondi, ogni pod:
Scrive /etc/modprobe.d/modprobe-CIS.conf sull'host con:
install algif_aead /bin/false
blacklist algif_aead
Questo impedisce il caricamento del modulo al riavvio o tramite modprobe.
Controlla /proc/modules (l'elenco live dei moduli del kernel host — condiviso con tutti i container) per algif_aead.
Etichetta il nodo Kubernetes con il risultato, così puoi interrogare l'intero cluster:
| Valore etichetta | Significato |
|---|---|
mitigated | Modulo non caricato; configurazione blacklist applicata |
module-loaded | Il modulo è attualmente caricato — indaga immediatamente |
| File | Scopo |
|---|---|
rbac.yaml | Namespace, ServiceAccount, ClusterRole (get/patch sui nodi), ClusterRoleBinding |
configmap.yaml | Script di remediation shell montato in ogni pod |
daemonset.yaml | Definizione DaemonSet — un pod per nodo Linux |
kubectl configurato per il cluster AKS di destinazioneApplica i manifest in ordine:
kubectl apply -f rbac.yaml
kubectl apply -f configmap.yaml
kubectl apply -f daemonset.yaml
Attendi il completamento del rollout su tutti i nodi:
kubectl -n security-remediation rollout status daemonset/cve-2026-31431-remediator
kubectl get nodes -L vulnerability.aks.io/CVE-2026-31431
Output atteso su un cluster pulito:
NAME STATUS ROLES AGE VERSION CVE-2026-31431
aks-nodepool1-xxxxx-vmss000000 Ready <none> 4d v1.33.7 mitigated
aks-nodepool1-xxxxx-vmss000001 Ready <none> 4d v1.33.7 mitigated
# Elenca i pod e i nodi assegnati
kubectl -n security-remediation get pods -o wide
# Segui i log di un pod specifico
kubectl -n security-remediation logs <pod-name> -f
Output log atteso:
2026-05-01T01:33:36Z [INFO ] CVE-2026-31431 remediator starting on node: aks-nodepool1-...
2026-05-01T01:33:36Z [INFO ] Blacklist config written → /host/etc/modprobe.d/modprobe-CIS.conf
2026-05-01T01:33:36Z [INFO ] Node aks-nodepool1-...: 'algif_aead' is NOT loaded — blacklist config applied, node is mitigated.
2026-05-01T01:33:36Z [INFO ] Labeled node aks-nodepool1-...: vulnerability.aks.io/CVE-2026-31431=mitigated
2026-05-01T01:33:36Z [INFO ] Entering monitoring loop (interval: 60s)
kubectl -n security-remediation exec <pod-name> -- cat /host/etc/modprobe.d/modprobe-CIS.conf
Contenuto atteso:
# CIS hardening – mitigate CVE-2026-31431 (GHSA-2274-3hgr-wxv6)
# Prevents algif_aead (AF_ALG AEAD) LPE from being loaded or exploited.
install algif_aead /bin/false
blacklist algif_aead
Se un nodo mostra module-loaded, il modulo del kernel è attualmente attivo e il nodo potrebbe essere già compromesso. Metti in quarantena (cordon) e drena (drain) immediatamente il nodo per l'analisi forense:
# Trova i nodi interessati
kubectl get nodes -l vulnerability.aks.io/CVE-2026-31431=module-loaded
# Metti in quarantena e drena per l'indagine
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
Nota: La rimozione del DaemonSet non rimuove il file
/etc/modprobe.d/modprobe-CIS.confdai nodi host. Tale file viene lasciato intenzionalmente come misura persistente di hardening del kernel.
kubectl delete -f daemonset.yaml
kubectl delete -f configmap.yaml
kubectl delete -f rbac.yaml
Questo elimina il DaemonSet, tutti i suoi pod, la ConfigMap, il ServiceAccount, il ClusterRole, il ClusterRoleBinding e il namespace.
kubectl label nodes --all vulnerability.aks.io/CVE-2026-31431-
Esegui questa operazione solo se disponi di una mitigazione alternativa (kernel patchato). Esegui su ogni nodo o tramite un pod privilegiato:
rm -f /etc/modprobe.d/modprobe-CIS.conf
runAsUser: 0) — richiesto per scrivere in /etc/modprobe.d/ sull'host.capabilities.drop: ["ALL"]). Non sono necessarie capability del kernel.readOnlyRootFilesystem: true. Solo i volumi montati hostPath e emptyDir sono scrivibili./etc/modprobe.d/ viene montato bind dall'host — non /etc, /proc o qualsiasi percorso più ampio.curl e le sue librerie condivise vengono preparati dal container init in un emptyDir (/tools) così il container principale può chiamare l'API Kubernetes senza necessità di accesso in scrittura al rootfs.get e patch sui nodes.