¿Qué son los límites de PCRE?

11

En ModSecurity hay PCRE limits exceedederrores.

Sé que puedo solucionar esto estableciendo reglas como:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Pero, ¿qué están haciendo estas reglas realmente? ¿Qué significa el límite de recursión PCRE establecido en 150,000? ¿Qué agujeros de seguridad estoy permitiendo al establecer estos tan altos? ¿Qué significa el recursiony limit?

Sé que hay documentación, pero la documentación en realidad no me dice qué está pasando, simplemente me dice cómo trabajar con las directivas.

Andy Lester
fuente
Estoy editando esta publicación para cambiar la etiqueta "perl" a "pcre". PCRE no es Perl, a pesar de lo que el acrónimo te haría creer.
Andy Lester

Respuestas:

13

Estas parecen ser configuraciones internas del motor PCRE para limitar la cantidad máxima de memoria / tiempo invertido en tratar de hacer coincidir un texto con un patrón. La página de pcreapi manual hace poco para explicarlo en términos simples:

El campo match_limit proporciona un medio para evitar que PCRE use una gran cantidad de recursos al ejecutar patrones que no van a coincidir, pero que tienen una gran cantidad de posibilidades en sus árboles de búsqueda. El ejemplo clásico es el uso de repeticiones ilimitadas anidadas.

Internamente, PCRE utiliza una función llamada match () que llama repetidamente (a veces de forma recursiva). El límite establecido por match_limit se impone al número de veces que se llama a esta función durante una partida, lo que tiene el efecto de limitar la cantidad de retroceso que puede tener lugar. Para los patrones que no están anclados, el recuento se reinicia desde cero para cada posición en la cadena de asunto.

El valor predeterminado para el límite se puede establecer cuando se construye PCRE; el valor predeterminado predeterminado es 10 millones, que maneja todos menos los casos más extremos. Puede anular el valor predeterminado al sustituir pcre_exec () con un bloque pcre_extra en el que se establece match_limit y PCRE_EXTRA_MATCH_LIMIT se establece en el campo de marcas. Si se excede el límite, pcre_exec () devuelve PCRE_ERROR_MATCHLIMIT.

El campo match_limit_recursion es similar a match_limit, pero en lugar de limitar el número total de veces que se llama a match (), limita la profundidad de la recursividad. La profundidad de recursión es un número menor que el número total de llamadas, porque no todas las llamadas a la coincidencia () son recursivas. Este límite es de uso solo si se establece más pequeño que match_limit.

Dado que el valor predeterminado incorporado de la biblioteca PCRE es 10000000, supongo que se sugiere la configuración más baja para mod_security para evitar que las solicitudes se retengan durante mucho tiempo.

DerfK
fuente
Modsecurity parece tener un valor predeterminado de 1500 , que es significativamente menor que 1M. El valor de OP de 150000 aumentaría la configuración, no la disminuiría.
Paul Mougel