Was sind PCRE-Grenzwerte?

11

In ModSecurity gibt es PCRE limits exceededFehler.

Ich weiß, dass ich dies beheben kann, indem ich Regeln wie:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Aber was machen diese Regeln eigentlich? Was bedeutet die auf 150.000 festgelegte PCRE-Grenzrekursion? Welche Sicherheitslücken lasse ich durch, wenn ich diese so hoch stelle? Was bedeutet das recursionund limit?

Ich weiß, dass es Dokumentation gibt, aber die Dokumentation sagt mir nicht wirklich, was los ist, sondern sagt mir einfach, wie ich mit den Anweisungen arbeiten soll.

Andy Lester
quelle
Ich bearbeite diesen Beitrag, um das "Perl" -Tag in "pcre" zu ändern. PCRE ist nicht Perl, trotz des Akronyms, an das Sie glauben würden.
Andy Lester

Antworten:

13

Dies scheinen Einstellungen innerhalb der PCRE-Engine zu sein, um die maximale Menge an Speicher / Zeit zu begrenzen, die für den Versuch aufgewendet wird, Text mit einem Muster abzugleichen. Die pcreapi Manpage erklärt es nur wenig mit Laien:

Das Feld match_limit bietet eine Möglichkeit, zu verhindern, dass PCRE eine große Menge an Ressourcen verbraucht, wenn Muster ausgeführt werden, die nicht übereinstimmen, deren Suchbäume jedoch eine sehr große Anzahl von Möglichkeiten bieten. Das klassische Beispiel ist die Verwendung verschachtelter unbegrenzter Wiederholungen.

Intern verwendet PCRE eine Funktion namens match (), die wiederholt (manchmal rekursiv) aufgerufen wird. Das durch match_limit festgelegte Limit wird festgelegt, wie oft diese Funktion während eines Matchs aufgerufen wird, wodurch der Umfang des Backtracking begrenzt wird, der stattfinden kann. Bei Mustern, die nicht verankert sind, wird die Zählung für jede Position in der Betreffzeichenfolge von Null neu gestartet.

Der Standardwert für das Limit kann festgelegt werden, wenn PCRE erstellt wird. Der Standardwert ist 10 Millionen, was alle bis auf die extremsten Fälle behandelt. Sie können die Standardeinstellung überschreiben, indem Sie pcre_exec () mit einem pcre_extra-Block ergänzen, in dem match_limit festgelegt ist, und PCRE_EXTRA_MATCH_LIMIT im Feld flags. Wenn das Limit überschritten wird, gibt pcre_exec () PCRE_ERROR_MATCHLIMIT zurück.

Das Feld match_limit_recursion ähnelt match_limit, begrenzt jedoch nicht die Gesamtzahl der Aufrufe von match (), sondern die Rekursionstiefe. Die Rekursionstiefe ist kleiner als die Gesamtzahl der Aufrufe, da nicht alle Aufrufe von match () rekursiv sind. Diese Grenze ist nur dann von Nutzen, wenn sie kleiner als match_limit ist.

Da die in der PCRE-Bibliothek integrierte Standardeinstellung 10000000 ist, wird meiner Meinung nach die niedrigere Einstellung für mod_security empfohlen, um zu verhindern, dass Anforderungen für längere Zeit angehalten werden.

DerfK
quelle
modsecurity scheint einen Standardwert von 1500 zu haben , der deutlich unter 1M liegt. Der OP-Wert von 150000 würde dann die Einstellung erhöhen und nicht verringern.
Paul Mougel