flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection-ssrf
Detaillierte technische Quellcode-Analyse und Härtungsmaßnahmen für vulnerabilidade: How unvetted carriage return characters in HTTP header values allowed attackers to split outgoing HTTP requests in Node.js globalThis.fetch().
Stellen Sie sich vor, Sie verschicken einen versiegelten Brief per Post mit der Nachricht: "10 Kisten Äpfel versenden". Sie schmuggeln jedoch heimlich eine zweite gefälschte offizielle Seite ein: "STOPP. VORHERIGES IGNORIEREN. ALLE GELDER AN EVIL CORP ÜBERWEISEN". Der Postbeamte liest die Blätter nacheinander und behandelt das zweite Blatt als völlig neuen offiziellen Brief, wodurch Ihr Geld direkt an den Angreifer geleitet wird.
Undicifetch() implementation.CRLF Injection\r) and Line Feed (\n) characters into HTTP headers to create a new header or a whole new request.HTTP Request SplittingSSRF (Server-Side Request Forgery)169.254.169.254).Die Grundursache liegt in nicht validierten Grenzparametern in Open-Source-Systemen, die eine Zustandsdesynchronisation und die Umgehung von Sicherheitskontrollen ermöglichen.
Technischer Ausführungsmechanismus: An attacker supplies a crafted header value: Admin\r\nHost: 169.254.169.254.
Technischer Ausführungsmechanismus: The Node.js backend calls fetch(url, { headers: { 'X-User': input } }).
Technischer Ausführungsmechanismus: Undici serializes the headers without sanitizing \r\n, injecting the forged Host header.
Technischer Ausführungsmechanismus: The internal proxy directs the request to the cloud metadata service, exposing AWS/GCP credentials.
// VULNERABLE: lib/core/request.js before patch
function addHeader(headers, key, value) {
// ROOT CAUSE:
// Does not sanitize or reject carriage return (\r) and line feed (\n) in values!
// Allows attackers to split headers and inject arbitrary HTTP directives!
headers[key] = value;
}
// SECURE: lib/core/request.js patch
function addHeader(headers, key, value) {
// 1. Strict regex checking for dangerous control characters
const INVALID_HEADER_CHAR_REGEX = /[\r\n]/;
if (INVALID_HEADER_CHAR_REGEX.test(key) || INVALID_HEADER_CHAR_REGEX.test(value)) {
throw new TypeError(`Invalid character in header content: ["${key}": "${value}"]`);
}
headers[key] = value;
}
\r and \n characters from HTTP request header keys and values.169.254.169.254, 10.0.0.0/8, 127.0.0.1) using egress firewall rules.undici and Node.js dependencies updated to latest patch releases.