Каковы ограничения PCRE?

11

В ModSecurity есть PCRE limits exceededошибки.

Я знаю, что могу это исправить, установив такие правила, как:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Но что на самом деле делают эти правила? Что означает ограничение рекурсии PCRE до 150 000? Какие дыры в безопасности я пропускаю, устанавливая их так высоко? Что значит recursionи limitчто?

Я знаю, что есть документация, но документация фактически не говорит мне, что происходит, она просто говорит мне, как работать с директивами.

Энди Лестер
источник
Я редактирую этот пост, чтобы изменить тег "perl" на "pcre". PCRE - это не Perl, несмотря на то, что аббревиатура заставит вас поверить.
Энди Лестер

Ответы:

13

Похоже, что они являются внутренними настройками механизма PCRE, чтобы ограничить максимальный объем памяти / время, затрачиваемое на сопоставление некоторого текста с шаблоном. pcreapi Страница руководства делает мало , чтобы объяснить это с точки зрения непрофессионала:

Поле match_limit позволяет предотвратить использование PCRE огромного количества ресурсов при запуске шаблонов, которые не будут соответствовать, но которые имеют очень большое количество возможностей в своих деревьях поиска. Классическим примером является использование вложенных неограниченных повторов.

Внутри PCRE использует функцию match (), которую он вызывает неоднократно (иногда рекурсивно). Ограничение, установленное match_limit, накладывается на количество раз, которое эта функция вызывается во время сопоставления, что приводит к ограничению количества возвратов, которые могут иметь место. Для шаблонов, которые не привязаны, отсчет начинается с нуля для каждой позиции в строке темы.

Значение по умолчанию для лимита может быть установлено при сборке PCRE; значение по умолчанию составляет 10 миллионов, что обрабатывает все, кроме самых крайних случаев. Вы можете переопределить значение по умолчанию, добавив pcre_exec () к блоку pcre_extra, в котором установлено match_limit, а в поле флагов установлено PCRE_EXTRA_MATCH_LIMIT. Если лимит превышен, pcre_exec () возвращает PCRE_ERROR_MATCHLIMIT.

Поле match_limit_recursion аналогично match_limit, но вместо ограничения общего числа вызовов метода match () оно ограничивает глубину рекурсии. Глубина рекурсии меньше, чем общее количество вызовов, потому что не все вызовы match () являются рекурсивными. Этот предел полезен, только если он установлен меньше, чем match_limit.

Поскольку встроенная библиотека PCRE по умолчанию - 10000000, я предполагаю, что для mod_security предлагается более низкая настройка, чтобы запросы не задерживались в течение длительного времени.

DerfK
источник
modsecurity, по-видимому, имеет значение по умолчанию 1500 , что значительно ниже, чем 1M. Тогда значение ОП 150000 будет увеличивать настройку, а не уменьшать ее.
Пол Муджел