
Kubernetes DaemonSet pour détecter et corriger CVE-2026-31431 (GHSA-2274-3hgr-wxv6) — LPE algif_aead via la liste noire de modprobe
Sévérité : Élevée (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 est une vulnérabilité d'élévation de privilèges locale dans le module algif_aead du noyau Linux (interface de socket crypto AF_ALG AEAD). Un utilisateur local à faibles privilèges peut exploiter des opérations incorrectes sur les tampons en place pour obtenir un accès root complet. Tous les pools de nœuds AKS exécutant des noyaux Linux antérieurs au correctif en amont sont potentiellement concernés.
Le module algif_aead n'est pas requis pour les charges de travail Kubernetes ou AKS normales. Sa mise sur liste noire élimine entièrement la surface d'attaque.
Un pod s'exécute sur chaque nœud Linux. Au démarrage, puis toutes les 60 secondes, chaque pod :
Écrit /etc/modprobe.d/modprobe-CIS.conf sur l'hôte avec :
install algif_aead /bin/false
blacklist algif_aead
Cela empêche le chargement du module au redémarrage ou via modprobe.
Vérifie /proc/modules (la liste des modules du noyau de l'hôte en direct — partagée avec tous les conteneurs) pour algif_aead.
Étiquette le nœud Kubernetes avec le résultat afin que vous puissiez interroger l'ensemble du cluster :
| Valeur de l'étiquette | Signification |
|---|---|
mitigated | Module non chargé ; configuration de liste noire appliquée |
module-loaded | Module actuellement chargé — enquêter immédiatement |
| Fichier | Objectif |
|---|---|
rbac.yaml | Namespace, ServiceAccount, ClusterRole (get/patch nodes), ClusterRoleBinding |
configmap.yaml | Script de correction shell monté dans chaque pod |
daemonset.yaml | Définition du DaemonSet — un pod par nœud Linux |
kubectl configuré pour le cluster AKS cibleAppliquez les manifestes dans l'ordre :
kubectl apply -f rbac.yaml
kubectl apply -f configmap.yaml
kubectl apply -f daemonset.yaml
Attendez que le déploiement soit terminé sur tous les nœuds :
kubectl -n security-remediation rollout status daemonset/cve-2026-31431-remediator
kubectl get nodes -L vulnerability.aks.io/CVE-2026-31431
Sortie attendue sur un cluster propre :
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
# Lister les pods et leurs nœuds assignés
kubectl -n security-remediation get pods -o wide
# Suivre les journaux d'un pod spécifique
kubectl -n security-remediation logs <pod-name> -f
Sortie de journal attendue :
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
Contenu attendu :
# 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
Si un nœud affiche module-loaded, le module du noyau est actuellement actif et le nœud peut déjà être compromis. Cordonnez et drainez le nœud immédiatement pour une analyse forensique :
# Trouver les nœuds concernés
kubectl get nodes -l vulnerability.aks.io/CVE-2026-31431=module-loaded
# Cordonner et drainer pour investigation
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
Remarque : La suppression du DaemonSet ne supprime pas le fichier
/etc/modprobe.d/modprobe-CIS.confdes nœuds hôtes. Ce fichier est intentionnellement laissé en place comme mesure de durcissement persistante du noyau.
kubectl delete -f daemonset.yaml
kubectl delete -f configmap.yaml
kubectl delete -f rbac.yaml
Cela supprime le DaemonSet, tous ses pods, le ConfigMap, le ServiceAccount, le ClusterRole, le ClusterRoleBinding et le namespace.
kubectl label nodes --all vulnerability.aks.io/CVE-2026-31431-
Ne faites cela que si vous disposez d'une autre mesure d'atténuation (noyau corrigé). Exécutez sur chaque nœud ou via un pod privilégié :
rm -f /etc/modprobe.d/modprobe-CIS.conf
runAsUser: 0) — requis pour écrire dans /etc/modprobe.d/ sur l'hôte.capabilities.drop: ["ALL"]). Aucune capacité du noyau n'est nécessaire.readOnlyRootFilesystem: true. Seuls les volumes montés hostPath et emptyDir sont accessibles en écriture./etc/modprobe.d/ est monté en bind depuis l'hôte — pas /etc, /proc, ni aucun chemin plus large.curl et ses bibliothèques partagées sont mis en scène par le conteneur d'initialisation dans un emptyDir (/tools) afin que le conteneur principal puisse appeler l'API Kubernetes sans nécessiter d'accès en écriture au rootfs.get et patch sur nodes uniquement.