flawopen.com/ReDoS/JavaScript RegExp
Ist JavaScript RegExp anfällig für ReDoS?
Stellen Sie sich vor, jemand probiert jede mögliche Aufteilung eines Formularstapels aus, wenn der letzte Stempel fehlt: Ein mehrdeutiges Muster kann die Regex-Engine dieselben Zeichen immer wieder prüfen lassen. V8s üblicher RegExp-Pfad kann so zurückspringen; begrenzte Eingaben und Muster mit vorhersehbarem Aufwand halten die Arbeit im Rahmen. In Node läuft ein synchroner Match auf dem Event-Loop-Thread und verzögert andere Callbacks im Prozess. V8 dokumentiert eine experimentelle Engine ohne Backtracking, die über Flags aktiviert wird und Musterbeschränkungen hat; gehen Sie nicht davon aus, dass sie in Produktion aktiv ist.
// Mehrdeutige verschachtelte Wiederholung in Request-Daten
const re = /^(\w+\s?)*$/;
app.post('/search', (req, res) => {
const q = req.body.q;
if (!re.test(q)) return res.sendStatus(400);
res.sendStatus(200);
});
// Eingabe begrenzen und nur die Feldgrammatik akzeptieren
app.post('/search', (req, res) => {
const q = req.body.q;
if (typeof q !== 'string' || q.length > 128)
return res.sendStatus(400);
// Beispielgrammatik: ASCII-Wortzeichen und Leerzeichen
if (!/^[\w ]{1,128}$/.test(q))
return res.sendStatus(400);
res.sendStatus(200);
});
Warum Node.js die Auswirkungen von ReDoS verstärkt
Ein synchroner Regex-Match läuft auf dem JavaScript-Thread, der Callbacks in einem Node.js-Prozess bearbeitet. Dauert ein Muster bei einer Fast-Übereinstimmung oder einem Fehlschlag lange, kann der Event Loop bis zum Ende keine anderen Callbacks ausführen oder Anfragen weiterbearbeiten. Worker, mehrere Prozesse oder Replikate können Kapazität erhalten; jeder betroffene Prozess kann dennoch blockieren.
Die Auswirkungen hängen von Erreichbarkeit, Musterkomplexität, Eingabelimits und Topologie ab. Ein Angreifer muss den teuren Match-Pfad mit geeigneter Eingabe erreichen. Behandeln Sie dies als Verfügbarkeitsrisiko für den betroffenen Prozess; ob der gesamte Dienst ausfällt, hängt von Workern, Replikaten, Routing und Health Checks ab.
Realer npm-Fall: CVE-2026-83606 in xmldom
Der geprüfte Hinweis zu @xmldom/xmldom meldet CWE-1333 bei der Verarbeitung von Processing Instructions: Die anfällige Grammatik lässt eine gierige Leerzeichengruppe und eine träge Datengruppe dieselben Leerzeichen verbrauchen. Fehlt der Abschluss ?>, probiert der Parser viele Aufteilungen und benötigt quadratische Zeit. Betroffen sind Versionen 0.9.0-beta.9 bis 0.9.10; 0.9.11 verhindert, dass der Trenner Leerzeichen an die Datengruppe zurückgibt. Der Hinweis grenzt das Problem auf den Scoped-Paketpfad 0.9.x ein; 0.8.x und das Paket ohne Scope werden nicht als betroffen genannt.
Dependency-Scans helfen, beweisen aber keine Regex-Sicherheit
npm audit meldet bekannte Hinweise zu Abhängigkeiten im Projektbaum; es analysiert nicht jede Regex im Quellcode und findet keine unveröffentlichten ReDoS-Fehler. Halten Sie direkte und transitive Abhängigkeiten aktuell, prüfen Sie betroffene Aufrufpfade und untersuchen Sie separat Muster, die benutzergesteuerten Text verarbeiten.
npm audit --omit=dev
Der Audit deckt bekannte Hinweise ab, nicht jedes Regex-Risiko. Bewerten Sie den Bericht passend zum Deployment und prüfen Sie gesondert, ob nicht vertrauenswürdige Eingaben einen teuren Match erreichen und ihre Länge begrenzt ist.
Häufige Fragen
Die RegExp-API bietet kein Timeout pro Match. Verwenden Sie einfache Muster und begrenzen Sie die Eingabe vor dem Match. Falls komplexe Verarbeitung nötig ist, isolieren Sie sie in einem Worker oder Kindprozess mit durchsetzbarer Abbruchfrist; das begrenzt Auswirkungen, macht das Muster aber nicht effizient.
Ja. Ein problematischer synchroner Match kann den Hauptthread des Tabs bis zum Ende einfrieren und die Oberfläche blockieren. Begrenzen Sie Eingaben, vereinfachen Sie Muster und vermeiden Sie teure Matches bei jedem Tastendruck.
Behandeln Sie vom Nutzer gelieferte Muster als ausführbare Eingabe für einen möglicherweise teuren Matcher. Akzeptieren Sie auf einem Server keine beliebigen Muster ohne strenge Limits und Isolation. Wenn nur wörtliche Suche nötig ist, escapen Sie den Text als Regex-Literal oder verwenden Sie Textsuch-APIs; Escaping ersetzt kein Längenlimit.
Referenzen und Behebung
- GitHub-Hinweis — CVE-2026-83606 in @xmldom/xmldom
- xmldom — Versionshinweise 0.9.11
- Node.js — Event Loop nicht blockieren (ReDoS)
- V8 — nicht zurückspringende RegExp-Engine und Grenzen
- npm — Dependency-Audit
- CWE-1333 — ineffiziente Regex-Komplexität