Hook

Hook regex: deteksi pola ReDoS

Pindai basis kode untuk mencari regex yang rawan ReDoS, atau beri skor satu pola, langsung dari command line.

Hook regex adalah engine keamanan regex deterministik yang dijalankan spesialisasi regex, dan Anda juga bisa menjalankannya sendiri. Hook ini bekerja dalam dua mode dari satu perintah: scan yang memindai basis kode untuk mencari pola yang rawan ReDoS dan pola yang dibangun saat runtime, serta check yang memberi skor satu pola yang Anda berikan.

Memindai basis kode​

Tanpa flag, hook ini memindai seluruh proyek. --dir membatasi pemindaian ke satu direktori, --file ke satu file. Keduanya bisa diulang dan digabung menjadi satu laporan, dengan setiap file dicantumkan sekali meski tercakup oleh lebih dari satu target.

npx lagune read regex

Output-nya berupa teks mentah, dan header-nya menjelaskan cara membaca tiap bagian. Sebuah bagian hanya ditampilkan jika ada temuan.

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

Jika tidak ada yang ditemukan, hook ini mencetak satu baris.

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

Cara membaca tiap bagian​

BagianArti
Vulnerable regular expressions foundPola yang rawan ReDoS, dikelompokkan per file dengan setiap pola menjorok di bawahnya, diikuti dalam tanda kurung oleh alasan pola itu tidak aman serta, jika ada, cakupan dan flag-nya. Setiap baris tidak aman, jadi putusannya tidak diulang.
Regular expressions the analysis could not settle (review manually)Pola yang tidak bisa dipastikan oleh analisis dalam batas kerjanya, dicantumkan dengan cara yang sama.
Dynamically built regular expressions (review manually by simulating a constructed regex)File yang membangun regex dari variabel, konkatenasi, atau interpolasi.
Static regex wrapped in a constructor (use a literal instead)File yang meneruskan string literal biasa ke konstruktor regex, padahal literal regex lebih sederhana dan tidak perlu dikompilasi saat runtime.

Bagian pertama adalah temuan keamanan. Bagian kedua dan ketiga bukan temuan dengan sendirinya: keduanya menunjuk kode yang tidak bisa dipastikan oleh pemeriksaan statis, jadi perlu dibaca manusia. Bagian keempat adalah petunjuk kejelasan, bukan temuan keamanan.

Opsi CLI​

OpsiNilaiDeskripsi
--patternsumber regexPeriksa satu pola. Ulangi untuk memeriksa beberapa pola, satu putusan per pola, sesuai urutan.
--flagsflag regexPeriksa setiap --pattern dengan flag ini, seperti im. Hanya berlaku untuk mode check.
--dirdirektoriBatasi pemindaian ke satu direktori. Bisa diulang dan digabung dengan --file.
--filefileBatasi pemindaian ke satu file. Bisa diulang dan digabung dengan --dir.
--limitbilangan bulat non-negatifTetapkan batas repetisi ReDoS (default 25). Berlaku untuk kedua mode. Batas yang lebih rendah lebih ketat.

Tanpa opsi, hook ini memindai seluruh proyek. --pattern adalah mode check dan tidak bisa digabung dengan --dir atau --file.

Pilih yang dipindai​

Hook ini melewati apa yang diabaikan Git. Untuk melewati lebih banyak, atau untuk memindai apa yang diabaikan Git, beri regex pengaturannya sendiri:

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

Semua pengaturan dibahas di Mengonfigurasi hook.

Bahasa yang didukung​

Pemindaian membaca bahasa berikut, dikenali dari ekstensi file, masing-masing dengan aturannya sendiri sehingga pola dari satu bahasa tidak pernah diuji dengan aturan bahasa lain. Bahasa lain dilewati, bukan dipindai dengan aturan yang salah.

#BahasaEkstensi
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
Upaya terbaik, tidak menyeluruh

Hook ini membaca kode sumber sebagai teks, sehingga tidak bisa menilai pola yang dirakit saat runtime, dan pola yang tersebar di beberapa baris, tersembunyi di balik alias, atau ditulis dalam bentuk yang tidak dikenalinya bisa lolos. Anggap bagian-bagian ini sebagai titik awal yang kuat, bukan inventaris lengkap, dan tetap baca kodenya untuk hal yang tidak terjangkau olehnya.

Memeriksa satu pola​

Berikan --pattern dengan sumber pola untuk memberinya skor. Hook ini mencetak satu kata: safe, unsafe, undetermined jika analisis mencapai batas kerjanya sebelum bisa memastikan pola, atau invalid regex. Ulangi --pattern untuk memberi skor beberapa pola sekaligus, satu putusan per pola, sesuai urutan.

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

npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
Mengapa argumen diberi tanda kutip

Setiap pola diteruskan sebagai nilai flag, tidak pernah disisipkan ke dalam perintah. Nilai yang berisi tanda kutip atau backtick tetap tidak berbahaya dan tidak bisa melakukan injeksi ke shell. Selalu apit pola dengan tanda kutip tunggal agar shell Anda tidak mengekspansinya lebih dulu.

tip

Ini adalah engine yang sama yang dijalankan spesialisasi regex: scan membuka pemeriksaan ReDoS, dan check memastikan pola yang ditemukannya.

Pertanyaan yang sering diajukan

Jalankan npx lagune read regex --pattern '<pattern>'. Hasilnya safe, unsafe, undetermined, atau invalid regex.

Jalankan hook regex dalam mode scan di seluruh basis kode. Hook ini melaporkan pola yang rawan ReDoS di 25 bahasa yang didukung.