Quali sono i limiti PCRE?


11

In ModSecurity ci sono PCRE limits exceedederrori.

So di poterlo risolvere impostando regole come:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Ma cosa stanno realmente facendo queste regole? Cosa significa la ricorsione del limite PCRE impostata su 150.000? Quali falle di sicurezza sto permettendo attraverso l'impostazione di questi così alti? Cosa significa " recursione" limit?

So che c'è documentazione, ma la documentazione in realtà non mi dice cosa sta succedendo, mi dice semplicemente come lavorare con le direttive.


Sto modificando questo post per cambiare il tag "perl" in "pcre". PCRE non è Perl, nonostante ciò che l'acronimo vorrebbe farti credere.
Andy Lester,

Risposte:


13

Queste sembrano essere impostazioni interne al motore PCRE al fine di limitare la quantità massima di memoria / tempo impiegato nel tentativo di abbinare del testo a un modello. La pcreapi manpage fa ben poco per spiegarlo in parole povere:

Il campo match_limit fornisce un mezzo per impedire a PCRE di utilizzare una grande quantità di risorse durante l'esecuzione di schemi che non corrisponderanno, ma che hanno un numero molto grande di possibilità nei loro alberi di ricerca. L'esempio classico è l'uso di ripetizioni illimitate nidificate.

Internamente, PCRE utilizza una funzione chiamata match () che chiama ripetutamente (a volte in modo ricorsivo). Il limite impostato da match_limit è imposto sul numero di volte in cui questa funzione viene chiamata durante una partita, il che ha l'effetto di limitare la quantità di backtracking che può aver luogo. Per i motivi che non sono ancorati, il conteggio riparte da zero per ciascuna posizione nella stringa del soggetto.

Il valore predefinito per il limite può essere impostato quando viene creato PCRE; il valore predefinito è 10 milioni, che gestisce tutti tranne i casi più estremi. È possibile ignorare l'impostazione predefinita supplendo pcre_exec () con un blocco pcre_extra in cui è impostato match_limit e PCRE_EXTRA_MATCH_LIMIT è impostato nel campo flags. Se il limite viene superato, pcre_exec () restituisce PCRE_ERROR_MATCHLIMIT.

Il campo match_limit_recursion è simile a match_limit, ma invece di limitare il numero totale di volte in cui viene chiamato match (), limita la profondità della ricorsione. La profondità di ricorsione è un numero inferiore rispetto al numero totale di chiamate, poiché non tutte le chiamate a match () sono ricorsive. Questo limite è utile solo se è impostato su un valore inferiore a match_limit.

Poiché il valore predefinito predefinito della libreria PCRE è 10000000, la mia ipotesi è che l'impostazione inferiore sia suggerita per mod_security al fine di impedire che le richieste vengano trattenute a lungo.


modsecurity sembra avere un valore predefinito di 1500 , che è significativamente inferiore a 1 milione. Il valore di OP di 150000 aumenterebbe quindi l'impostazione, non diminuendola.
Paul Mougel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.