
Kubernetes DaemonSet para detetar e remediar o CVE-2026-31431 (GHSA-2274-3hgr-wxv6) — LPE do algif_aead via blacklist do modprobe
Gravidade: 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 é uma vulnerabilidade de escalonamento de privilégio local no módulo algif_aead do kernel Linux (interface de socket criptográfico AF_ALG AEAD). Um usuário local com privilégios baixos pode explorar operações incorretas de buffer in-place para obter acesso total de root. Todos os node pools do AKS que executam kernels Linux anteriores ao patch upstream são potencialmente afetados.
O módulo algif_aead não é necessário para cargas de trabalho normais do Kubernetes ou AKS. Bloqueá-lo elimina completamente a superfície de ataque.
Um pod é executado em cada nó Linux. Na inicialização e depois a cada 60 segundos, cada pod:
Grava /etc/modprobe.d/modprobe-CIS.conf no host com:
install algif_aead /bin/false
blacklist algif_aead
Isso impede que o módulo seja carregado na reinicialização ou via modprobe.
Verifica /proc/modules (a lista de módulos do kernel do host em tempo real — compartilhada com todos os contêineres) em busca de algif_aead.
Rotula o nó do Kubernetes com o resultado para que você possa consultar em todo o cluster:
| Valor do rótulo | Significado |
|---|---|
mitigated | Módulo não carregado; configuração de blacklist aplicada |
module-loaded | Módulo está atualmente carregado — investigue imediatamente |
| Arquivo | Finalidade |
|---|---|
rbac.yaml | Namespace, ServiceAccount, ClusterRole (get/patch em nós), ClusterRoleBinding |
configmap.yaml | Script de remediação em shell montado em cada pod |
daemonset.yaml | Definição do DaemonSet — um pod por nó Linux |
kubectl configurado para o cluster AKS de destinoAplique os manifests em ordem:
kubectl apply -f rbac.yaml
kubectl apply -f configmap.yaml
kubectl apply -f daemonset.yaml
Aguarde a conclusão da implantação em todos os nós:
kubectl -n security-remediation rollout status daemonset/cve-2026-31431-remediator
kubectl get nodes -L vulnerability.aks.io/CVE-2026-31431
Saída esperada em um cluster limpo:
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
# Liste os pods e seus nós atribuídos
kubectl -n security-remediation get pods -o wide
# Acompanhe os logs de um pod específico
kubectl -n security-remediation logs <pod-name> -f
Saída de log 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
Conteúdo 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
Se um nó exibir module-loaded, o módulo do kernel está atualmente ativo e o nó pode já estar comprometido. Isole (cordon) e drene o nó imediatamente para análise forense:
# Encontre os nós afetados
kubectl get nodes -l vulnerability.aks.io/CVE-2026-31431=module-loaded
# Isole e drene para investigação
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
Nota: Remover o DaemonSet não remove o arquivo
/etc/modprobe.d/modprobe-CIS.confdos nós do host. Esse arquivo é intencionalmente deixado no lugar como uma medida persistente de endurecimento do kernel.
kubectl delete -f daemonset.yaml
kubectl delete -f configmap.yaml
kubectl delete -f rbac.yaml
Isso exclui o DaemonSet, todos os seus pods, o ConfigMap, o ServiceAccount, o ClusterRole, o ClusterRoleBinding e o namespace.
kubectl label nodes --all vulnerability.aks.io/CVE-2026-31431-
Faça isso somente se você tiver uma mitigação alternativa (kernel corrigido). Execute em cada nó ou por meio de um pod privilegiado:
rm -f /etc/modprobe.d/modprobe-CIS.conf
runAsUser: 0) — necessário para gravar em /etc/modprobe.d/ no host.capabilities.drop: ["ALL"]). Nenhuma capability do kernel é necessária.readOnlyRootFilesystem: true. Apenas os volumes montados hostPath e emptyDir são graváveis./etc/modprobe.d/ é montado via bind a partir do host — não /etc, /proc ou qualquer caminho mais amplo.curl e suas bibliotecas compartilhadas são preparados pelo contêiner init em um emptyDir (/tools) para que o contêiner principal possa chamar a API do Kubernetes sem precisar de acesso de gravação ao rootfs.get e patch em nodes.