Pesquisadores da Xint identificaram uma vulnerabilidade no núcleo do Linux (CVE-2026-31431) que permite que um usuário não privilegiado obtenha acesso root ao sistema. A questão foi nomeada 'Copy Fail'. Um protótipo de exploit está disponível. A possibilidade de exploração da vulnerabilidade foi demonstrada no Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 10.1 e SUSE 16, mas observa-se que pacotes com núcleos de outras distribuições, incluindo Debian, Arch, Fedora, Rocky e Alma, também estão sujeitos ao problema, embora não tenham sido testados separadamente.
A vulnerabilidade é causada por um erro lógico na API crypto (AF_ALG) do núcleo do Linux, cometido ao realizar uma otimização em 2017 que eliminou a dupla bufferização através da execução em local (in-place) de operações de criptografia de bloco AEAD (Criptografia Autenticada com Dados Associados). O problema surgiu devido ao uso imprudente da função splice(), que transfere dados entre descritores de arquivo e canais (pipe) sem cópias, passando referências a elementos no cache de páginas. Após a otimização, ao transferir um arquivo para o socket AF_ALG para descriptografia, uma referência não era escrita para um buffer separado, mas uma referência direta para os elementos do cache de páginas do núcleo com os dados do arquivo.
Posteriormente, durante o processo de descriptografia, os dados vinculados por referência do tag de autenticação (‘authentication tag’) foram misturados com os dados autenticáveis adicionais (AAD, Dados Autenticados Associados) que estavam sendo copiados para o buffer RX, assim como o texto cifrado, e o deslocamento para a operação de gravação na tag de autenticação era calculado em relação aos dados copiados sem as devidas verificações, permitindo a sobrescrição de áreas arbitrárias no cache de páginas.
A vulnerabilidade permite que a cada solicitação sejam sobrescritos 4 bytes em um deslocamento selecionado, o que permite que um atacante, ao enviar uma série de solicitações, modifique o conteúdo de qualquer arquivo acessível para leitura no sistema, desde que tenha sido colocado em cache. Como em qualquer operação de leitura de arquivos, o conteúdo é entregue primeiro a partir do cache de páginas, após a substituição das informações no cache, o núcleo ou o processo, ao ler os dados do arquivo, receberá dados não factuais, mas alterados, o que pode ser utilizado para injetar código em arquivos executáveis ou bibliotecas compartilhadas carregadas.
Para executar o código com permissões de root, é suficiente alterar o cache de página para qualquer arquivo executável com a flag suid root.
No exploit proposto, é realizada a leitura do arquivo executável /usr/bin/su e a modificação do conteúdo carregado no cache de página desse arquivo para inserir seu próprio código. Ao executar a ferramenta 'su' posteriormente, não será carregado na memória o arquivo executável original do armazenamento, mas uma cópia modificada do cache de página.
O exploit é universal, não requer adaptação para distribuições ou versões do kernel, e pode ser utilizado com quaisquer distribuições. Como a isolação em contêineres utiliza um cache de página compartilhado para todos os contêineres, a vulnerabilidade pode ser explorada para obter acesso ao ambiente host a partir do contêiner (um exploit para contornar a isolação no Kubernetes será publicado posteriormente).
A vulnerabilidade foi identificada com a ajuda de IA após cerca de uma hora de experimentos com a análise do código do subsistema criptográfico do kernel. O problema se manifesta 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. O status da correção das vulnerabilidades nas distribuições pode ser avaliado nas seguintes páginas: Debian, Ubuntu, SUSE/openSUSE, RHEL, Gentoo, Arch,
Fedora, ROSA.
Como uma medida de contorno, é possível desabilitar o módulo do kernel algif_aead, que é utilizado no OpenSSL quando o motor afalg é explicitamente ativado e em aplicativos específicos (é possível verificar a existência de aplicativos em execução semelhantes com o comando 'lsof | grep AF_ALG'):
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead
Fonte: opennet.ru
