
Framework de defesa em tempo de execução do kernel para vulnerabilidades AF_ALG, com rastreamento de sockets via eBPF, endurecimento com Ansible e um auditor criptográfico para detecção de desvios.
Uma estrutura de defesa em tempo de execução no kernel para o subsistema Linux AF_ALG (Address Family
Algorithm, família 38). Construída para Centros de Operações de Segurança
que gerenciam frotas Linux empresariais onde o Zero Trust deve se estender para dentro do
kernel, não parar na borda da rede.
O AF_ALG expõe a API de criptografia do kernel ao espaço do usuário por meio de uma interface
de socket (socket(AF_ALG, SOCK_SEQPACKET, 0)). Ele foi originalmente adicionado
para sistemas embarcados sem /dev/crypto e desde então acumulou uma
parcela desproporcional de CVEs do kernel porque apresenta
código de criptografia em modo kernel a chamadores sem privilégios — um clássico descasamento de superfície.
Em uma build empresarial típica:
connect(),
bind() ou DNS não veem nada — o tráfego AF_ALG nunca sai do kernel.Esta estrutura trata cada criação de socket AF_ALG como um evento
de alto sinal e reduz a superfície que torna esses eventos exploráveis.
| Princípio Zero Trust | Controle nesta estrutura |
|---|---|
| Nunca confie, sempre verifique | Rastreador eBPF registra toda tentativa de criação de socket AF_ALG com pid/uid/comm |
| Presuma violação | Auditor de criptografia compara a postura do kernel com uma linha de base assinada |
| Menor privilégio | systemd RestrictAddressFamilies + limite de capabilities em unidades gerenciadas |
| Microssegmentação (lado do kernel) | unprivileged_userns_clone=0 remove o pivô userns usado por exploits |
| Validação contínua | CI valida relatórios de auditoria contra um esquema versionado a cada mudança |
.
├── ebpf/ Observabilidade em tempo de execução (rastreador BCC + lista de permissões)
├── ansible/ Configuração-como-Código (sysctl + drop-ins systemd)
├── systemd/ Drop-in systemd autônomo para hosts sem Ansible
├── auditor/ Auditor de estado do kernel (Python)
├── schemas/ JSON Schema para ingestão de relatórios de auditoria
├── scripts/ Scripts shell auxiliares (verificados por lint no CI)
├── tests/ Testes unitários + fixtures de relatórios
└── .github/workflows/ CI: shellcheck + validação de JSON Schema + lint
ebpf/af_alg_tracer.py anexa um kprobe a security_socket_create.
A sonda filtra em family == 38 no nível do programa BPF para que o
verificador elimine criações de socket não relacionadas e a sobrecarga
por evento permaneça em nanossegundos. Ela emite um registro JSON por tentativa:
{
"@timestamp": "2026-05-02T09:14:11.412041+00:00",
"event": {"category": "kernel", "action": "af_alg_socket_create", "severity": "high"},
"process": {"pid": 1394, "tgid": 1394, "comm": "suspicious_bin"},
"user": {"uid": 1000, "gid": 1000},
"socket": {"family": 38, "family_name": "AF_ALG", "type": 5, "protocol": 0},
"host": {"name": "web-prod-04"}
}
Envie a saída padrão para Vector, Fluent Bit ou journald (via systemd-cat).
Uma lista de permissões por nome de comm (/etc/af-alg-defense/allow.list) suprime
consumidores conhecidos e legítimos sem perder a capacidade de detectar desvios.
O alvo do kprobe é o hook LSM, então os eventos disparam com base na intenção —
mesmo tentativas que seriam negadas por seccomp ou RestrictAddressFamilies
ainda produzem um registro. Isso é exatamente o que um SOC deseja para
baseline comportamental.
ansible/roles/af_alg_hardening/ aplica duas camadas de endurecimento:
Drop-in sysctl (/etc/sysctl.d/90-af-alg-defense.conf):
kernel.unprivileged_userns_clone=0 — remove o pivô userns usado
pela maioria das cadeias de escalonamento AF_ALG.user.max_user_namespaces=0 — defesa em profundidade portável entre distribuições.Drop-in systemd (/etc/systemd/system/<unit>.d/50-af-alg-restrict.conf):
Usa RestrictAddressFamilies como uma lista de permissões (não lista de negações). A
unidade tem permissão para AF_UNIX AF_INET AF_INET6 AF_NETLINK; qualquer outra
família — incluindo AF_ALG — falha com EAFNOSUPPORT porque o systemd
a aplica por meio de BPF anexado a cgroups que o aplicativo não pode
desabilitar. O drop-in também remove CAP_SYS_ADMIN e aplica
ProtectKernel* para fechar os caminhos de escalonamento mais comuns.
Aplique com:
ansible-playbook -i inventory ansible/site.yml --check --diff # pré-visualização
ansible-playbook -i inventory ansible/site.yml # aplicar
Para hosts sem Ansible, coloque o arquivo autônomo no lugar:
sudo ./scripts/deploy_dropin.sh nginx.service
auditor/crypto_auditor.py produz um relatório JSON de postura de segurança ao
inspecionar:
/proc/crypto — toda cifra / hash / aead registrado, com
flags FIPS e status de autoteste./sys/module/ — módulos carregados na subárvore de criptografia, com
flags de taint e snapshots de parâmetros./proc/sys/kernel/, /proc/sys/user/ — sysctls que controlam os
caminhos de ataque do AF_ALG./sys/kernel/security/lockdown — modo de lockdown do kernel.O relatório é indexado por IDs de descoberta estáveis (FND-001 a FND-005
no momento) para que regras de SIEM possam suprimir descobertas individuais
sem descartar o documento inteiro. A detecção de desvio compara a postura com
uma linha de base:
sudo ./auditor/crypto_auditor.py --output /var/log/af-alg-defense/today.json
sudo ./auditor/crypto_auditor.py \
--baseline /var/log/af-alg-defense/baseline.json \
--fail-on-drift
O esquema está em schemas/audit_report.schema.json (Draft 2020-12)
e é validado no CI a cada push.
.github/workflows/ci.yml executa quatro jobs a cada push e PR:
*.sh e script com shebang.audit_report.schema.json,
depois executa o auditor ao vivo no kernel do runner do GH e valida
o relatório resultante. Fixtures em tests/fixtures/ também são verificadas.ruff check .).Uma falha na verificação de esquema bloqueia merges, o que impede que parsers de SIEM downstream quebrem por causa de um campo renomeado silenciosamente.
af_alg_socket_create de um comm não permitido — acione
na primeira ocorrência, não agregue.crypto_modules entre execuções consecutivas do auditor em um
host onde o carregamento de módulos deve estar congelado.hardened=false após uma execução do playbook de endurecimento —
indica adulteração manual ou desvio de um sistema de configuração paralelo.lockdown transiciona de integrity/confidentiality para
none — forte indicador de adulteração do estado do kernel.allow.list para consumidores
conhecidos e legítimos (cryptsetup na inicialização é o usual).baseline.json assinado.af_alg_systemd_services definido para uma unidade de baixo risco. Observe
erros EAFNOSUPPORT no journald.systemd-analyze security <unit> deve mostrar que a restrição está aplicada.--fail-on-drift e encaminhe
saídas não zero para a fila de plantão.af_alg se ele já estiver em uso. Descarregamento de módulos
está fora do escopo porque consumidores legítimos em tempo de inicialização podem ainda
estar em execução. Use modprobe.blacklist=af_alg na linha de comando do kernel
se você confirmou que nada no host precisa dele.security_socket_create).uname -r.CAP_BPF (ou root) para carregar o rastreador; acesso de leitura a /proc/crypto
para o auditor (nenhum privilégio é necessário para lê-lo).Apache-2.0. Consulte LICENSE.