Хуки

Хук regex: обнаружение шаблонов, уязвимых к ReDoS

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

Хук regex представляет собой детерминированный движок проверки безопасности регулярных выражений, который запускает специализация regex, и вы можете запускать его сами. Он работает в двух режимах одной командой: сканирование проверяет кодовую базу на шаблоны, уязвимые к ReDoS или собираемые во время выполнения, а проверка оценивает отдельный шаблон, который вы ему передаете.

Сканирование кодовой базы​

Без флага хук сканирует весь проект. --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. Действует только в режиме проверки.
--dirдиректорияОграничивает сканирование директорией. Можно повторять и сочетать с --file.
--fileфайлОграничивает сканирование одним файлом. Можно повторять и сочетать с --dir.
--limitнеотрицательное целое числоЗадает лимит повторений ReDoS (по умолчанию 25). Действует в обоих режимах. Чем ниже лимит, тем строже проверка.

Без параметров хук сканирует весь проект. --pattern включает режим проверки и не сочетается с --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: сканирование открывает проход по ReDoS, а проверка подтверждает найденный им шаблон.

Частые вопросы

Выполните npx lagune read regex --pattern '<pattern>'. Команда возвращает safe, unsafe, undetermined или invalid regex.

Запустите хук regex в режиме сканирования по кодовой базе. Он сообщает о шаблонах, уязвимых к ReDoS, на 25 поддерживаемых языках.