
Kit de pesquisa e detecção para LPE no kernel Linux CVE-2026-31431, incluindo análise de exploits, regras YARA, detecção via auditd/Falco, guia de correção e ambiente de laboratório.
algif_aead do Kernel LinuxCISA KEV | CVSS 7.8 ALTO | Afeta kernels Linux 4.14 – início de 2026 (~9 anos)
CVE-2026-31431, apelidada de "Copy Fail", é uma vulnerabilidade de escalada de privilégio local (LPE) de alta gravidade no subsistema criptográfico do kernel Linux. Um usuário local com privilégios baixos pode escalar para root em segundos em qualquer sistema sem correção.
| Atributo | Valor |
|---|---|
| CVE | CVE-2026-31431 |
| Apelido | Copy Fail |
| CVSS v3.1 | 7.8 ALTO |
| Vetor de Ataque | Local |
| Privilégios Necessários | Baixos |
| Interação do Usuário | Nenhuma |
| Componente | crypto/algif_aead.c — template authencesn |
| Introduzida | 2017 (commit 72548b093ee3) |
| Divulgada | 2026 |
| Anos Silenciosa | ~9 anos |
| CISA KEV | Sim |
| PoC Público | Sim (script Python autônomo de 732 bytes) |
detection/check_vulnerable.sh antes e depois da remediação.CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| Métrica | Valor | Justificativa |
|--------|-------|-----------|
| Vetor de Ataque | **Local** | Requer acesso ao shell (SSH, exec em contêiner, físico) |
| Complexidade do Ataque | **Baixa** | Confiável, totalmente automatizado — não requer condição de corrida |
| Privilégios Necessários | **Baixos** | Qualquer conta de usuário sem privilégios |
| Interação do Usuário | **Nenhuma** | Nenhuma interação da vítima necessária |
| Confidencialidade | **Alta** | Comprometimento total do sistema |
| Integridade | **Alta** | Comprometimento total do sistema |
| Disponibilidade | **Alta** | Comprometimento total do sistema |
### Panorama de Ameaças
| Fator | Avaliação |
|--------|-----------|
| Disponibilidade de PoC | Pública, armada, Python autônomo de 732 bytes |
| Confiabilidade do Exploit | Alta — funciona em distros testadas sem modificação |
| Dificuldade de Detecção | Alta — sem gravações em disco, sem páginas sujas |
| Habilidade Necessária do Atacante | Baixa — script kiddie com PoC público |
| CISA KEV | Adicionado em 2026 — monitorado ativamente |
| Microsoft Defender | Sinalizado como sob investigação ativa |
### Ambientes Afetados
| Ambiente | Risco |
|-------------|------|
| Servidores Linux em hardware físico | Crítico |
| VMs Linux (nuvem ou on-premises) | Crítico |
| Nós Kubernetes | Crítico (também permite escape de contêiner) |
| Hosts Docker | Crítico |
| Hospedagem compartilhada / multi-tenant | Crítico |
| WSL2 / Linux no Windows | Avaliar conforme a versão do kernel |
---
## 3. Mergulho Técnico Aprofundado
### 3.1 Contexto: AF_ALG e AEAD
O kernel Linux expõe operações criptográficas ao espaço do usuário por meio de **soquetes AF_ALG** (`AF_ALG = 38`). Essa interface (`algif_aead`) permite que aplicações sem privilégios invoquem aceleradores de hardware criptográfico do kernel sem precisar de código em modo kernel.
**AEAD** (Autenticação de Criptografia com Dados Associados), algoritmos como AES-GCM e ChaCha20-Poly1305 são amplamente usados para TLS, criptografia de disco e protocolos VPN. O template vulnerável é `authencesn` — uma composição AEAD usando `hmac(sha256)` + `cbc(aes)` com suporte a Número de Sequência Estendido (ESN), comumente usado em IPsec.
### 3.2 Causa Raiz
Em 2017, o commit `72548b093ee3` introduziu a **operação AEAD in-place** em `algif_aead` como uma otimização de desempenho — permitindo que o motor criptográfico lesse e gravasse no mesmo buffer. Isso era falho:```
The bug chain:
1. Caller binds AF_ALG socket to:
authencesn(hmac(sha256),cbc(aes))
2. Caller sends a decryption request via sendmsg() with specific flags
3. Caller uses splice() to feed PAGE CACHE PAGES from an open file
descriptor directly into the socket's scatterlist
4. The authencesn template, during ESN header processing, uses the
OUTPUT BUFFER as scratch space — writing 4 bytes past the
expected output boundary
5. Because the scatterlist contains page cache pages (not private
copies), this scratch write lands DIRECTLY IN THE PAGE CACHE
6. Page cache is shared kernel-wide — all processes reading the
same file now see the modified bytes
Key insight: splice() is zero-copy — it hands page cache references
to the socket. The in-place "optimization" then writes INTO those
pages. No dirty bit is set because the write goes through the crypto
engine, not the normal write path.
A vulnerabilidade fornece uma escrita controlada de 4 bytes no cache de páginas de qualquer arquivo que o atacante possa abrir para leitura:
| Propriedade | Valor |
|---|---|
| Tamanho da escrita | 4 bytes |
| Controle de offset | Sim — controlado pelo atacante via offset do splice |
| Alvo | Cache de páginas de qualquer arquivo legível |
| Marcação de página suja | Nenhuma |
| Modificação no disco | Nenhuma |
| Atualização de timestamp | Nenhuma |
| Entrada no log do kernel | Nenhuma (a menos que auditd esteja configurado) |
A escrita é repetível — o exploit faz um loop da escrita de 4 bytes para corrigir sequências de código maiores.
[1] Open /usr/bin/su (or any setuid-root binary) for reading ↓ [2] Map a copy to find target instruction bytes (e.g., UID check, execve path, security gate) ↓ [3] Compute exact page cache offset of target bytes ↓ [4] Set up AF_ALG socket → authencesn(hmac(sha256),cbc(aes)) ↓ [5] splice() the target binary's page cache into the socket ↓ [6] Trigger decryption → authencesn scratch write patches the target bytes in page cache (4 bytes per iteration) ↓ [7] Repeat for each 4-byte patch needed ↓ [8] Execute /usr/bin/su → runs root-owned setuid binary but now with attacker-controlled code in page cache ↓ [9] Root shell
### 3.5 Por que as Defesas Padrão Falham