PCRE 한도는 무엇입니까?


11

ModSecurity에는 PCRE limits exceeded오류 가 있습니다.

다음과 같은 규칙을 설정하여이 문제를 해결할 수 있다는 것을 알고 있습니다.

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

그러나 이러한 규칙은 실제로 무엇을하고 있습니까? PCRE 제한 재귀가 150,000으로 설정된 것은 무엇을 의미합니까? 이를 너무 높게 설정하여 어떤 보안 허점을 극복 할 수 있습니까? 뭐라고합니까 recursionlimit의미?

나는 문서가 있다는 것을 알고 있지만 문서는 실제로 무슨 일이 일어나고 있는지 알려주지 않고 지시문으로 작업하는 방법을 알려줍니다.


"perl"태그를 "pcre"로 변경하기 위해이 게시물을 편집하고 있습니다. PCRE는 약어가 무엇을 믿더라도 펄이 아닙니다.
Andy Lester

답변:


13

일부 텍스트와 패턴을 일치시키는 데 소요되는 최대 메모리 / 시간을 제한하기 위해 PCRE 엔진 내부의 설정 인 것으로 보입니다. pcreapi 맨은 쉽게 설명하자면에서 그것을 설명하기 위해 작은 않습니다 :

match_limit 필드는 일치하지는 않지만 검색 트리에 많은 가능성이있는 패턴을 실행할 때 PCRE가 방대한 양의 자원을 사용하지 못하게하는 수단을 제공합니다. 전형적인 예는 중첩 된 무제한 반복을 사용하는 것입니다.

내부적으로 PCRE는 반복적으로 (때로는 재귀 적으로) 호출하는 match ()라는 함수를 사용합니다. match_limit에 의해 설정된 한계는 일치하는 동안이 함수가 호출 된 횟수에 부과되며, 이로 인해 발생할 수있는 역 추적의 양을 제한하는 효과가 있습니다. 고정되지 않은 패턴의 경우 대상 문자열의 각 위치에 대해 카운트가 0부터 다시 시작됩니다.

PCRE가 빌드 될 때 한계의 기본값을 설정할 수 있습니다. 기본 기본값은 천만이며 가장 극단적 인 경우를 모두 처리합니다. pcre_exec ()에 match_limit가 설정되고 pcRE_EXTRA_MATCH_LIMIT가 플래그 필드에 설정되어있는 pcre_extra 블록을 제공하여 기본값을 대체 할 수 있습니다. 제한이 초과되면 pcre_exec ()는 PCRE_ERROR_MATCHLIMIT를 반환합니다.

match_limit_recursion 필드는 match_limit와 비슷하지만 match ()가 호출되는 총 횟수를 제한하는 대신 재귀 수준을 제한합니다. match ()에 대한 모든 호출이 재귀 적이지는 않기 때문에 재귀 수준은 총 호출 수보다 작은 수입니다. 이 한계는 match_limit보다 작게 설정된 경우에만 사용됩니다.

PCRE 라이브러리 내장 기본값은 10000000이므로 요청이 오랫동안 유지되지 않도록 mod_security에 대해 더 낮은 설정이 제안된다고 생각합니다.


modsecurity의 기본값은 1500으로 1M보다 현저히 낮습니다. OP의 값이 150000이면 설정이 줄어들지 않고 증가합니다.
Paul Mougel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.