Hooks

Hook regex: Oppdag ReDoS-mønstre

Skann en kodebase for regex som er utsatt for ReDoS, eller vurder ett enkelt mønster, rett fra kommandolinjen.

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.

npx lagune read regex

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​

SeksjonBetydning
Vulnerable regular expressions foundMø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​

AlternativVerdiBeskrivelse
--patternkildeteksten til en regexSjekk ett mønster. Gjenta for å sjekke flere, én konklusjon per mønster, i samme rekkefølge.
--flagsregex-flaggSjekk hvert --pattern med disse flaggene, for eksempel im. Gjelder bare modusen check.
--diren mappeAvgrens en gjennomgang til en mappe. Kan gjentas og kombineres med --file.
--fileen filAvgrens en gjennomgang til én enkelt fil. Kan gjentas og kombineres med --dir.
--limitet ikke-negativt heltallSett 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åkFilendelser
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
Etter beste evne, ikke uttømmende

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.

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

npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
Hvorfor et argument i anførselstegn

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.

tip

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.