Vulnerabilidade BatBadBut, que afeta bibliotecas padrão de várias linguagens de programação

Aplicativos que executam scripts no formato bat e cmd na plataforma Windows usando funções padrão para iniciar processos estão vulneráveis a uma falha que permite a execução de código malicioso ao passar argumentos sem o devido tratamento de caracteres especiais. A vulnerabilidade foi codinomeada como BatBadBut e se manifesta em aplicativos que utilizam bibliotecas padrão de linguagens como Rust, PHP, Node.js, Python, Ruby, Go, Erlang e Haskell.

O problema é classificado como uma vulnerabilidade porque afeta funções da biblioteca, como Command::arg e Command::args em Rust, que são projetadas para passar argumentos diretamente ao processo, sem que sejam processados por um interpretador de comandos. Supõe-se que o desenvolvedor do aplicativo pode não validar os argumentos, pois eles são passados diretamente ao processo que está sendo iniciado. Enquanto em sistemas Unix os argumentos são passados ao processo separadamente em um array, no Windows, ao usar a API CreateProcess, os argumentos são entregues como uma única string, e o seu parsing é de responsabilidade do processo iniciado.

Ao executar scripts bat e cmd na plataforma Windows, a função CreateProcess() chama implicitamente o arquivo executável cmd.exe, mesmo que o aplicativo não o especifique na chamada. O programa cmd.exe contém uma lógica complexa para separar os argumentos, distinguindo entre seus próprios argumentos, os do script sendo executado e os argumentos desse script. Para proteger contra a substituição de argumentos na plataforma Windows, as bibliotecas padrão das linguagens de programação utilizam manipuladores de escaping, que, como se revelou, podem ser contornados manipulando as aspas duplas.

Por exemplo, em um programa que chama o script ‘.\/test.bat’ com um argumento baseado em dados recebidos do usuário, um atacante pode passar o valor ‘»&calc.exe’, que, ao executar o script, será expandido para a string ‘C:\Windows\System32\cmd.exe \/c .\test.bat «»&calc.exe’ e resultará na execução do processo calc.exe. Esse método funciona também ao chamar scripts implicitamente, quando um arquivo executável denominado 'test' é iniciado sem uma extensão, sendo que um dos diretórios mencionados na variável de ambiente PATH contém o arquivo 'test.bat'.

Atualmente, uma correção já foi lançada (CVE-2024-24576) para a biblioteca padrão da linguagem Rust e está incluída na atualização Rust 1.77.2. Atualizações para corrigir a vulnerabilidade estão em preparação para Node.js e PHP (as tags 8.2.18 e 8.3.5 já foram emitidas, mas os lançamentos ainda não foram anunciados). Os projetos Python, Ruby, Go, Erlang e Haskell limitaram-se até agora a incluir um aviso na documentação sobre a manifestação da vulnerabilidade na ausência de um devido escape de caracteres especiais.

No Rust 1.77.2, uma verificação adicional foi adicionada à biblioteca padrão, que retorna um erro na presença de caracteres especiais no argumento do script executável, os quais não podem ser garantidamente escapados com segurança. Para desenvolvedores que implementam sua própria lógica de escape, foi fornecido o método CommandExt::raw_arg, que desativa completamente o escape durante as chamadas de biblioteca.

A adição de proteção é dificultada pelo fato de que um simples escape de aspas duplas não é suficiente, pois o interpretador de comandos processa e expõe variáveis como "%PATH%". Por exemplo, as aspas podem ser injetadas manipulando a variável de ambiente "%CMDCMDLINE%", especificando ao invés de '"&calc.exe' — '%CMDCMDLINE:~-1%&calc.exe'.

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster