
Mitigation native Kubernetes de CVE-2026-31431 avec blocage automatisé des modules du noyau, règles de détection Falco en runtime et configuration de nœuds basée sur bashible pour les clusters Deckhouse.
Langue: Anglais | Русский
CVE-2026-31431 est une vulnérabilité dans le module algif_aead du noyau Linux, qui expose l'API crypto du noyau à l'espace utilisateur via la famille de sockets AF_ALG. Un défaut dans l'interface AEAD (Authenticated Encryption with Associated Data) permet à un utilisateur local non privilégié de déclencher une corruption mémoire dans le noyau en soumettant des listes scatter-gather conçues spécialement, conduisant à une élévation de privilèges locale ou à un déni de service.
La surface vulnérable est accessible depuis tout processus — y compris les conteneurs non privilégiés — autorisé à appeler socket(AF_ALG, SOCK_SEQPACKET, 0) et à le lier à un algorithme de type aead. Les runtimes de conteneurs qui ne suppriment pas le profil seccomp par défaut ou ne restreignent pas la famille d'appels système socket exposent les nœuds du cluster à l'attaque.
L'atténuation recommandée, jusqu'à ce que le correctif du noyau en amont soit déployé via les mises à jour de paquets du système d'exploitation, consiste à désactiver le module noyau algif_aead sur chaque nœud du cluster et à détecter les tentatives d'exploitation à l'exécution.
Ce dépôt contient tout ce qui est nécessaire pour atténuer CVE-2026-31431 sur un cluster géré par Deckhouse :
| Fichier | Description |
|---|---|
ngc-cve-2026-31431.yaml | NodeGroupConfiguration qui sonde l'interface vulnérable, bloque le chargement de algif_aead, décharge le module s'il est actuellement chargé et vérifie que le correctif est efficace. S'applique à tous les bundles et groupes de nœuds. |
far-cve-2026-31431.yaml | FalcoAuditRules qui détecte les tentatives d'exploitation de la vulnérabilité à l'exécution via les sockets AF_ALG liées à des algorithmes AEAD. Disponible uniquement dans Deckhouse Enterprise Edition (EE) et Certified Security Edition (CSE), puisque le module runtime-audit-engine est fourni dans ces éditions. |
ngc-cve-2026-31431.yaml — atténuation côté nœudLe NodeGroupConfiguration est exécuté via bashible sur chaque nœud et effectue quatre étapes :
AF_ALG et la lie à aead/gcm(aes) pour déterminer si l'interface vulnérable est accessible sur le nœud./etc/modprobe.d/disable-algif.conf avec des directives install qui empêchent algif_aead (et le module générique af_alg) d'être chargé à nouveau, manuellement ou en tant que dépendance.rmmod algif_aead si le module est actuellement chargé. Ignoré si le module est compilé dans le noyau (auquel cas seule l'inscription sur liste noire + la détection à l'exécution s'appliquent).Idempotent : réexécuter la configuration sur un nœud déjà atténué ne fait rien.
far-cve-2026-31431.yaml — détection à l'exécutionLa ressource FalcoAuditRules ajoute une règle Falco personnalisée qui déclenche un événement Critical lorsqu'un processus ouvre une socket AF_ALG et la lie à un algorithme aead (le modèle d'appels système propre à cette attaque). Elle émet également un événement Warning lorsqu'un processus tente de charger le module algif_aead via modprobe/insmod, ce qui, sur un nœud atténué, ne devrait jamais réussir et constitue un signal fort d'une tentative d'exploitation ou d'une erreur de configuration de l'opérateur.
Note sur les éditions :
FalcoAuditRulesest réconcilié par le moduleruntime-audit-engine, qui n'est fourni que dans Deckhouse Enterprise Edition (EE) et Certified Security Edition (CSE). Sur l'édition Community, la ressource ne sera pas traitée ; laNodeGroupConfigurationde ce dépôt s'applique toujours et constitue l'atténuation principale.
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE only:
kubectl apply -f far-cve-2026-31431.yaml
Attendez que la configuration soit appliquée sur chaque nœud en surveillant le statut de chaque NodeGroup. Bashible remonte le succès de chaque étape dans le NodeGroup, et Deckhouse agrège cela dans deux champs que vous pouvez interroger :
.status.upToDate — nombre de nœuds dont la dernière exécution bashible a réussi avec la configuration actuelle. La convergence est atteinte lorsque upToDate == nodes pour chaque groupe..status.conditionSummary.ready — "True" une fois que le groupe est sain ; passe à "False" avec une raison lisible dans .status.conditionSummary.statusMessage si l'étape bashible d'un nœud échoue (ce qui est exactement ce que fait l'étape de vérification de la NodeGroupConfiguration sur un nœud où le correctif n'a pas pu être appliqué).Une vue instantanée de tous les groupes :
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
Une vérification scriptable qui se termine par 0 uniquement lorsque tous les groupes ont convergé :
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"
Si un NodeGroup est bloqué avec conditionSummary.ready == "False", lisez .status.conditionSummary.statusMessage — il fait apparaître l'étape bashible en échec, y compris l'étape de vérification de cette atténuation.
Une fois que le paquet noyau en amont contenant le correctif officiel est installé sur chaque nœud, supprimez les deux ressources :
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
Supprimer la NodeGroupConfiguration ne supprime pas automatiquement /etc/modprobe.d/disable-algif.conf — nettoyez-le manuellement si vous voulez que le module soit à nouveau chargeable, ou laissez la liste noire en place si l'API crypto du noyau n'est utilisée par aucune charge de travail du cluster.
À l'échelle du cluster :
kubectl get nodegroups
UPTODATE doit être égal à NODES et la colonne du message de statut doit être vide pour chaque groupe.
Sur un nœud (SSH ou 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=$?"
Résultat attendu :
cat affiche les quatre lignes install / blacklist.lsmod ne renvoie rien.modprobe -n -v affiche install /bin/false.modprobe renvoie exit=1.Utilisez cette sous-section pour valider que la FalcoAuditRules personnalisée pour CVE-2026-31431 se déclenche bien à chaque exécution de PoC.
Pré-vérifications communes pour les deux scénarios :
runtime-audit-engine est sain sur tous les nœuds :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
Résultat attendu : 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'