flawopen.com/Teardowns/cve-2022-31150-undici-crlf-injection
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.
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
1. Nicht vertrauenswerter Wert
Anwendungsdaten erreichen einen Undici-Header, eine Methode oder einen Pfad.
2. Fehlende Prüfung
In betroffenen Versionen konnten unzulässige Steuerzeichen in die Request-Erstellung gelangen.
3. Protokollgrenze
HTTP-Serialisierung verwendet Zeilengrenzen; akzeptierte Steuerzeichen können Felder einschleusen oder beschädigen.
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
// 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ä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
- ✓Aktualisieren Sie die npm-Abhängigkeit undici auf 5.8.0 oder neuer; prüfen Sie bei eingebautem fetch die mit der unterstützten Node.js-Version gebündelte Version und patchen Sie Node.js.
- ✓Weisen Sie unzulässige Steuerzeichen in nicht vertrauenswürdigen Headerwerten zurück; entfernen Sie sie nicht stillschweigend und verarbeiten mehrdeutige Eingaben weiter.
- ✓Verwenden Sie Undicis strukturierte Request-APIs statt HTTP-Rohtext zusammenzusetzen.
- ✓Testen Sie Headernamen und -werte, Methoden und Pfade mit Steuerzeichen und stellen Sie sicher, dass sie vor dem Versand abgelehnt werden.
- ✓Wenn Nutzer Ziele vorgeben können, setzen Sie zusätzlich eine Ziel-Allowlist und Netzwerk-Egress-Regeln ein; das ist Defense-in-Depth, nicht der CVE-Fix.
- ✓Prüfen Sie Lockfile und transitive Abhängigkeiten auf verbliebene verwundbare Undici-Kopien.