Hooks

Hook regex: find ReDoS-mønstre

Gennemsøg en kodebase for regex, der er sårbare over for ReDoS, eller vurdér et enkelt mønster, fra kommandolinjen.

Hooken regex er den deterministiske motor til regex-sikkerhed, som specialiseringen regex kører, og du kan selv køre den. Den virker i to tilstande fra én kommando: en scanning, der gennemsøger en kodebase for mønstre, der er sårbare over for ReDoS eller bygges under kørslen, og et tjek, der vurderer et enkelt mønster, du giver den.

Scan en kodebase​

Uden flag scanner den hele projektet. --dir afgrænser scanningen til en mappe, --file til en enkelt fil. Begge kan gentages og kombineres i én rapport, hvor hver fil kun står én gang, selv når mere end ét mål dækker den.

npx lagune read regex

Outputtet er rå tekst, hvis overskrifter fortæller, hvordan hvert afsnit skal læses. Et afsnit vises kun, når det har fund.

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 intet bliver fundet, udskriver den en enkelt linje.

npx lagune read regex --dir src/clean
# => no unsafe patterns found

Sådan læser du afsnittene​

AfsnitBetydning
Vulnerable regular expressions foundMønstre, der er sårbare over for ReDoS, grupperet efter fil med hvert mønster indrykket nedenunder, efterfulgt i parentes af, hvorfor det er usikkert, og, når de findes, dets omfang og dets flag. Hver linje er usikker, så afgørelsen gentages ikke.
Regular expressions the analysis could not settle (review manually)Mønstre, som analysen ikke kunne afgøre inden for sin arbejdsgrænse, oplistet på samme måde.
Dynamically built regular expressions (review manually by simulating a constructed regex)Filer, der bygger et regex ud fra en variabel, en sammenkædning eller en interpolation.
Static regex wrapped in a constructor (use a literal instead)Filer, der giver en almindelig strengliteral til en regex-konstruktør, hvor en regex-literal er enklere og sparer en kompilering under kørslen.

Det første afsnit er et sikkerhedsfund. Det andet og tredje er ikke fund i sig selv: de peger på kode, som et statisk tjek ikke kan afgøre, så de kræver, at et menneske læser den. Det fjerde er et hint om klarhed, ikke et sikkerhedsfund.

CLI-indstillinger​

IndstillingVærdiBeskrivelse
--patternen regex-kildeTjek ét mønster. Gentag for at tjekke flere, én afgørelse pr. mønster, i rækkefølge.
--flagsregex-flagTjek hvert --pattern med disse flag, såsom im. Gælder kun tilstanden check.
--diren mappeAfgræns en scanning til en mappe. Kan gentages og kombineres med --file.
--fileen filAfgræns en scanning til en enkelt fil. Kan gentages og kombineres med --dir.
--limitet ikke-negativt heltalSæt grænsen for gentagelser i ReDoS (standard 25). Gælder begge tilstande. En lavere grænse er strengere.

Uden indstillinger scanner den hele projektet. --pattern er tilstanden check og kan ikke kombineres med --dir eller --file.

Vælg, hvad den scanner​

Den udelader det, Git ignorerer. For at udelade mere, eller for at scanne det, Git ignorerer, så giv regex sine egne indstillinger:

npx lagune write add --ignore test/fixtures --checker regex
{
"checkers": {
"regex": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

Konfigurér hooks beskriver alle indstillinger.

Understøttede sprog​

Scanningen læser disse sprog, bestemt ud fra filendelsen, hvert efter dets egne regler, så et mønster fra ét sprog aldrig testes mod et andet. Alt andet springes over i stedet for at blive scannet med de forkerte regler.

#SprogFilendelser
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
Efter bedste evne, ikke udtømmende

Den læser kildekoden som tekst, så den kan ikke vurdere et mønster, der sættes sammen under kørslen, og et mønster, der er spredt over flere linjer, skjult bag et alias eller skrevet i en form, den ikke genkender, kan slippe forbi. Betragt afsnittene som et solidt udgangspunkt, ikke en komplet oversigt, og bliv ved med at læse koden for det, de ikke kan nå.

Tjek et enkelt mønster​

Angiv --pattern med mønsterets kilde for at vurdere det. Hooken udskriver ét ord: safe, unsafe, undetermined, når analysen når sin arbejdsgrænse, før mønsteret er afgjort, eller invalid regex. Gentag --pattern for at vurdere flere på én gang, én afgørelse pr. mønster, i rækkefø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 angives som værdi til et flag og indsættes aldrig i selve kommandoen. En værdi med anførselstegn eller backticks forbliver uskadelig og kan ikke injicere noget i shellen. Sæt altid mønsteret i enkelte anførselstegn, så din shell ikke ekspanderer det først.

tip

Det er den samme motor, som specialiseringen regex kører: scanningen indleder en gennemgang for ReDoS, og tjekket bekræfter et mønster, den bringer frem.

Ofte stillede spørgsmål

Kør npx lagune read regex --pattern '<pattern>'. Den returnerer safe, unsafe, undetermined eller invalid regex.

Kør hooken regex i tilstanden scan over kodebasen. Den rapporterer mønstre, der er sårbare over for ReDoS, på tværs af 25 understøttede sprog.