Компания Microsoft выпустила Regex Fuzzer, который проверяет регулярные выражения .NET на уязвимость к одной из форм атаки Denial of Service. Как это работает и насколько серьезна проблема?
Вы можете подумать, что регулярные выражения великолепны и совершенно безобидны — ведь они не уязвимы к атакам типа SQL injection. Однако невинное на вид регулярное выражение может быть использовано в зловещих целях. Если злоумышленник знает, что входные данные проходят через регулярное выражение, он может отправить ему последовательность символов, которая запустит его в бесконечный цикл. В результате ваше приложение зацикливается, становится неотзывчивым и расходует ресурсы, т.е. происходит отказ в обслуживании или DoS-атака.
Конечно, проблема для атакующего и для вас заключается в том, чтобы выяснить, какая последовательность символов, если таковая имеется, отправит регулярное выражение в бесконечный цикл. Можно играть в эту игру целый день, но проще написать инструмент для автоматического тестирования, чем и является Regex Fuzzer. Вы вводите выражение, и оно тестируется с наборами входных символов. Если вы тестируете его достаточно долго, то ваша уверенность растет: если вы не можете найти эффективную строку, то и злоумышленник не сможет.
Удивительно, что нельзя создать детерминированный тест на то, что регулярное выражение не зациклится, но, похоже, что если разрешить группы перехвата и обратное отслеживание, то система вычислений становится настолько мощной, что становится такой же сложной, как проблема остановки машины Тьюринга, которая, конечно же, неразрешима.
Инструмент тестирования можно загрузить с сайта:
Microsoft Downloads
а более подробную информацию можно найти по адресу:
http://www.microsoft.com/security/sdl/default.aspx