FlawOpen

flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection

● CVE-2024-27980 · CVSS 8.1 · Alta
Pesquisa · FlawOpen

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.

💡 Explicação em Linguagem Simples (ELI5)

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

Passo 1

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.

Passo 2

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.

Passo 3

O Windows interpreta os argumentos

O tratamento vulnerável podia permitir que um argumento fosse interpretado como sintaxe de comando, mesmo com shell: false.

Passo 4

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

IMPLEMENTAÇÃO VULNERÁVEL
// 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.
PATCH SEGURO E ROBUSTO
// 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

Fontes