
Находит регулярные выражения, уязвимые для ReDoS (атака отказа в обслуживании через регулярные выражения).

Находит регулярные выражения, уязвимые для отказа в обслуживании через регулярные выражения (ReDoS).
Подробнее в блоге Doyensec
Многие стандартные парсеры регулярных выражений имеют неограниченную сложность в худшем случае. Сопоставление regex может быть быстрым при работе с подходящей входной строкой. Однако некоторые несовпадающие строки могут заставить движок регулярных выражений уйти в бесконечный бэктрекинг и занимать много времени на обработку. Это может привести к отказу в обслуживании, так как процессор будет заблокирован попытками сопоставить regex.
Этот инструмент предназначен для:
Здесь отражается сложность процедуры бэктрекинга в движке регулярных выражений относительно длины введённой строки.
Кубическая сложность означает, что при удвоении длины уязвимой части строки время выполнения увеличится примерно в 8 раз (2^3).
Для экспоненциального ReDoS со звёздами внутри звёзд (например, (a*)*$) используется поправочный коэффициент, и сложность будет больше 10.
Для эксплуатации обычно требуется как минимум кубическая сложность, если только не допускаются действительно гигантские строки.
Запустите regexploit и введите регулярное выражение v\w*_\w*_\w*$ в командной строке.
$ regexploit
v\w*_\w*_\w*$
Pattern: v\w*_\w*_\w*$
---
Worst-case complexity: 3 ⭐⭐⭐ (cubic)
Repeated character: [5f:_]
Final character to cause backtracking: [^WORD]
Example: 'v' + '_' * 3456 + '!'
Часть \w*_\w*_\w* содержит три перекрывающихся повторяющихся группы (\w соответствует буквам, цифрам и подчёркиваниям). Как показано в строке Repeated character: [5f:_], длинная строка из _ (0x5f) будет соответствовать этому разделу множеством разных способов. Сложность в худшем случае равна 3, так как есть 3 бесконечно повторяющиеся группы. Приведён пример для вызова ReDoS: он состоит из обязательного префикса v, длинной строки _ и затем ! (не-словесного символа), вызывающего бэктрекинг. Не для всех ReDoS требуется специальный символ в конце, но в данном случае длинная строка _ успешно сопоставится и не вызовет бэктрекинг. Строка Final character to cause backtracking: [^WORD] показывает, что в конце требуется несовпадающий символ (не буквенно-цифровой), чтобы предотвратить совпадение и вызвать ReDoS.
В качестве другого примера установите модуль, уязвимый для ReDoS, например pip install ua-parser==0.9.0.
Чтобы просканировать установленные Python-модули, выполните regexploit-python-env.
Importing ua_parser.user_agent_parser
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: \bSmartWatch *\( *([^;]+) *; *([^;]+) *;
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(' + ' ' * 3456
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(0;' + ' ' * 3456
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: ; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [[0-9]]
Example: ';0 Build/HuaweiA' + '0' * 3456
...
Для каждого уязвимого регулярного выражения выводится одна или несколько вредоносных строк для запуска ReDoS. Установка User-Agent в ;0 Build/HuaweiA000000000000000... и просмотр сайта, использующего старую версию ua-parser, может заставить сервер долго обрабатывать ваш запрос, скорее всего, завершившись статусом 502.
Требуется Python 3.8+. Для извлечения regex из JavaScript/TypeScript также требуется NodeJS 12+.
Опционально создайте виртуальное окружение
python3 -m venv .env
source .env/bin/activate
Теперь установите через pip
pip install regexploit
Вводите регулярные выражения через stdin (по одному на строку) в regexploit.
regexploit
или через файл
cat myregexes.txt | regexploit
Встроена поддержка разбора regex из Python, JavaScript, TypeScript, C#, YAML и JSON.
Разбирает код Python (без выполнения) через AST, чтобы найти regex. Затем regex анализируются на ReDoS.
regexploit-py my-project/
regexploit-py "my-project/**/*.py" --glob
Будет использован встроенный NodeJS-пакет в regexploit/bin/javascript, который разбирает ваш JavaScript как AST с помощью eslint и выводит все regex.
Эти regex передаются в Python-инструмент для поиска ReDoS.
regexploit-js my-module/my-file.js another/file.js some/folder/
regexploit-js "my-project/node_modules/**/*.js" --glob
Обратите внимание: существуют различия в разборе regex между javascript и python, поэтому возможны ошибки. Я не уверен, что хочу писать AST для JS regex!
Поиск regex во всех установленных в вашем окружении Python-модулях. Это означает, что вы можете pip install любые интересующие вас модули, и они будут проанализированы. Включается и код CPython.
regexploit-python-env
Обратите внимание: это не разбирает код Python в AST, а находит только regex, скомпилированные автоматически при импорте модуля. Модули фактически импортируются, поэтому код в модулях будет выполнен. Это полезно для поиска regex, которые собираются из более мелких строк при загрузке, например CVE-2021-25292 в Pillow
Поддержка YAML требует pyyaml, который можно установить командой pip install regexploit[yaml].
regexploit-json *.json
regexploit-yaml *.yaml
regexploit-csharp something.cs
Этот инструмент создан Беном Коллером (Ben Caller) из Doyensec LLC в рамках исследовательского времени.