Quais são os limites do PCRE?

11

No ModSecurity há PCRE limits exceedederros.

Eu sei que posso corrigir isso definindo regras como:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Mas, o que essas regras estão realmente fazendo? O que o limite de recursão do PCRE definido para 150.000 significa? Que brechas de segurança eu estou deixando passar, definindo essas tão altas? O que significa recursionelimit

Eu sei que há documentação, mas a documentação não me diz o que está acontecendo, simplesmente me diz como trabalhar com as diretivas.

Andy Lester
fonte
Estou editando este post para alterar a tag "perl" para "pcre". PCRE não é Perl, apesar do que a sigla quer que você acredite.
Andy Lester

Respostas:

13

Essas parecem ser configurações internas do mecanismo PCRE, a fim de limitar a quantidade máxima de memória / tempo gasto na tentativa de corresponder algum texto a um padrão. A página de pcreapi manual faz pouco para explicá-lo nos termos do leigo:

O campo match_limit fornece um meio de impedir que o PCRE use uma grande quantidade de recursos ao executar padrões que não corresponderão, mas que possuem um número muito grande de possibilidades em suas árvores de pesquisa. O exemplo clássico é o uso de repetições ilimitadas aninhadas.

Internamente, o PCRE usa uma função chamada match () que chama repetidamente (às vezes recursivamente). O limite definido por match_limit é imposto ao número de vezes que essa função é chamada durante uma partida, o que tem o efeito de limitar a quantidade de retorno que pode ocorrer. Para padrões que não são ancorados, a contagem é reiniciada a partir de zero para cada posição na sequência de assunto.

O valor padrão para o limite pode ser definido quando o PCRE é construído; o padrão é 10 milhões, que lida com todos os casos, exceto os mais extremos. Você pode substituir o padrão fornecendo pcre_exec () a um bloco pcre_extra no qual match_limit está definido e PCRE_EXTRA_MATCH_LIMIT está definido no campo flags. Se o limite for excedido, pcre_exec () retornará PCRE_ERROR_MATCHLIMIT.

O campo match_limit_recursion é semelhante ao match_limit, mas, em vez de limitar o número total de vezes que match () é chamado, limita a profundidade da recursão. A profundidade da recursão é um número menor que o número total de chamadas, porque nem todas as chamadas para correspondência () são recursivas. Esse limite é útil apenas se for definido menor que match_limit.

Como o padrão interno da biblioteca PCRE é 10000000, meu palpite é que a configuração mais baixa é sugerida para mod_security, a fim de impedir que as solicitações sejam retidas por um longo tempo.

DerfK
fonte
O modsecurity parece ter um valor padrão de 1500 , que é significativamente menor que 1M. O valor de OP 150000 aumentaria a configuração, não a diminuiria.
Paul Mougel