
# Exploração de escalonamento de privilégios local no Linux para CVE-2026-31431, abusando da API de criptografia AF_ALG com splice() para modificar o cache de páginas e gerar um shell root.
Este repositório contém um pequeno PoC de escalonamento de privilégios local para Linux para a CVE-2026-31431, também conhecida como "Copy Fail".
O exploit tem como alvo o caminho algif_aead do kernel Linux na API de criptografia de espaço de usuário AF_ALG.
Ele usa AF_ALG mais splice() para forçar o kernel a escrever
no cache de páginas de /usr/bin/su em blocos de 4 bytes e, em seguida, executa su após
o cache de páginas ter sido modificado.
O PoC em copy_fail_exp.py faz quatro coisas:
AF_ALG para aead com a transformação
authencesn(hmac(sha256),cbc(aes)).setsockopt() usados na
prova de conceito original.splice() para mover dados do arquivo de destino para o caminho de solicitação AF_ALG,
que é o caminho defeituoso do kernel./bin/sh.O blob zlib não são dados aleatórios. É um payload compacto que se destina a
substituir o início de /usr/bin/su no cache de páginas para que a próxima execução de su
gere um shell root.
O código vulnerável foi introduzido nas alterações do algif_aead da era do kernel Linux 4.14
e permaneceu presente até a correção upstream que reverte a
otimização in-place.
algif_aead vulnerável.AF_ALG está habilitada, que é o padrão na
maioria das distribuições Linux de uso geral.| Distribuição | Kernel |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 |
6.18.226.19.127.0Os ramos LTS downstream só estão seguros depois que o backport do fornecedor chegar ao pacote de kernel que você realmente executa.
Use uma VM de laboratório ou um host de contêineres que você possua. Não execute isso em sistemas de produção.
/usr/bin/su existe e é setuid-root.python3 copy_fail_exp.py
/usr/bin/su e então invoca
su. Você deve terminar em um shell root ou ver um prompt root, dependendo do
ambiente.O script não tem dependências extras além da biblioteca padrão do Python 3.
python3 copy_fail_exp.py
Se você quiser inspecionar o destino primeiro, o script atualmente usa como padrão
/usr/bin/su.
Se você mantém um kernel downstream, a correção correta é aplicar o backport da reversão upstream que remove a otimização AEAD in-place:
a664bf3d603dc3bdcf9ae47cc21e0daec706d7a572548b093ee3.Fluxo de trabalho recomendado para uma árvore de kernel downstream:
git cherry-pick a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
make olddefconfig
make -j"$(nproc)"
make modules_install
make install
reboot
Se você não está recompilando kernels por conta própria, instale o pacote de kernel do fornecedor que contém o backport e reinicie com ele.
Se a correção for adiada, desative o caminho do módulo como medida temporária:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
Isso é uma mitigação, não uma correção.
6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |