В ModSecurity есть PCRE limits exceeded
ошибки.
Я знаю, что могу исправить это, установив такие правила, как:
SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000
Но что на самом деле делают эти правила? Что означает предельная рекурсия PCRE, равная 150 000? Какие дыры в безопасности я позволяю себе, устанавливая их так высоко? Что это recursion
и limit
значит?
Я знаю, что есть документация, но на самом деле она не говорит мне, что происходит, она просто говорит мне, как работать с директивами.
Похоже, что это внутренние настройки механизма 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 предлагается более низкая настройка, чтобы запросы не задерживались в течение длительного времени.