Hooken regex er den deterministiske motoren for trygge regex som spesialiseringen regex kjører, og du kan kjøre den selv. Den har to moduser i én kommando: modusen scan skanner en kodebase for mønstre som er utsatt for ReDoS eller bygges under kjøring, og modusen check vurderer ett enkelt mønster du gir den.
Skann en kodebase
Uten flagg skanner den hele prosjektet. --dir avgrenser gjennomgangen til en mappe, --file til én enkelt fil. Begge kan gjentas og slås sammen til én rapport, der hver fil står én gang, selv når flere mål dekker den.
- Hele prosjektet
- En mappe
- Én enkelt fil
- Flere mål
- Med en grense
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 setter ReDoS-terskelen for gjennomgangen (standard 25), den samme grensen som modusen check tar. En lavere grense er strengere.
npx lagune read regex --dir src/services --limit 15
Utdataene er ren tekst, og overskriftene forteller hvordan hver seksjon skal leses. En seksjon vises bare når den har funn.
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
Når den ikke finner noe, skriver den ut én enkelt linje.
npx lagune read regex --dir src/clean
# => no unsafe patterns found
Slik leser du seksjonene
| Seksjon | Betydning |
|---|---|
Vulnerable regular expressions found | Mønstre som er utsatt for ReDoS, gruppert etter fil med hvert mønster innrykket under, fulgt i parentes av hvorfor det er utrygt og, når det har dem, omfanget og flaggene. Hver linje er utrygg, så konklusjonen gjentas ikke. |
Regular expressions the analysis could not settle (review manually) | Mønstre analysen ikke kunne avgjøre innenfor arbeidsgrensen sin, listet opp på samme måte. |
Dynamically built regular expressions (review manually by simulating a constructed regex) | Filer som bygger en regex fra en variabel, en sammenslåing eller en interpolering. |
Static regex wrapped in a constructor (use a literal instead) | Filer som sender en vanlig strengliteral til en regex-konstruktør der en regex-literal er enklere og sparer en kompilering under kjøring. |
Den første seksjonen er et sikkerhetsfunn. Den andre og tredje er ikke funn i seg selv: de peker på kode en statisk kontroll ikke kan avgjøre, og ber derfor om at et menneske leser den. Den fjerde er et hint om lesbarhet, ikke et sikkerhetsfunn.
CLI-alternativer
| Alternativ | Verdi | Beskrivelse |
|---|---|---|
--pattern | kildeteksten til en regex | Sjekk ett mønster. Gjenta for å sjekke flere, én konklusjon per mønster, i samme rekkefølge. |
--flags | regex-flagg | Sjekk hvert --pattern med disse flaggene, for eksempel im. Gjelder bare modusen check. |
--dir | en mappe | Avgrens en gjennomgang til en mappe. Kan gjentas og kombineres med --file. |
--file | en fil | Avgrens en gjennomgang til én enkelt fil. Kan gjentas og kombineres med --dir. |
--limit | et ikke-negativt heltall | Sett ReDoS-grensen for repetisjoner (standard 25). Gjelder begge modusene. En lavere grense er strengere. |
Uten alternativ skanner den hele prosjektet. --pattern er modusen check og kan ikke kombineres med --dir eller --file.
Velg hva den skanner
Den utelater det Git ignorerer. For å utelate mer, eller for å skanne det Git ignorerer, gi regex egne innstillinger:
npx lagune write add --ignore test/fixtures --checker regex
{
"checkers": {
"regex": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}
Konfigurer hookene beskriver hver innstilling.
Støttede språk
Gjennomgangen leser disse språkene, gjenkjent på filendelsen, hvert etter sine egne regler, slik at et mønster fra ett språk aldri testes etter et annet språks regler. Alt annet hoppes over i stedet for å skannes med feil regler.
| # | Språk | Filendelser |
|---|---|---|
| 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 |
Den leser kildekoden som tekst, så den kan ikke vurdere et mønster som settes sammen under kjøring, og et mønster som er spredt over flere linjer, skjult bak et alias eller skrevet i en form den ikke gjenkjenner, kan slippe gjennom. Se på seksjonene som et solid utgangspunkt, ikke en fullstendig oversikt, og fortsett å lese koden for det de ikke når.
Sjekk ett enkelt mønster
Send --pattern med kildeteksten til mønsteret for å vurdere det. Hooken skriver ut ett ord: safe, unsafe, undetermined når analysen når arbeidsgrensen sin før den har avgjort mønsteret, eller invalid regex. Gjenta --pattern for å vurdere flere samtidig, én konklusjon per mønster, i samme rekkefølge.
- Ett mønster
- Flere mønstre
- Med flagg
- Med en grense
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 sjekker hvert --pattern i kallet med flaggene det kjøres med, siden et flagg endrer hvilke tegn et mønster treffer.
npx lagune read regex --pattern '^(?:a|A)+$'
# => safe
npx lagune read regex --pattern '^(?:a|A)+$' --flags 'i'
# => unsafe
--limit setter grensen for repetisjoner (standard 25) og gjelder hvert --pattern i kallet. En lavere grense er strengere.
npx lagune read regex --pattern 'a?a?a?' --limit 2
# => unsafe
Hvert mønster sendes som verdien til et flagg og interpoleres aldri inn i kommandoen. En verdi med anførselstegn eller backticks forblir uvirksom og kan ikke injisere noe i skallet. Sett alltid mønsteret i enkle anførselstegn, så skallet ditt ikke ekspanderer det først.
Dette er den samme motoren som spesialiseringen regex kjører: modusen scan åpner en ReDoS-gjennomgang, og modusen check bekrefter et mønster den finner.
Vanlige spørsmål
Kjør npx lagune read regex --pattern '<pattern>'. Den returnerer safe, unsafe, undetermined eller invalid regex.
Kjør hooken regex i modusen scan over kodebasen. Den rapporterer mønstre som er utsatt for ReDoS, i 25 støttede språk.
