flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection
CVE-2024-27980: Node.js no Windows
No Windows, spawn() e spawnSync() podiam permitir injeção de comandos ao executar arquivos batch, mesmo sem a opção shell.
Imagine que um programa entrega argumentos a um arquivo batch, mas o Windows precisa de um interpretador de comandos para executá-lo. Esse interpretador pode reinterpretar argumentos como sintaxe de comando. O Node.js corrigiu o problema recusando a execução direta de arquivos batch, em vez de tentar adivinhar uma forma segura de escapar cada argumento.
Conceitos Centrais e Termos
child_process.spawn()- API assíncrona do Node.js para iniciar um processo com um executável e uma lista de argumentos.
Arquivo batch- Arquivo .bat ou .cmd interpretado pelo shell do Windows, não um executável comum com parsing universal de argv.
Metacaractere de shell- Caractere cujo significado depende do interpretador de comandos e pode alterar a estrutura do comando.
EINVAL- Código de erro usado pelo Node.js para rejeitar a execução direta insegura de arquivos batch.
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-77
Análise de Causa Raiz
No Windows, arquivos .bat e .cmd são interpretados por um shell; os argumentos não são sempre escapáveis de forma inequívoca. O aviso do Node.js diz que argumentos maliciosos podiam injetar comandos por child_process.spawn() e spawnSync() mesmo sem shell habilitado. O patch upstream detecta nomes que terminam em .bat ou .cmd, sem diferenciar maiúsculas e minúsculas, e retorna EINVAL antes de chamar uv_spawn(). A correção não implementa sanitizeBatchArg() nem prova que shell: true é seguro. Um aviso posterior identificou a correção incompleta para outras extensões de arquivos batch (CVE-2024-36138); use uma versão atualizada que inclua esse segundo patch.
Fluxo de Ataque Passo a Paso
Aplicação chama a API de processos
Em Windows, a aplicação usa child_process.spawn() ou spawnSync() para iniciar um arquivo .bat ou .cmd com argumentos que podem conter dados externos.
O destino é um arquivo batch
A execução de arquivos batch envolve regras de shell; uma lista de argumentos não elimina, por si só, a interpretação de metacaracteres.
O Windows interpreta os argumentos
O tratamento vulnerável podia permitir que um argumento fosse interpretado como sintaxe de comando, mesmo com shell: false.
Node.js bloqueia a execução direta
O patch retorna EINVAL para a execução direta de .bat/.cmd. CVE-2024-36138 mostrou uma lacuna residual em outras extensões; instale versões que incluam ambas as correções.
Código-Fonte: Vulnerável vs. Seguro
// Trecho de src/process_wrap.cc antes do patch de segurança
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// O nome do arquivo era passado a uv_spawn() sem rejeitar arquivos em lote.
// Trecho do patch upstream da CVE-2024-27980
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// Nem sempre é possível escapar argumentos de arquivos em lote sem ambiguidade.
if (IsWindowsBatchFile(options.file))
err = UV_EINVAL;
if (err == 0) {
err = uv_spawn(env->event_loop(), &wrap->process_, &options);
wrap->MarkAsInitialized();
}
Lista de Verificação de Segurança para Engenharia
- ✓Atualize para uma versão Node.js suportada que inclua os patches de
CVE-2024-27980eCVE-2024-36138. - ✓Evite executar scripts batch com dados externos; prefira um executável direto com argumentos validados.
- ✓Se o uso de shell for inevitável, trate shell: true como execução de comandos e aplique validação estrita e controles de autorização.
- ✓Adicione testes Windows para
spawn()espawnSync()com extensões batch, verificando rejeição segura e códigos EINVAL.