
Finden Sie reguläre Ausdrücke, die anfällig für ReDoS (Regular Expression Denial of Service) sind.

Finde Regexes, die anfällig für Regular Expression Denial of Service (ReDoS) sind.
Mehr Infos im Doyensec Blog
Viele Standard-Parser für reguläre Ausdrücke haben eine unbegrenzte Worst-Case-Komplexität. Das Matching eines regulären Ausdrucks kann schnell sein, wenn eine passende Eingabezeichenkette vorliegt. Bestimmte nicht passende Eingabezeichenketten können jedoch dazu führen, dass der Regex-Matcher in verrückte Backtracking-Schleifen gerät und ewig braucht, um die Zeichenkette zu verarbeiten. Dies kann einen Denial of Service verursachen, da die CPU damit beschäftigt ist, den Regex zu matchen.
Dieses Tool wurde entwickelt, um:
Dies spiegelt die Komplexität des Backtracking-Verfahrens des Regex-Matchers in Bezug auf die Länge der eingegebenen Zeichenkette wider.
Kubische Komplexität bedeutet hier, dass wenn der angreifbare Teil der Zeichenkette in der Länge verdoppelt wird, die Ausführungszeit etwa 8-mal länger sein sollte (2^3).
Für exponentielle ReDoS mit gestirnten Sternen wie z.B. (a*)*$ wird ein Korrekturfaktor verwendet und die Komplexität ist größer als 10.
Für die Ausnutzbarkeit ist in der Regel kubische oder höhere Komplexität erforderlich, es sei denn, wirklich riesige Zeichenketten sind als Eingabe erlaubt.
Führen Sie regexploit aus und geben Sie den regulären Ausdruck v\w*_\w*_\w*$ in der Kommandozeile ein.
$ regexploit
v\w*_\w*_\w*$
Pattern: v\w*_\w*_\w*$
---
Worst-case complexity: 3 ⭐⭐⭐ (cubic)
Repeated character: [5f:_]
Final character to cause backtracking: [^WORD]
Example: 'v' + '_' * 3456 + '!'
Der Teil \w*_\w*_\w* enthält drei überlappende, sich wiederholende Gruppen (\w matcht Buchstaben, Ziffern und Unterstriche). Wie in der Zeile Repeated character: [5f:_] gezeigt, matcht eine lange Zeichenkette von _ (0x5f) diesen Abschnitt auf viele verschiedene Arten. Die Worst-Case-Komplexität ist 3, da es 3 unendlich wiederholende Gruppen gibt. Ein Beispiel zur Auslösung von ReDoS wird gegeben: Es besteht aus dem erforderlichen Präfix v, einer langen Zeichenkette von _ und dann einem ! (Nicht-Wort-Zeichen), um Backtracking auszulösen. Nicht alle ReDoS benötigen ein bestimmtes Zeichen am Ende, aber in diesem Fall matcht eine lange Zeichenkette von _ den Regex erfolgreich und führt kein Backtracking durch. Die Zeile Final character to cause backtracking: [^WORD] zeigt, dass ein nicht passendes Zeichen (kein Wortzeichen) am Ende erforderlich ist, um ein Matching zu verhindern und ReDoS auszulösen.
Als weiteres Beispiel installieren Sie eine Modulversion, die anfällig für ReDoS ist, wie pip install ua-parser==0.9.0.
Um die installierten Python-Module zu scannen, führen Sie regexploit-python-env aus.
Importing ua_parser.user_agent_parser
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: \bSmartWatch *\( *([^;]+) *; *([^;]+) *;
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(' + ' ' * 3456
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(0;' + ' ' * 3456
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: ; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [[0-9]]
Example: ';0 Build/HuaweiA' + '0' * 3456
...
Für jeden anfälligen regulären Ausdruck wird ein oder mehrere bösartige Zeichenketten ausgegeben, um ReDoS auszulösen. Wenn Sie Ihren User-Agent auf ;0 Build/HuaweiA000000000000000... setzen und eine Website durchsuchen, die eine alte Version von ua-parser verwendet, kann der Server lange brauchen, um Ihre Anfrage zu verarbeiten, was wahrscheinlich im Status 502 endet.
Python 3.8+ ist erforderlich. Zum Extrahieren von Regexes aus JavaScript / TypeScript-Code ist auch NodeJS 12+ erforderlich.
Optional eine virtuelle Umgebung erstellen
python3 -m venv .env
source .env/bin/activate
Jetzt mit pip installieren
pip install regexploit
Geben Sie reguläre Ausdrücke über stdin (einen pro Zeile) in regexploit ein.
regexploit
oder über eine Datei
cat myregexes.txt | regexploit
Es gibt eine integrierte Unterstützung zum Parsen von Regexes aus Python, JavaScript, TypeScript, C#, YAML und JSON.
Parst Python-Code (ohne ihn auszuführen) über das AST, um Regexes zu finden. Die Regexes werden dann auf ReDoS analysiert.
regexploit-py my-project/
regexploit-py "my-project/**/*.py" --glob
Dies verwendet das gebündelte NodeJS-Paket in regexploit/bin/javascript, das Ihr JavaScript als AST mit eslint parst und alle Regexes ausgibt.
Diese Regexes werden in den Python-ReDoS-Finder eingespeist.
regexploit-js my-module/my-file.js another/file.js some/folder/
regexploit-js "my-project/node_modules/**/*.js" --glob
N.B. es gibt Unterschiede zwischen dem JavaScript- und Python-Regex-Parsing, daher kann es zu Fehlern kommen. Ich bin nicht sicher, ob ich einen JS-Regex-AST schreiben möchte!
Durchsucht alle derzeit in Ihrem Pfad / Ihrer Umgebung installierten Python-Module nach Regexes. Das bedeutet, Sie können pip install für alle Module ausführen, die Sie interessieren, und sie werden analysiert. CPython-Code ist enthalten.
regexploit-python-env
N.B. dies parst den Python-Code nicht zu einem AST und findet nur Regexes, die beim Modulimport automatisch kompiliert werden. Module werden tatsächlich importiert, also wird der Code in den Modulen ausgeführt. Dies ist hilfreich, um Regexes zu finden, die beim Laden aus kleineren Zeichenketten zusammengesetzt werden, z.B. CVE-2021-25292 in Pillow
YAML-Unterstützung erfordert pyyaml, das mit pip install regexploit[yaml] installiert werden kann.
regexploit-json *.json
regexploit-yaml *.yaml
regexploit-csharp something.cs
Dieses Tool wurde von Ben Caller von Doyensec LLC während der Forschungszeit entwickelt.