Есть новый инструмент, который может определять ресурсоемкие регулярные выражения, которые потенциально могут быть использованы при запуске атак ReDos.
Можно ли безопасно использовать регулярные выражения на разных языках? Я изучил, можно ли повторно использовать регулярное выражение, созданное на JavaScript, дословно в Python. Приведет ли это к таким же результатам и производительности? Поменяйте интересующие языки вместо JavaScript и Python; вопрос остается прежним. Оставив в стороне вопрос о равенстве межъязыковых результатов, в статье также рассматривается сторона производительности, которая прекрасно связана с историей Regxploit.
Результаты по производительности были следующими:
Из-за различий в базовых алгоритмах, на которых основаны механизмы регулярных выражений, для сопоставления на некоторых языках может потребоваться большее, чем линейное время (полиномиальное или экспоненциальное в худшем случае) длины регулярного выражения и входной строки. Это называется суперлинейным соответствием, и некоторые механизмы регулярных выражений становятся жертвой этого суперлинейного поведения, в то время как более мудрые избегают его.
Таким образом, регулярные выражения, попадающие в эту суперлинейную категорию, могут быть использованы путем подачи специально созданных строк, которые впоследствии перегрузят хост, то есть веб-сервер, как при DoS-атаке, в конечном итоге поставив его на колени.
Итак, что вы можете с этим поделать? Конечно, создавайте регулярные выражения правильно. Однако проблема в том, что по самой своей природе они уже настолько плотны, что не могут быть адекватно протестированы, плюс само тестирование зависит от входных данных, что означает, что это могут быть данные в формате, который вы не предсказывали. , тот, который вызывает повреждение.
Другой вариант, как показано в разделе «Можно ли безопасно повторно использовать регулярные выражения на разных языках?», — выбрать Perl или PHP:
В наших экспериментах экспоненциальное поведение было необычным в PHP и Perl, в то время как оно происходит примерно с той же скоростью в Java, JavaScript, Python и Ruby.
Точно так же PHP и Perl имеют меньшую частоту полиномиального поведения, чем другие движки Спенсера. Различия между этими двумя семействами можно объяснить сочетанием защиты и оптимизации.
Таким образом, кажется, что PHP и Perl, PHP, вероятно, потому, что он использует библиотеку PCRE (Perl Compatible Regular Expressions), были единственными, у которых была явная защита от экспоненциального поведения во времени.
Прочтите эту статью, чтобы составить полное представление.
Если вы не используете один из этих языков или не хотите полагаться на их механизмы выполнения для защиты, но хотите как можно скорее добраться до источника проблемы, вы можете использовать Regexploit, инструмент, который сканирует ваш код, чтобы найти эти уязвимые регулярные выражения.
Вы вводите регулярные выражения через стандартный ввод или через файл, и Regexploit проводит их, пытаясь найти неоднозначности и способы сделать регулярное выражение несоответствующим, так что движку регулярных выражений приходится возвращаться. Если регулярное выражение выглядит нормально, оно скажет «ReDoS не найден».
Инструмент имеет встроенную поддержку извлечения регулярных выражений из Python, JavaScript, TypeScript, C #, JSON и YAML, но:
Если вы можете извлекать регулярные выражения из других языков, их можно передать по конвейеру и проанализировать.
Означает ли это, что он может работать с любым переданным в него регулярным выражением? Это требование единообразия напоминает мне о самой проблеме: «Можно ли безопасно повторно использовать регулярные выражения на разных языках?» намеревался открыть для себя. Поэтому я перефразирую: «Можно ли безопасно повторно использовать Regexploit на разных языках?» Поддерживает ли он все диалекты регулярных выражений? Об этом я должен спросить у создателей. Дойенсек.
Этот инструмент также использовался для анализа нескольких самых популярных библиотек npm и pypi (то есть диалектов Javascript и Python), взятых из library.io. Выяснилось, что наиболее проблемной областью было использование регулярных выражений для синтаксического анализа языков программирования или разметки. Я предполагаю, что для некоторых вещей вы не должны использовать регулярные выражения, например, для синтаксического анализа HTML. См. Вы не можете разобрать [X] HTML с помощью регулярного выражения.
Лучше оставьте эту работу специализированным синтаксическим анализаторам. Кроме того, следующей обнаруженной проблемной областью было неправильное обращение с необязательными пробелами.
Установка очень проста:
pip install regexploit
и может быть вызван путем передачи ему регулярного выражения на стандартный ввод или конвейер в файле:
кот myregexes.txt | regexploit
Как уже было сказано, существует встроенная поддержка синтаксического анализа регулярных выражений из Python, JavaScript, TypeScript, C #, YAML и JSON, но для извлечения регулярных выражений из кода JavaScript / TypeScript также требуется NodeJS 12+.
Так может ли Regexploit стать частью вашего арсенала, если не полностью заменить его против ReDoS? Поскольку инструмент поддерживает только механизмы регулярных выражений NFA, вам понадобится всего одно дополнительное — используйте DFA, как это делает Go, и будьте полностью безопасны.