DanLevy.net

Sicherheitsnotizen: RegEx

Kann RegEx verwundbar sein?

Hero image for Sicherheitsnotizen: RegEx. Photo by Markus Spiske on Unsplash

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

  1. Verschachtelte Quantifier, wiederholte Gruppen oder überlappende Alternativen
  2. Backtracking‑intensive Engines ohne Timeout oder Eingabelängenbegrenzung
  3. Der Ausdruck wird mit ungeprüften Benutzereingaben verwendet
  4. Regex‑Validierung läuft auf einem heißen Request‑Pfad

Minderung / Lösung

  1. RegEx ist schwierig.
    1. 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]?)$
    2. Das ist länger als ein (altmodischer) Tweet für eine 4‑Byte‑IP‑Adresse!!!
  2. Begrenzen Sie die Eingabelänge, bevor der reguläre Ausdruck ausgewertet wird.
  3. Fügen Sie Time‑outs, statische Analysen oder eine nicht‑backtracking‑Engine hinzu, sofern die Plattform das unterstützt.
  4. Das betrifft fast jede Sprache und jedes Framework: .NET, Node, Python, PERL, Java.

Referenz