flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection
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.
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
1. Valor no confiable
Los datos de la aplicación llegan a una cabecera, método o ruta de Undici.
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.
3. Límite del protocolo
La serialización HTTP usa límites de línea; aceptar caracteres de control puede inyectar o corromper campos.
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
// 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`;
}
}
// 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
- ✓Actualiza la dependencia npm undici a 5.8.0 o posterior; para fetch integrado, verifica la versión incluida en la versión compatible de Node.js y aplica sus parches.
- ✓Rechaza caracteres de control no válidos en valores de cabecera no confiables; no los elimines silenciosamente para continuar con datos ambiguos.
- ✓Usa las API estructuradas de solicitudes de Undici en vez de construir texto HTTP sin procesar.
- ✓Añade pruebas para nombres y valores de cabecera, métodos y rutas con caracteres de control; confirma que se rechazan antes del envío.
- ✓Si la aplicación acepta destinos controlados por usuarios, aplica además una lista de destinos permitidos y una política de salida de red; es defensa en profundidad, no el arreglo del CVE.
- ✓Revisa el archivo de bloqueo y las dependencias transitivas para que no queden copias vulnerables de Undici instaladas.