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

● CVE-2022-31150 · CVSS 6.5 · Mittel
Sicherheitsforschung · FlawOpen

CVE-2022-31150: Node.js Undici CRLF Injection & SSRF Teardown

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().

💡 Einfache Erklärung (ELI5)

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.

Kernkonzepte & Begriffe

Undici
The official next-generation HTTP/1.1 client for Node.js, powering the global fetch() implementation.
CRLF Injection
Injecting Carriage Return (\r) and Line Feed (\n) characters into HTTP headers to create a new header or a whole new request.
HTTP Request Splitting
A vulnerability where an attacker splits a single outgoing HTTP connection into two separate requests.
SSRF (Server-Side Request Forgery)
Coercing a backend server to issue unauthorized requests to internal cloud metadata APIs (169.254.169.254).

Ursachenanalyse

Die Grundursache liegt in nicht validierten Grenzparametern in Open-Source-Systemen, die eine Zustandsdesynchronisation und die Umgehung von Sicherheitskontrollen ermöglichen.

Schritt-für-Schritt Angriffsablauf

Step 1

Angriffsphase: Input Submission

Technischer Ausführungsmechanismus: An attacker supplies a crafted header value: Admin\r\nHost: 169.254.169.254.

Step 2

Angriffsphase: Application Issues Fetch

Technischer Ausführungsmechanismus: The Node.js backend calls fetch(url, { headers: { 'X-User': input } }).

Step 3

Angriffsphase: Header Splitting in Undici

Technischer Ausführungsmechanismus: Undici serializes the headers without sanitizing \r\n, injecting the forged Host header.

Step 4

Datenabfluss : Cloud Metadata Exfiltration

Technischer Ausführungsmechanismus: The internal proxy directs the request to the cloud metadata service, exposing AWS/GCP credentials.

Quellcode: Verwundbar vs. Sicher

VERWUNDBARE IMPLEMENTIERUNG
// 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;
}
GEHÄRTETER SICHERHEITS-PATCH
// 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;
}

Checkliste für Engineering & Systemsicherheit

Quellen