Jakie są limity PCRE?

11

W ModSecurity występują PCRE limits exceededbłędy.

Wiem, że mogę to naprawić, ustawiając reguły takie jak:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Ale co właściwie robią te zasady? Co oznacza limit rekurencji PCRE ustawiony na 150 000? Jakie dziury w zabezpieczeniach pozwalam, ustawiając je tak wysoko? Co znaczy recursioni limit?

Wiem, że istnieje dokumentacja, ale tak naprawdę nie mówi mi, co się dzieje, po prostu mówi mi, jak pracować z dyrektywami.

Andy Lester
źródło
Edytuję ten post, aby zmienić tag „perl” na „pcre”. PCRE to nie Perl, pomimo tego, jak akronim chciałbyś w to uwierzyć.
Andy Lester,

Odpowiedzi:

13

Wygląda na to, że są to ustawienia wewnętrzne silnika PCRE w celu ograniczenia maksymalnej ilości pamięci / czasu poświęconego na dopasowanie tekstu do wzorca. pcreapi Podręcznika robi niewiele, aby wyjaśnić w laika:

Pole match_limit zapewnia środki zapobiegające zużyciu przez PCRE dużej ilości zasobów podczas uruchamiania wzorców, które nie będą pasować, ale które mają bardzo wiele możliwości w drzewach wyszukiwania. Klasycznym przykładem jest użycie zagnieżdżonej nieograniczonej liczby powtórzeń.

Wewnętrznie PCRE korzysta z funkcji o nazwie match (), którą wywołuje wielokrotnie (czasem rekurencyjnie). Limit ustawiony przez match_limit jest nakładany na liczbę wywołań tej funkcji podczas meczu, co powoduje ograniczenie ilości cofnięć, które mogą mieć miejsce. W przypadku wzorów, które nie są zakotwiczone, liczenie rozpoczyna się od zera dla każdej pozycji w ciągu znaków.

Domyślną wartość limitu można ustawić po zbudowaniu PCRE; domyślna wartość domyślna to 10 milionów, która obsługuje wszystkie oprócz najbardziej ekstremalnych przypadków. Możesz zastąpić wartość domyślną, zastępując pcre_exec () blokiem pcre_extra, w którym ustawiono limit_pasowania, a PCRE_EXTRA_MATCH_LIMIT ustawia się w polu flagi. Jeśli limit zostanie przekroczony, pcre_exec () zwraca PCRE_ERROR_MATCHLIMIT.

Pole match_limit_recursion jest podobne do pola match_limit, ale zamiast ograniczać całkowitą liczbę wywołań match (), ogranicza głębokość rekurencji. Głębokość rekurencji jest mniejsza niż całkowita liczba wywołań, ponieważ nie wszystkie wywołania match () są rekurencyjne. Limit ten jest użyteczny tylko wtedy, gdy jest ustawiony mniejszy niż match_limit.

Ponieważ domyślną wartością wbudowanej biblioteki PCRE jest 10000000, domyślam się, że niższe ustawienie jest zalecane dla mod_security, aby zapobiec wstrzymywaniu żądań przez długi czas.

DerfK
źródło
Wydaje się, że modsecurity ma domyślną wartość 1500 , która jest znacznie niższa niż 1M. Wartość OP równa 150000 zwiększałaby wówczas ustawienie, nie zmniejszając go.
Paul Mougel,