FlawOpen

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

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

CVE-2022-31150: CRLF-Injection in Undici

CVE-2022-31150 ließ nicht vertrauenswürdige CR/LF-Zeichen in Undicis Request-Serialisierung gelangen. Hier stehen Patch und Upgrade-Hinweise.

💡 Einfache Erklärung (ELI5)

Eine HTTP-Anfrage ist wie ein Formular mit festen Zeilenumbrüchen: Jede Zeile enthält ein Feld. Wird ungeprüfter Text übernommen, kann ein versteckter Umbruch den Rest wie ein neues Feld aussehen lassen. Undicis Fix prüft Headerwerte, Methode und Pfad, bevor sie geschrieben werden.

Kernkonzepte & Begriffe

Undici
HTTP/1.1-Clientbibliothek für Node.js; Node.js bündelt außerdem eine Undici-Version für das eingebaute fetch.
CRLF-Injection
Nicht vertrauenswürdige Wagenrücklauf- und Zeilenvorschubbytes gelangen in ein Protokollfeld und können Zeilengrenzen verändern.
HTTP-Token
Eine eingeschränkte Zeichenauswahl für Protokollelemente wie Headernamen und Methoden.
Request-Target
Pfad und Abfrage einer HTTP-Anfrage; Steuerzeichen dürfen deren Rahmung nicht verändern.

Framework-Zuordnungen

  • CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-93

Ursachenanalyse

Vor dem Fix konnte Undici nicht vertrauenswürdige, von Eingaben beeinflusste Headerwerte mit unzulässigen Steuerzeichen serialisieren. CR/LF begrenzen Zeilen; ihre Annahme kann Headerzeilen einschleusen oder beschädigen. Der Upstream-Patch prüft Namen als HTTP-Token, weist unzulässige Zeichen in Werten zurück, validiert das Methodentoken und blockiert Steuerzeichen im Pfad. Das GitHub-Advisory nennt Paketversionen <5.8.0 als betroffen; die NVD-Beschreibung nennt <5.7.1. Beide nennen 5.8.0 als korrigiert. Es handelt sich um Request-Injection im Client; SSRF oder Offenlegung von Zugangsdaten folgen nicht automatisch, sondern hängen von Anwendung und Netzwerkpfad ab.

Schritt-für-Schritt Angriffsablauf

Schritt 1

1. Nicht vertrauenswerter Wert

Anwendungsdaten erreichen einen Undici-Header, eine Methode oder einen Pfad.

Schritt 2

2. Fehlende Prüfung

In betroffenen Versionen konnten unzulässige Steuerzeichen in die Request-Erstellung gelangen.

Schritt 3

3. Protokollgrenze

HTTP-Serialisierung verwendet Zeilengrenzen; akzeptierte Steuerzeichen können Felder einschleusen oder beschädigen.

Schritt 4

4. Patch und Eindämmung

Undici 5.8.0 prüft Headerbytes, Methodentoken und Pfadzeichen vor der Serialisierung; die Auswirkung hängt vom Kontext ab.

Quellcode: Verwundbar vs. Sicher

VERWUNDBARE IMPLEMENTIERUNG
// Relevante Serialisierungsstelle in lib/core/request.js vor a29a151
function serializeRequest(request, method, path, headers) {
  request.method = method;
  request.path = path;
  for (const [key, value] of Object.entries(headers)) {
    // Vor der Serialisierung werden keine Protokollzeichen geprüft.
    request.headers += `${key}: ${value}\r\n`;
  }
}
GEHÄRTETER SICHERHEITS-PATCH
// Gehärtetes Validierungsmuster aus dem Upstream-Request-Parser
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`;
}

Checkliste für Engineering & Systemsicherheit

Quellen