Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
cve-2026-31431-copyfail — Análise educacional do CVE-2026-31431, uma escalada de privilégios local no kernel Linux via operação in-place AF_ALG AEAD, incluindo causa raiz técnica, detecção e mitigação. | Kitploit
Ferramentas/GitHubGitHub/darioomatos/cve-2026-31431-copyfail
Escalada de PrivilégiosFrameworks de ExploraçãoAnálise de VulnerabilidadesExploraçãoPapers e PesquisaAprendizado e EducaçãoRecursos Curados
GitHubdarioomatos/cve-2026-31431-copyfail

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

cve-2026-31431-copyfail

Análise educacional do CVE-2026-31431, uma escalada de privilégios local no kernel Linux via operação in-place AF_ALG AEAD, incluindo causa raiz técnica, detecção e mitigação.

Ver Repositório
132há 5 mesesAinda não revisado

CVE-2026-31431 — "Copy Fail" 🔐

Análise técnica educacional de uma das vulnerabilidades mais significativas do kernel Linux desde o Dirty Pipe (2022).
Este repositório é voltado para pesquisa, estudo e defesa. Nenhum exploit funcional é distribuído aqui.


Índice

  • O que é?
  • Para leigos: a analogia
  • Linha do tempo
  • Como funciona tecnicamente
  • O shellcode analisado
  • Comparação com vulnerabilidades similares
  • Sistemas afetados
  • Android é afetado?
  • Detecção
  • Mitigação e patches
  • Implementações de estudo
  • Referências

O que é?

CVE-2026-31431, apelidada de Copy Fail, é uma vulnerabilidade de escalonamento local de privilégios (LPE — Local Privilege Escalation) no kernel Linux. Ela permite que qualquer usuário sem privilégios obtenha acesso root em questão de segundos.

AtributoValor
CVECVE-2026-31431
CVSS Score7.8 HIGH
TipoLocal Privilege Escalation (LPE)
Subsistemacrypto/algif_aead.c — AF_ALG
Introduzida emKernel 4.14 (commit 72548b093ee3, julho 2017)
Corrigida em6.18.22 / 6.19.12 / 7.0 (commit a664bf3d603d)
Descoberta porTaeyang Lee — Theori / Xint Code
Divulgação pública29 de abril de 2026
PoC públicoSim — script Python de ~732 bytes

Para leigos: a analogia

Imagine que o sistema operacional tem uma memória de trabalho (chamada de page cache) onde guarda cópias dos arquivos que estão sendo usados. Quando você executa um programa, o sistema carrega esse programa nessa memória e o executa a partir dali — não diretamente do disco.

A Copy Fail permite que um usuário comum altere essa cópia em memória de um programa especial (um binário setuid, como o comando su) sem tocar no arquivo original no disco. O arquivo no disco continua intacto, mas quando o programa é executado, o sistema lê a versão corrompida da memória.

É como trocar a receita de um prato na memória de um chef enquanto ele está cozinhando — o livro de receitas original não muda, mas o prato que sai é completamente diferente.

O resultado: o programa corrompido executa código do atacante com permissões de root.

O que torna isso especialmente perigoso:

  • Não há janela de condição de corrida — é determinístico
  • Não deixa rastro no disco (forense de disco não detecta)
  • Funciona em praticamente todas as distribuições Linux desde 2017
  • O exploit original tem apenas ~700 bytes de Python

Linha do tempo

2015  → AF_ALG ganha suporte a AEAD (algif_aead.c)
          authencesn introduz escrita em assoclen+cryptlen (mas ainda out-of-place)

2017  → Commit 72548b093ee3: otimização converte operação para in-place
          req->src = req->dst  →  páginas do page cache entram na scatterlist de escrita
          BUG INTRODUZIDO — passa despercebido por ~9 anos

2026 Mar 23 → Taeyang Lee (Theori) reporta ao time de segurança do kernel Linux
               Descoberta assistida por IA (Xint Code — ~1h de scan)

2026 Abr  1 → Patch mainline commitado (a664bf3d603d) — reverte a otimização de 2017

2026 Abr 22 → CVE-2026-31431 atribuída

2026 Abr 29 → Divulgação pública + PoC Python liberado
               Arch Linux, Fedora, Amazon Linux já com patches
               Ubuntu, RHEL, SUSE publicam guidance de mitigação

2026 Mai  1 → Kernels corrigidos chegam a AlmaLinux, CloudLinux, Rocky Linux
               Adicionado ao CISA KEV (Known Exploited Vulnerabilities)
               Exploits em Go e Rust aparecem em repositórios públicos

Como funciona tecnicamente

Visão geral do fluxo

Atacante (usuário sem privilégios)
    │
    ├─ 1. socket(AF_ALG, SOCK_SEQPACKET)
    │       Cria socket de criptografia no kernel
    │       bind: "authencesn(hmac(sha256),cbc(aes))"
    │
    ├─ 2. setsockopt: define chave AEAD + authsize=4
    │
    ├─ 3. accept() → op_socket
    │
    ├─ 4. sendmsg([AAD + ciphertext], cmsg=[DECRYPT, IV, assoclen])
    │       AAD bytes [4:8] = os 4 bytes que queremos ESCREVER no page cache
    │
    ├─ 5. pipe() + splice(arquivo_alvo → pipe → op_socket)
    │       CRÍTICO: injeta páginas do page cache na scatterlist do AF_ALG
    │       As páginas do arquivo agora estão no destino GRAVÁVEL da operação
    │
    ├─ 6. recv() → dispara o authencesn
    │       authencesn::scatterwalk_map_and_copy(seqno_lo, dst, assoclen+cryptlen, 4, WRITE)
    │       Escreve 4 bytes em dst[assoclen + cryptlen]
    │       = escreve DIRETAMENTE no page cache do arquivo-alvo ✓
    │       HMAC falha → retorna EBADMSG → IGNORADO
    │
    └─ 7. Repete (4 bytes por iteração) até cobrir todo o ELF replacement
           Executa o binário alvo → root shell

Causa raiz: operação in-place + sg_chain()

O bug vive em crypto/algif_aead.c. Em 2017, a operação AEAD foi convertida para in-place para ganhar performance:

// Antes (seguro): req->src e req->dst são scatterlists separadas
// Depois (bugado, commit 72548b093ee3):
req->src = req->dst;  // mesma scatterlist para entrada e saída

// Para a tag de autenticação, em vez de copiar, o código encadeia por referência:
sg_chain(areq_ctx->rsgl[0].sg, n, areq_ctx->tsgl);
// ↑ As páginas do page cache (vindas do splice) agora estão na scatterlist de SAÍDA

O algoritmo authencesn usa o buffer de destino como scratch space para reorganizar bytes do Extended Sequence Number (ESN) do IPsec:

// Em authencesn_decrypt():
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^
//                                       offset que ultrapassa o output buffer
//                                       e cai nas páginas do page cache encadeadas

Por que não deixa rastro

A escrita contorna completamente o VFS. A página modificada nunca é marcada como dirty pelo mecanismo de writeback do kernel. O arquivo em disco permanece intacto. Ferramentas de integridade baseadas em hash (aide, tripwire, inotifywait) não detectam nada porque monitoram o disco, não o page cache.


O shellcode analisado

O exploit embute um mini-ELF de 160 bytes comprimido com zlib. Após descompressão, a parte executável é:

; Offset 0x78 no arquivo ELF (entry point)

xor eax, eax          ; limpa registradores
xor edi, edi          ; uid = 0
mov al, 0x69          ; syscall 105 = setuid
syscall               ; setuid(0) → effective UID = root

lea rdi, [rel bin_sh] ; rdi → "/bin/sh\0"
xor esi, esi          ; argv = NULL
push 0x3b             ; syscall 59 = execve
pop rax
cdq                   ; rdx = 0 (envp = NULL)
syscall               ; execve("/bin/sh", NULL, NULL)

; Fallback
xor edi, edi
push 0x3c             ; syscall 60 = exit
pop rax
syscall               ; exit(0)

bin_sh: db "/bin/sh", 0

Estrutura do ELF mínimo (160 bytes no total):

Offset 0x00–0x3F  → ELF64 Header (64 bytes)
                    e_type=ET_EXEC, e_machine=EM_X86_64
                    e_entry=0x400078, e_phnum=1

Offset 0x40–0x77  → Program Header PT_LOAD (56 bytes)
                    p_flags=PF_R|PF_X, p_vaddr=0x400000
                    p_filesz=0x9e

Offset 0x78–0x9D  → Shellcode (26 bytes código + "/bin/sh\0")

Comparação com vulnerabilidades similares

Baixar ferramenta