Quelles sont les limites du PCRE?

11

Dans ModSecurity, il y a des PCRE limits exceedederreurs.

Je sais que je peux résoudre ce problème en définissant des règles telles que:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Mais que font réellement ces règles? Que signifie la récursion PCRE limitée à 150 000? Quels trous de sécurité puis-je laisser passer en les réglant si haut? Que signifie le recursionet limit?

Je sais qu'il y a de la documentation, mais la documentation ne me dit pas vraiment ce qui se passe, elle me dit simplement comment travailler avec les directives.

Andy Lester
la source
J'édite ce post pour changer la balise "perl" en "pcre". PCRE n'est pas Perl, malgré ce que l'acronyme voudrait vous faire croire.
Andy Lester

Réponses:

13

Ceux-ci semblent être des paramètres internes au moteur PCRE afin de limiter la quantité maximale de mémoire / temps passé à essayer de faire correspondre du texte à un modèle. La pcreapi page de manuel ne l'explique pas en termes simples:

Le champ match_limit fournit un moyen d'empêcher PCRE d'utiliser une grande quantité de ressources lors de l'exécution de modèles qui ne vont pas correspondre, mais qui ont un très grand nombre de possibilités dans leurs arbres de recherche. L'exemple classique est l'utilisation de répétitions illimitées imbriquées.

En interne, PCRE utilise une fonction appelée match () qu'il appelle à plusieurs reprises (parfois récursivement). La limite définie par match_limit est imposée sur le nombre d'appels de cette fonction pendant une correspondance, ce qui a pour effet de limiter la quantité de retour en arrière qui peut avoir lieu. Pour les modèles qui ne sont pas ancrés, le décompte redémarre à partir de zéro pour chaque position dans la chaîne du sujet.

La valeur par défaut de la limite peut être définie lors de la construction de PCRE; la valeur par défaut est 10 millions, ce qui prend en charge tous les cas sauf les plus extrêmes. Vous pouvez remplacer la valeur par défaut en ajoutant pcre_exec () avec un bloc pcre_extra dans lequel match_limit est défini et PCRE_EXTRA_MATCH_LIMIT est défini dans le champ flags. Si la limite est dépassée, pcre_exec () renvoie PCRE_ERROR_MATCHLIMIT.

Le champ match_limit_recursion est similaire à match_limit, mais au lieu de limiter le nombre total de fois que match () est appelé, il limite la profondeur de la récursivité. La profondeur de récursivité est un nombre inférieur au nombre total d'appels, car tous les appels à match () ne sont pas récursifs. Cette limite n'est utile que si elle est inférieure à match_limit.

Étant donné que la bibliothèque PCRE intégrée par défaut est 10000000, je suppose que le paramètre inférieur est suggéré pour mod_security afin d'éviter que les demandes ne soient bloquées pendant une longue période.

DerfK
la source
modsecurity semble avoir une valeur par défaut de 1500 , ce qui est nettement inférieur à 1M. La valeur OP de 150000 augmenterait alors le réglage, pas le diminuerait.
Paul Mougel