
ReDoS(정규 표현식 서비스 거부)에 취약한 정규 표현식을 찾습니다.

정규 표현식 서비스 거부 (ReDoS)에 취약한 정규식을 찾습니다.
자세한 내용은 Doyensec 블로그에서 확인하세요.
많은 기본 정규 표현식 파서는 최악의 경우 복잡도가 제한되지 않습니다. 정규식 일치는 일치하는 입력 문자열이 주어지면 빠를 수 있습니다. 그러나 특정 비일치 입력 문자열은 정규식 일치 엔진이 엄청난 백트래킹 루프에 빠지게 하여 처리하는 데 오랜 시간이 걸릴 수 있습니다. 이는 CPU가 정규식을 일치시키려고 붙잡혀 있기 때문에 서비스 거부를 유발할 수 있습니다.
이 도구는 다음을 위해 설계되었습니다:
이는 입력 문자열 길이에 대한 정규식 일치 엔진의 백트래킹 절차 복잡도를 반영합니다.
여기서 3차 복잡도는 문자열의 취약한 부분 길이가 두 배가 되면 실행 시간이 약 8배(2^3) 증가함을 의미합니다.
별표가 중첩된 지수 ReDoS(예: (a*)*$)의 경우 퍼지 계수가 사용되며 복잡도는 10보다 커집니다.
악용 가능성 측면에서, 진정으로 큰 문자열이 입력으로 허용되지 않는 한 일반적으로 3차 이상의 복잡도가 필요합니다.
regexploit를 실행하고 명령줄에 정규식 v\w*_\w*_\w*$를 입력합니다.
$ regexploit
v\w*_\w*_\w*$
패턴: v\w*_\w*_\w*$
---
최악의 경우 복잡도: 3 ⭐⭐⭐ (3차)
반복 문자: [5f:_]
백트래킹을 유발하는 최종 문자: [^WORD]
예시: 'v' + '_' * 3456 + '!'
\w*_\w*_\w* 부분은 세 개의 중복되는 반복 그룹을 포함합니다(\w는 문자, 숫자 및 밑줄과 일치). 반복 문자: [5f:_] 줄에서 볼 수 있듯이, 긴 _(0x5f) 문자열은 이 섹션을 여러 가지 방식으로 일치시킵니다. 세 개의 무한 반복 그룹이 있으므로 최악의 경우 복잡도는 3입니다. ReDoS를 유발하는 예시가 제공됩니다: 필수 접두사 v, 긴 _ 문자열, 그리고 백트래킹을 유발하는 ! (단어 문자가 아님)로 구성됩니다. 모든 ReDoS가 끝에 특정 문자를 필요로 하는 것은 아니지만, 이 경우 긴 _ 문자열은 정규식과 성공적으로 일치하여 백트래킹하지 않습니다. 백트래킹을 유발하는 최종 문자: [^WORD] 줄은 일치하지 않는 문자(단어 문자가 아님)가 끝에 필요하여 일치를 방지하고 ReDoS를 유발함을 보여줍니다.
또 다른 예로, ReDoS에 취약한 모듈 버전을 설치합니다(예: pip install ua-parser==0.9.0).
설치된 파이썬 모듈을 스캔하려면 regexploit-python-env를 실행합니다.
Importing ua_parser.user_agent_parser
/somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183 에서 취약한 정규식
패턴: \bSmartWatch *\( *([^;]+) *; *([^;]+) *;
컨텍스트: self.user_agent_re = re.compile(self.pattern)
---
최악의 경우 복잡도: 3 ⭐⭐⭐
반복 문자: [20]
예시: 'SmartWatch(' + ' ' * 3456
최악의 경우 복잡도: 3 ⭐⭐⭐
반복 문자: [20]
예시: 'SmartWatch(0;' + ' ' * 3456
/somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183 에서 취약한 정규식
패턴: ; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)
컨텍스트: self.user_agent_re = re.compile(self.pattern)
---
최악의 경우 복잡도: 3 ⭐⭐⭐
반복 문자: [[0-9]]
예시: ';0 Build/HuaweiA' + '0' * 3456
...
취약한 각 정규식에 대해 ReDoS를 트리거하는 하나 이상의 악성 문자열을 출력합니다. 사용자 에이전트를 ;0 Build/HuaweiA000000000000000...로 설정하고 오래된 버전의 ua-parser를 사용하는 웹사이트를 탐색하면 서버가 요청을 처리하는 데 오랜 시간이 걸려 결국 502 상태가 될 수 있습니다.
Python 3.8+가 필요합니다. JavaScript/TypeScript 코드에서 정규식을 추출하려면 NodeJS 12+도 필요합니다.
선택적으로 가상 환경을 만듭니다.
python3 -m venv .env
source .env/bin/activate
이제 pip로 실제로 설치합니다.
pip install regexploit
stdin을 통해 정규식을 regexploit에 한 줄에 하나씩 입력합니다.
regexploit
또는 파일을 통해
cat myregexes.txt | regexploit
Python, JavaScript, TypeScript, C#, YAML 및 JSON에서 정규식을 구문 분석하는 내장 지원이 있습니다.
AST를 통해 Python 코드(실행하지 않고)를 구문 분석하여 정규식을 찾습니다. 그런 다음 정규식을 ReDoS에 대해 분석합니다.
regexploit-py my-project/
regexploit-py "my-project/**/*.py" --glob
regexploit/bin/javascript에 포함된 NodeJS 패키지를 사용하여 JavaScript를 eslint로 AST로 구문 분석하고 모든 정규식을 출력합니다.
그 정규식들은 파이썬 ReDoS 찾기 프로그램에 입력됩니다.
regexploit-js my-module/my-file.js another/file.js some/folder/
regexploit-js "my-project/node_modules/**/*.js" --glob
참고: JavaScript와 Python 정규식 구문 분석에는 차이가 있으므로 약간의 오류가 있을 수 있습니다. JS 정규식 AST를 작성하고 싶지 않습니다.
현재 경로/환경에 설치된 모든 Python 모듈에서 정규식을 검색합니다. 즉, 관심 있는 모듈을 pip install하면 분석됩니다. Cpython 코드도 포함됩니다.
regexploit-python-env
참고: 이는 Python 코드를 AST로 구문 분석하지 않으며 모듈 임포트 시 자동으로 컴파일되는 정규식만 찾습니다. 모듈이 실제로 임포트되므로 모듈 내 코드가 실행됩니다. 이는 로드 시 더 작은 문자열로 구성된 정규식을 찾는 데 유용합니다(예: Pillow의 CVE-2021-25292).
YAML 지원에는 pyyaml이 필요하며, pip install regexploit[yaml]로 설치할 수 있습니다.
regexploit-json *.json
regexploit-yaml *.yaml
regexploit-csharp something.cs
이 도구는 연구 시간 동안 Doyensec LLC의 Ben Caller가 만들었습니다.