Хуки

Хук regex: виявлення шаблонів ReDoS

Перевірте кодову базу на регулярні вирази, схильні до ReDoS, або оцініть окремий шаблон просто з командного рядка.

Хук regex є детермінованим рушієм безпеки регулярних виразів, який запускає спеціалізація regex, і ви можете запускати його самі. Він працює у двох режимах однієї команди: scan, що перевіряє кодову базу на шаблони, схильні до ReDoS або побудовані під час виконання, і check, що оцінює окремий шаблон, який ви йому передаєте.

Перевірка кодової бази​

Без прапорців хук перевіряє весь проєкт. --dir обмежує перевірку каталогом, --file одним файлом. Обидва можна повторювати й поєднувати в один звіт, і кожен файл з'являється в ньому один раз, навіть якщо його охоплює більше ніж одна ціль.

npx lagune read regex

Вивід є звичайним текстом, заголовки якого пояснюють, як читати кожен розділ. Розділ показується лише тоді, коли в ньому є знахідки.

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

Якщо нічого не знайдено, хук виводить один рядок.

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

Як читати розділи​

РозділЗначення
Vulnerable regular expressions foundШаблони, схильні до ReDoS, згруповані за файлами, кожен шаблон з відступом під файлом, а в дужках пояснено, чому він небезпечний, і, якщо є, його область і прапорці. Кожен рядок небезпечний, тож вердикт не повторюється.
Regular expressions the analysis could not settle (review manually)Шаблони, щодо яких аналіз не зміг дійти висновку в межах свого ліміту роботи, перелічені так само.
Dynamically built regular expressions (review manually by simulating a constructed regex)Файли, що будують регулярний вираз зі змінної, конкатенації чи інтерполяції.
Static regex wrapped in a constructor (use a literal instead)Файли, що передають звичайний рядковий літерал у конструктор регулярного виразу там, де літерал регулярного виразу простіший і не потребує компіляції під час виконання.

Перший розділ є знахідкою безпеки. Другий і третій самі по собі не є знахідками: вони вказують на код, щодо якого статична перевірка не може дійти висновку, тож потребують, щоб його прочитала людина. Четвертий є підказкою для зрозумілості коду, а не знахідкою безпеки.

Параметри CLI​

ПараметрЗначенняОпис
--patternджерело регулярного виразуПеревірити один шаблон. Повторіть, щоб перевірити кілька, по вердикту на шаблон, у тому самому порядку.
--flagsпрапорці регулярного виразуПеревірити кожен --pattern з цими прапорцями, як-от im. Діє лише в режимі check.
--dirкаталогОбмежити перевірку каталогом. Повторюється й поєднується з --file.
--fileфайлОбмежити перевірку одним файлом. Повторюється й поєднується з --dir.
--limitневід'ємне ціле числоЗадати ліміт повторень ReDoS (за замовчуванням 25). Діє в обох режимах. Нижчий ліміт суворіший.

Без параметрів хук перевіряє весь проєкт. --pattern вмикає режим check і не поєднується з --dir чи --file.

Підтримувані мови​

Перевірка читає ці мови, визначаючи їх за розширенням файлу, кожну за її власними правилами, тож шаблон з однієї мови ніколи не перевіряється за правилами іншої. Усе інше пропускається, а не перевіряється за хибними правилами.

#МоваРозширення
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
Найкраще з можливого, але не вичерпно

Хук читає вихідний код як текст, тож не може оцінити шаблон, зібраний під час виконання, а шаблон, розкиданий на кілька рядків, прихований за псевдонімом або записаний у формі, яку хук не розпізнає, може прослизнути. Сприймайте розділи як надійну відправну точку, а не як повний перелік, і читайте код далі, щоб охопити те, до чого вони не дістаються.

Перевірка окремого шаблону​

Передайте --pattern із джерелом шаблону, щоб оцінити його. Хук виводить одне слово: safe, unsafe, undetermined, коли аналіз досягає свого ліміту роботи, не дійшовши висновку, або invalid regex. Повторіть --pattern, щоб оцінити кілька шаблонів одразу, по вердикту на шаблон, у тому самому порядку.

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

npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
Чому аргумент у лапках

Кожен шаблон передається як значення прапорця й ніколи не підставляється в команду. Значення з лапками чи зворотними апострофами залишається інертним і не може здійснити ін'єкцію в оболонку. Завжди беріть шаблон в одинарні лапки, щоб ваша оболонка не розгорнула його першою.

порада

Це той самий рушій, який запускає спеціалізація regex: перевірка scan відкриває прохід ReDoS, а check підтверджує шаблон, який вона виявляє.

Часті запитання

Виконайте npx lagune read regex --pattern '<pattern>'. Хук повертає safe, unsafe, undetermined або invalid regex.

Запустіть хук regex у режимі scan над кодовою базою. Він повідомляє про шаблони, схильні до ReDoS, у 25 підтримуваних мовах.