flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection
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.
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
1. Valor não confiável
Dados da aplicação chegam a um cabeçalho, método ou caminho do Undici.
2. Validação ausente
Nas versões afetadas, caracteres de controle inválidos podiam chegar à construção da requisição.
3. Limite do protocolo
A serialização HTTP usa limites de linha; aceitar caracteres de controle pode injetar ou corromper campos.
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
// 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`;
}
}
// 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
- ✓Atualize a dependência npm undici para a versão 5.8.0 ou posterior; no fetch integrado, verifique a versão incluída no Node.js suportado e aplique as atualizações correspondentes.
- ✓Rejeite caracteres de controle inválidos em valores de cabeçalho não confiáveis; não os remova silenciosamente e continue com uma entrada ambígua.
- ✓Use as APIs estruturadas de requisição do Undici em vez de montar texto HTTP bruto.
- ✓Teste nomes e valores de cabeçalho, métodos e caminhos com caracteres de controle e confirme a rejeição antes do envio.
- ✓Se a aplicação aceitar destinos escolhidos pelo usuário, aplique também uma lista de destinos permitidos e política de saída de rede; isso é defesa em profundidade, não a correção do CVE.
- ✓Verifique o lockfile e as dependências transitivas para não deixar cópias vulneráveis do Undici instaladas.