FlawOpen

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

● CVE-2022-31150 · CVSS 5.3 · Media
Investigación · FlawOpen

CVE-2022-31150: inyección CRLF en Undici

CVE-2022-31150 permitía que CR/LF no confiables llegaran a la serialización de solicitudes de Undici. Revisa el parche y la actualización.

💡 Explicación en Lenguaje Sencillo (ELI5)

Una solicitud HTTP es como un formulario con saltos de línea definidos: cada línea contiene un campo. Si alguien copia texto sin revisarlo, un salto oculto puede hacer que lo siguiente parezca un campo nuevo. La corrección de Undici valida los valores de cabecera, el método y la ruta antes de escribirlos.

Conceptos Clave y Términos

Undici
Biblioteca HTTP/1.1 para Node.js; Node.js también incluye una implementación de Undici para fetch integrado.
Inyección CRLF
Bytes de retorno de carro y salto de línea no confiables llegan a un campo del protocolo y pueden cambiar los límites entre líneas.
Token HTTP
Conjunto restringido de caracteres usado por elementos del protocolo, como nombres de cabecera y métodos.
Destino de solicitud
Ruta y consulta enviadas en una solicitud HTTP; los caracteres de control no deben alterar su encuadre.

Mapeos de marcos

  • Referencia CWE para la debilidad descrita en esta guía: CWE-93

Análisis de Causa Raíz

Antes de la corrección, Undici podía serializar valores de cabecera influidos por datos no confiables que contenían caracteres de control no válidos. CR/LF delimitan líneas; aceptarlos puede inyectar o corromper líneas de cabecera. El parche valida los nombres como tokens HTTP, rechaza caracteres no válidos en los valores, valida el token del método y bloquea caracteres de control en la ruta. El aviso de GitHub enumera versiones del paquete anteriores a 5.8.0; la descripción de NVD indica anteriores a 5.7.1. Ambos señalan 5.8.0 como versión corregida. Es una inyección en la solicitud del cliente; SSRF o exposición de credenciales no son consecuencias automáticas y dependen de la aplicación y la ruta de red.

Flujo de Ataque Paso a Paso

Paso 1

1. Valor no confiable

Los datos de la aplicación llegan a una cabecera, método o ruta de Undici.

Paso 2

2. Falta de validación

En las versiones afectadas, los caracteres de control no válidos podían llegar a la construcción de la solicitud.

Paso 3

3. Límite del protocolo

La serialización HTTP usa límites de línea; aceptar caracteres de control puede inyectar o corromper campos.

Paso 4

4. Parche y contención

Undici 5.8.0 valida bytes de cabecera, tokens del método y caracteres de la ruta antes de serializar; el impacto depende del contexto.

Código Fuente: Vulnerable vs. Seguro

IMPLEMENTACIÓN VULNERABLE
// Punto de serialización relevante en 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)) {
    // No se validan los caracteres del protocolo antes de serializar.
    request.headers += `${key}: ${value}\r\n`;
  }
}
PARCHE SEGURO Y ROBUSTO
// Patrón de validación reforzada del parser upstream de solicitudes
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 Verificación de Seguridad para Ingeniería

Fuentes