Hooks

Hook regex: ReDoS-Muster erkennen

Durchsuche eine Codebasis nach ReDoS-anfälligen Regex-Mustern, oder bewerte ein einzelnes Muster, direkt über die Kommandozeile.

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.

npx lagune read regex

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​

AbschnittBedeutung
Vulnerable regular expressions foundReDoS-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​

OptionWertBeschreibung
--patternder Quelltext einer RegexPrüft ein Muster. Wiederhole die Option, um mehrere zu prüfen, ein Urteil pro Muster, in derselben Reihenfolge.
--flagsRegex-FlagsPrüft jedes --pattern mit diesen Flags, etwa im. Gilt nur für den Modus check.
--direin VerzeichnisBeschränkt den Durchlauf auf ein Verzeichnis. Wiederholbar und mit --file kombinierbar.
--fileeine DateiBeschränkt den Durchlauf auf eine einzelne Datei. Wiederholbar und mit --dir kombinierbar.
--limiteine nicht negative GanzzahlLegt 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.

#SpracheDateiendungen
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot
2Python.py, .pyi
3Ruby.rb
4Go.go
5PHP.php
6Rust.rs
7Java.java
8C#.cs
9C.c, .h
10C++.cc, .cpp, .cxx, .hpp, .hh, .hxx
11Kotlin.kt, .kts
12Swift.swift
13Scala.scala, .sc
14Dart.dart
15PowerShell.ps1, .psm1, .psd1
16Elixir.ex, .exs
17Objective-C.m, .mm
18R.r
19Julia.jl
20Clojure.clj, .cljs, .cljc, .edn
21Crystal.cr
22Nim.nim, .nims
23V.v
24D.d
25Perl.pl, .pm
Bestmöglich, aber nicht lückenlos

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.

npx lagune read regex --pattern '(a+)+$'
# => unsafe

npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
Warum ein Argument in Anführungszeichen

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.

tipp

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.