Der Hook regex ist die deterministische Engine für sichere Regex, die die Spezialisierung regex verwendet, und du kannst ihn selbst ausführen. Er arbeitet mit einem einzigen Befehl in zwei Modi: Im Modus scan durchsucht er eine Codebasis nach Mustern, die für ReDoS anfällig sind oder erst zur Laufzeit gebaut werden, und im Modus check bewertet er ein einzelnes Muster, das du ihm übergibst.
Eine Codebasis durchsuchen
Ohne Option durchsucht er das gesamte Projekt. --dir beschränkt den Durchlauf auf ein Verzeichnis, --file auf eine einzelne Datei. Beide lassen sich wiederholen und zu einem Bericht kombinieren, in dem jede Datei nur einmal erscheint, auch wenn mehr als ein Ziel sie abdeckt.
- Gesamtes Projekt
- Ein Verzeichnis
- Eine einzelne Datei
- Mehrere Ziele
- Mit Limit
npx lagune read regex
npx lagune read regex --dir src/services
npx lagune read regex --file bin/import.pl
npx lagune read regex --dir core --dir workers --file Sources/App/Router.swift
--limit legt den ReDoS-Schwellenwert für den Durchlauf fest (Standard 25), dasselbe Limit, das auch der Modus check annimmt. Ein niedrigeres Limit ist strenger.
npx lagune read regex --dir src/services --limit 15
Die Ausgabe ist reiner Text, dessen Überschriften sagen, wie jeder Abschnitt zu lesen ist. Ein Abschnitt erscheint nur, wenn er Befunde enthält.
Vulnerable regular expressions found:
cmd/server/main.go
([a-z]+)+$ (exponential, search)
Dynamically built regular expressions (review manually by simulating a constructed regex):
app/payments.php
crates/parser/lexer.rs
lib/validate.py
Static regex wrapped in a constructor (use a literal instead):
config/token.rb
Findet er nichts, gibt er eine einzige Zeile aus.
npx lagune read regex --dir src/clean
# => no unsafe patterns found
So liest du die Abschnitte
| Abschnitt | Bedeutung |
|---|---|
Vulnerable regular expressions found | ReDoS-anfällige Muster, nach Datei gruppiert, jedes Muster eingerückt darunter, gefolgt in Klammern vom Grund, warum es unsicher ist, und, falls vorhanden, von seinem Geltungsbereich und seinen Flags. Jede Zeile ist unsicher, deshalb wird das Urteil nicht wiederholt. |
Regular expressions the analysis could not settle (review manually) | Muster, die die Analyse innerhalb ihres Arbeitslimits nicht klären konnte, genauso aufgelistet. |
Dynamically built regular expressions (review manually by simulating a constructed regex) | Dateien, die eine Regex aus einer Variablen, einer Verkettung oder einer Interpolation bauen. |
Static regex wrapped in a constructor (use a literal instead) | Dateien, die einem Regex-Konstruktor ein einfaches String-Literal übergeben, wo ein Regex-Literal einfacher wäre und die Kompilierung zur Laufzeit spart. |
Der erste Abschnitt ist ein Sicherheitsbefund. Der zweite und dritte sind für sich genommen keine Befunde: Sie zeigen auf Code, den eine statische Prüfung nicht klären kann, und verlangen deshalb, dass ein Mensch ihn liest. Der vierte ist ein Hinweis zur Lesbarkeit, kein Sicherheitsbefund.
CLI-Optionen
| Option | Wert | Beschreibung |
|---|---|---|
--pattern | der Quelltext einer Regex | Prüft ein Muster. Wiederhole die Option, um mehrere zu prüfen, ein Urteil pro Muster, in derselben Reihenfolge. |
--flags | Regex-Flags | Prüft jedes --pattern mit diesen Flags, etwa im. Gilt nur für den Modus check. |
--dir | ein Verzeichnis | Beschränkt den Durchlauf auf ein Verzeichnis. Wiederholbar und mit --file kombinierbar. |
--file | eine Datei | Beschränkt den Durchlauf auf eine einzelne Datei. Wiederholbar und mit --dir kombinierbar. |
--limit | eine nicht negative Ganzzahl | Legt das ReDoS-Wiederholungslimit fest (Standard 25). Gilt für beide Modi. Ein niedrigeres Limit ist strenger. |
Ohne Option durchsucht er das gesamte Projekt. --pattern steht für den Modus check und lässt sich nicht mit --dir oder --file kombinieren.
Unterstützte Sprachen
Der Durchlauf liest diese Sprachen, erkannt an der Dateiendung, jede nach ihren eigenen Regeln, sodass er ein Muster aus einer Sprache nie nach den Regeln einer anderen testet. Alles andere überspringt er, statt es mit den falschen Regeln zu durchsuchen.
| # | Sprache | Dateiendungen |
|---|---|---|
| 1 | JavaScript / TypeScript | .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot |
| 2 | Python | .py, .pyi |
| 3 | Ruby | .rb |
| 4 | Go | .go |
| 5 | PHP | .php |
| 6 | Rust | .rs |
| 7 | Java | .java |
| 8 | C# | .cs |
| 9 | C | .c, .h |
| 10 | C++ | .cc, .cpp, .cxx, .hpp, .hh, .hxx |
| 11 | Kotlin | .kt, .kts |
| 12 | Swift | .swift |
| 13 | Scala | .scala, .sc |
| 14 | Dart | .dart |
| 15 | PowerShell | .ps1, .psm1, .psd1 |
| 16 | Elixir | .ex, .exs |
| 17 | Objective-C | .m, .mm |
| 18 | R | .r |
| 19 | Julia | .jl |
| 20 | Clojure | .clj, .cljs, .cljc, .edn |
| 21 | Crystal | .cr |
| 22 | Nim | .nim, .nims |
| 23 | V | .v |
| 24 | D | .d |
| 25 | Perl | .pl, .pm |
Er liest den Quellcode als Text, deshalb kann er kein Muster beurteilen, das erst zur Laufzeit zusammengesetzt wird, und ein Muster, das sich über mehrere Zeilen erstreckt, hinter einem Alias steckt oder in einer Form geschrieben ist, die er nicht erkennt, kann ihm entgehen. Betrachte die Abschnitte als soliden Ausgangspunkt, nicht als vollständige Bestandsaufnahme, und lies den Code weiterhin selbst, um zu erfassen, was sie nicht erreichen.
Ein einzelnes Muster prüfen
Übergib --pattern mit dem Quelltext des Musters, um es zu bewerten. Der Hook gibt ein Wort aus: safe, unsafe, undetermined, wenn die Analyse ihr Arbeitslimit erreicht, bevor sie das Muster klären kann, oder invalid regex. Wiederhole --pattern, um mehrere auf einmal zu bewerten, ein Urteil pro Muster, in derselben Reihenfolge.
- Ein Muster
- Mehrere Muster
- Mit Flags
- Mit Limit
npx lagune read regex --pattern '(a+)+$'
# => unsafe
npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
npx lagune read regex --pattern '(a+)+$' --pattern '^[a-z]+$'
# => unsafe
# => safe
--flags prüft jedes --pattern des Aufrufs mit den Flags, mit denen es ausgeführt wird, denn ein Flag ändert, welche Zeichen ein Muster trifft.
npx lagune read regex --pattern '^(?:a|A)+$'
# => safe
npx lagune read regex --pattern '^(?:a|A)+$' --flags 'i'
# => unsafe
--limit legt das Wiederholungslimit fest (Standard 25) und gilt für jedes --pattern des Aufrufs. Ein niedrigeres Limit ist strenger.
npx lagune read regex --pattern 'a?a?a?' --limit 2
# => unsafe
Jedes Muster wird als Wert einer Option übergeben und nie in den Befehl interpoliert. Ein Wert mit Anführungszeichen oder Backticks bleibt wirkungslos und kann nichts in die Shell einschleusen. Setze das Muster immer in einfache Anführungszeichen, damit deine Shell es nicht vorher expandiert.
Das ist dieselbe Engine, die die Spezialisierung regex ausführt: Der Modus scan eröffnet die ReDoS-Prüfung, der Modus check bestätigt ein Muster, das sie zutage fördert.
Häufige Fragen
Führe npx lagune read regex --pattern '<pattern>' aus. Der Befehl gibt safe, unsafe, undetermined oder invalid regex zurück.
Führe den Hook regex im Modus scan über die Codebasis aus. Er meldet ReDoS-anfällige Muster in 25 unterstützten Sprachen.
