Sicherheitsnotizen: RegEx
Kann RegEx verwundbar sein?
Photo by Markus Spiske on Unsplash
RegEx Denial-of-Service: ReDOS
Eine der überraschenderen, aber schwer zu erkennenden Schwachstellen, die ich gefunden habe, hängt mit regulären Ausdrücken zusammen.
Entweder schlecht geschrieben oder schlecht implementiert.
Speicher/CPU können durch große oder speziell präparierte Benutzereingaben erschöpft werden.
Das ist eine Denial-of-Service‑Schwachstelle, nicht nur ein Performance‑Geruch. Wenn feindliche Eingaben die CPU lange genug blockieren, um legitime Nutzer zu verhungern, gehört sie in Ihr Sicherheits‑Threat‑Model.
Warnzeichen
- Verschachtelte Quantifier, wiederholte Gruppen oder überlappende Alternativen
- Backtracking‑intensive Engines ohne Timeout oder Eingabelängenbegrenzung
- Der Ausdruck wird mit ungeprüften Benutzereingaben verwendet
- Regex‑Validierung läuft auf einem heißen Request‑Pfad
Minderung / Lösung
- RegEx ist schwierig.
- Zum Beispiel, so empfiehlt das wirklich schlaue Team von [OWASP die Behandlung von IP‑Validierung][owasp]:
^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ - Das ist länger als ein (altmodischer) Tweet für eine 4‑Byte‑IP‑Adresse!!!
- Zum Beispiel, so empfiehlt das wirklich schlaue Team von [OWASP die Behandlung von IP‑Validierung][owasp]:
- Begrenzen Sie die Eingabelänge, bevor der reguläre Ausdruck ausgewertet wird.
- Fügen Sie Time‑outs, statische Analysen oder eine nicht‑backtracking‑Engine hinzu, sofern die Plattform das unterstützt.
- Das betrifft fast jede Sprache und jedes Framework: .NET, Node, Python, PERL, Java.