
Kubernetes DaemonSet para detectar y remediar CVE-2026-31431 (GHSA-2274-3hgr-wxv6) — LPE de algif_aead mediante la lista negra de modprobe
Gravedad: 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 es una vulnerabilidad de escalada de privilegios local en el módulo algif_aead del kernel de Linux (interfaz de sockets criptográficos AF_ALG AEAD). Un usuario local con privilegios bajos puede explotar operaciones incorrectas de búfer in-place para obtener acceso root completo. Todos los nodos de AKS que ejecutan kernels de Linux anteriores al parche ascendente están potencialmente afectados.
El módulo algif_aead no es necesario para cargas de trabajo normales de Kubernetes o AKS. Bloquearlo elimina por completo la superficie de ataque.
Un pod se ejecuta en cada nodo Linux. Al iniciarse y luego cada 60 segundos, cada pod:
Escribe /etc/modprobe.d/modprobe-CIS.conf en el host con:
install algif_aead /bin/false
blacklist algif_aead
Esto evita que el módulo se cargue al reiniciar o mediante modprobe.
Comprueba /proc/modules (la lista de módulos del kernel del host en vivo — compartida con todos los contenedores) en busca de algif_aead.
Etiqueta el nodo de Kubernetes con el resultado para que puedas consultar en todo el clúster:
| Valor de etiqueta | Significado |
|---|---|
mitigated | Módulo no cargado; configuración de bloqueo aplicada |
module-loaded | El módulo está cargado actualmente — investigar de inmediato |
| Archivo | Propósito |
|---|---|
rbac.yaml | Namespace, ServiceAccount, ClusterRole (get/patch en nodos), ClusterRoleBinding |
configmap.yaml | Script de remediación en shell montado en cada pod |
daemonset.yaml | Definición del DaemonSet — un pod por nodo Linux |
kubectl configurado contra el clúster AKS de destinoAplica los manifiestos en orden:
kubectl apply -f rbac.yaml
kubectl apply -f configmap.yaml
kubectl apply -f daemonset.yaml
Espera a que el despliegue se complete en todos los nodos:
kubectl -n security-remediation rollout status daemonset/cve-2026-31431-remediator
kubectl get nodes -L vulnerability.aks.io/CVE-2026-31431
Salida esperada en un clúster limpio:
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
# Lista los pods y sus nodos asignados
kubectl -n security-remediation get pods -o wide
# Sigue los registros de un pod específico
kubectl -n security-remediation logs <pod-name> -f
Salida de registros esperada:
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
Contenido esperado:
# 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 nodo muestra module-loaded, el módulo del kernel está activo actualmente y el nodo puede estar ya comprometido. Aísla (cordon) y drena el nodo de inmediato para realizar un análisis forense:
# Encuentra los nodos afectados
kubectl get nodes -l vulnerability.aks.io/CVE-2026-31431=module-loaded
# Aísla y drena para la investigación
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
Nota: Eliminar el DaemonSet no elimina el archivo
/etc/modprobe.d/modprobe-CIS.confde los nodos host. Ese archivo se deja intencionalmente en su lugar como medida persistente de endurecimiento del kernel.
kubectl delete -f daemonset.yaml
kubectl delete -f configmap.yaml
kubectl delete -f rbac.yaml
Esto elimina el DaemonSet, todos sus pods, el ConfigMap, el ServiceAccount, el ClusterRole, el ClusterRoleBinding y el namespace.
kubectl label nodes --all vulnerability.aks.io/CVE-2026-31431-
Solo hazlo si tienes una mitigación alternativa (kernel parcheado). Ejecuta en cada nodo o mediante un pod privilegiado:
rm -f /etc/modprobe.d/modprobe-CIS.conf
runAsUser: 0) — necesario para escribir en /etc/modprobe.d/ en el host.capabilities.drop: ["ALL"]). No se necesitan capacidades del kernel.readOnlyRootFilesystem: true. Solo los volúmenes montados hostPath y emptyDir son escribibles./etc/modprobe.d/ está montado desde el host — no /etc, /proc ni ninguna ruta más amplia.curl y sus bibliotecas compartidas se preparan mediante el contenedor init en un emptyDir (/tools) para que el contenedor principal pueda llamar a la API de Kubernetes sin necesidad de acceso de escritura al rootfs.get y patch en nodes.