Hook'lar

regex hook'u: ReDoS örüntülerini tespit edin

Kod tabanını ReDoS'a yatkın regex'lere karşı tarayın ya da tek bir örüntüyü doğrudan komut satırından puanlayın.

regex hook'u, regex uzmanlığının çalıştırdığı deterministik regex güvenliği motorudur ve onu kendiniz çalıştırabilirsiniz. Tek bir komutla iki modda çalışır: kod tabanını ReDoS'a yatkın ve çalışma zamanında oluşturulan örüntülere karşı tarayan scan ve verdiğiniz tek bir örüntüyü puanlayan check.

Kod tabanını tarama​

Hiçbir bayrak verilmezse tüm proje taranır. --dir taramayı bir dizinle, --file ise tek bir dosyayla sınırlar. İkisi de tekrarlanabilir ve tek bir raporda birleştirilebilir. Bir dosyayı birden fazla hedef kapsasa bile o dosya raporda yalnızca bir kez listelenir.

npx lagune read regex

Çıktı, başlıkları her bölümün nasıl okunacağını söyleyen düz bir metindir. Bir bölüm yalnızca bulgu içerdiğinde gösterilir.

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

Hiçbir şey bulunamazsa tek bir satır yazdırılır.

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

Bölümleri nasıl okumalı​

BölümAnlamı
Vulnerable regular expressions foundDosyaya göre gruplanmış, ReDoS'a yatkın örüntüler. Her örüntü dosyanın altında girintili yer alır, ardından parantez içinde neden güvensiz olduğu ve varsa kapsamı ile bayrakları gelir. Her satır güvensizdir, bu yüzden karar tekrarlanmaz.
Regular expressions the analysis could not settle (review manually)Analizin iş sınırı içinde karara bağlayamadığı örüntüler, aynı şekilde listelenir.
Dynamically built regular expressions (review manually by simulating a constructed regex)Bir regex'i bir değişkenden, bir birleştirmeden ya da bir enterpolasyondan oluşturan dosyalar.
Static regex wrapped in a constructor (use a literal instead)Bir regex literalinin daha basit olacağı ve çalışma zamanındaki derlemeyi atlayacağı yerde bir regex yapıcısına sıradan bir dize literali veren dosyalar.

İlk bölüm bir güvenlik bulgusudur. İkinci ve üçüncü bölüm tek başına bulgu değildir: statik bir kontrolün karara bağlayamadığı koda işaret eder, bu yüzden bir insanın okumasını gerektirir. Dördüncü bölüm bir güvenlik bulgusu değil, kodu daha anlaşılır kılmaya yönelik bir ipucudur.

CLI seçenekleri​

SeçenekDeğerAçıklama
--patternbir regex kaynağıTek bir örüntüyü kontrol eder. Birkaçını kontrol etmek için tekrarlayın, her örüntüye sırasıyla bir karar düşer.
--flagsregex bayraklarıHer --pattern değerini im gibi bu bayraklarla kontrol eder. Yalnızca check modunda geçerlidir.
--dirbir dizinTaramayı bir dizinle sınırlar. Tekrarlanabilir ve --file ile birleştirilebilir.
--filebir dosyaTaramayı tek bir dosyayla sınırlar. Tekrarlanabilir ve --dir ile birleştirilebilir.
--limitnegatif olmayan bir tam sayıReDoS tekrar sınırını belirler (varsayılan 25). Her iki modda da geçerlidir. Daha düşük bir sınır daha katıdır.

Seçenek verilmezse tüm proje taranır. --pattern check modudur ve --dir ya da --file ile birleştirilemez.

Desteklenen diller​

Tarama bu dilleri dosya uzantısına göre tanıyarak, her birini kendi kurallarıyla okur, böylece bir dildeki örüntü asla başka bir dilin kurallarıyla test edilmez. Geri kalan her şey yanlış kurallarla taranmak yerine atlanır.

#DilUzantılar
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
Elden gelenin en iyisi, ama eksiksiz değil

Hook kaynak kodu metin olarak okur, bu yüzden çalışma zamanında oluşturulan bir örüntüyü değerlendiremez. Birden çok satıra yayılan, bir takma adın arkasına gizlenen ya da tanımadığı bir biçimde yazılan bir örüntü de gözden kaçabilir. Bölümleri eksiksiz bir envanter olarak değil, sağlam bir başlangıç noktası olarak görün ve onların erişemediği yerler için kodu okumaya devam edin.

Tek bir örüntüyü kontrol etme​

Bir örüntüyü puanlamak için kaynağını --pattern ile verin. Hook tek bir kelime yazdırır: safe, unsafe, analiz örüntüyü karara bağlamadan iş sınırına ulaştığında undetermined ya da invalid regex. Birkaç örüntüyü aynı anda puanlamak için --pattern seçeneğini tekrarlayın. Her örüntüye sırasıyla bir karar düşer.

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

npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
Neden tırnak içinde bir argüman

Her örüntü bir bayrak değeri olarak verilir, asla komutun içine yerleştirilmez. Tırnak veya ters tırnak içeren bir değer etkisiz kalır ve kabuğa enjeksiyon yapamaz. Kabuğunuzun onu önceden genişletmemesi için örüntüyü her zaman tek tırnak içine alın.

ipucu

Bu, regex uzmanlığının çalıştırdığı motorun aynısıdır: scan bir ReDoS incelemesini başlatır, check ise taramanın ortaya çıkardığı bir örüntüyü doğrular.

Sıkça sorulan sorular

npx lagune read regex --pattern '<pattern>' komutunu çalıştırın. Hook safe, unsafe, undetermined veya invalid regex sonucunu döndürür.

regex hook'unu kod tabanı üzerinde scan modunda çalıştırın. Hook, desteklenen 25 dilde ReDoS'a yatkın örüntüleri raporlar.