FlawOpen

flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection

● CVE-2022-31150 · CVSS 5.3 · Média
Pesquisa · FlawOpen

CVE-2022-31150: injeção CRLF no Undici

CVE-2022-31150 permitia que CR/LF não confiáveis chegassem à serialização de requisições do Undici. Veja a correção e como atualizar.

💡 Explicação em Linguagem Simples (ELI5)

Uma requisição HTTP é como um formulário com quebras de linha rígidas: cada linha tem um campo. Se alguém copiar texto sem verificá-lo, uma quebra escondida pode fazer o restante parecer um novo campo. A correção do Undici valida os valores dos cabeçalhos, o método e o caminho antes de gravá-los.

Conceitos Centrais e Termos

Undici
Biblioteca HTTP/1.1 para Node.js; o Node.js também inclui uma implementação do Undici para o fetch integrado.
Injeção CRLF
Bytes de retorno de carro e avanço de linha não confiáveis entram em um campo do protocolo e podem alterar limites entre linhas.
Token HTTP
Conjunto restrito de caracteres usado em elementos do protocolo, como nomes de cabeçalho e métodos.
Alvo da requisição
Caminho e consulta enviados em uma requisição HTTP; caracteres de controle não podem alterar seu enquadramento.

Mapeamentos de frameworks

  • Referência CWE para a fraqueza descrita neste guia: CWE-93

Análise de Causa Raiz

Antes da correção, o Undici podia serializar valores de cabeçalho influenciados por entrada não confiável que continham caracteres de controle inválidos. CR/LF delimitam linhas; aceitá-los pode injetar ou corromper linhas de cabeçalho. O patch valida nomes como tokens HTTP, rejeita caracteres inválidos nos valores, valida o token do método e bloqueia caracteres de controle no caminho. O aviso do GitHub lista versões do pacote anteriores à 5.8.0; a descrição do NVD cita anteriores à 5.7.1. Ambos indicam a 5.8.0 como corrigida. Trata-se de injeção na requisição do cliente; SSRF ou exposição de credenciais não são consequências automáticas e dependem da aplicação e do caminho de rede.

Fluxo de Ataque Passo a Paso

Passo 1

1. Valor não confiável

Dados da aplicação chegam a um cabeçalho, método ou caminho do Undici.

Passo 2

2. Validação ausente

Nas versões afetadas, caracteres de controle inválidos podiam chegar à construção da requisição.

Passo 3

3. Limite do protocolo

A serialização HTTP usa limites de linha; aceitar caracteres de controle pode injetar ou corromper campos.

Passo 4

4. Correção e contenção

O Undici 5.8.0 valida bytes de cabeçalho, tokens do método e caracteres do caminho antes da serialização; o impacto depende do contexto.

Código-Fonte: Vulnerável vs. Seguro

IMPLEMENTAÇÃO VULNERÁVEL
// Ponto relevante de serialização em lib/core/request.js antes de a29a151
function serializeRequest(request, method, path, headers) {
  request.method = method;
  request.path = path;
  for (const [key, value] of Object.entries(headers)) {
    // Não há validação de caracteres do protocolo antes da serialização.
    request.headers += `${key}: ${value}\r\n`;
  }
}
PATCH SEGURO E ROBUSTO
// Padrão de validação reforçada do parser upstream da requisição
const token = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
const invalidFieldValue = /[^\t\x20-\x7e\x80-\xff]/;
const invalidPath = /[^\u0021-\u00ff]/;

function validateRequestTarget(method, path) {
  if (!token.test(method)) throw new InvalidArgumentError('invalid request method');
  if (invalidPath.test(path)) throw new InvalidArgumentError('invalid request path');
}

function processHeader(request, key, value) {
  if (!token.test(key)) throw new InvalidArgumentError('invalid header key');
  if (invalidFieldValue.test(value)) throw new InvalidArgumentError(`invalid ${key} header`);
  request.headers += `${key}: ${value}\r\n`;
}

Lista de Verificação de Segurança para Engenharia

Fontes