Translated ['', 'src/pentesting-web/regular-expression-denial-of-service

This commit is contained in:
Translator 2025-10-01 15:17:14 +00:00
parent 22a9e9c74a
commit 6ae94cf795

View File

@ -1,41 +1,72 @@
# 정규 표현식 서비스 거부 - ReDoS
# Regular expression Denial of Service - ReDoS
{{#include ../banners/hacktricks-training.md}}
# 정규 표현식 서비스 거부 (ReDoS)
# Regular Expression Denial of Service (ReDoS)
**정규 표현식 서비스 거부 (ReDoS)**는 누군가가 정규 표현식(텍스트에서 패턴을 검색하고 일치시키는 방법)의 작동 방식의 약점을 이용할 때 발생합니다. 때때로 정규 표현식이 사용될 때, 처리하는 텍스트 조각이 커질수록 매우 느려질 수 있습니다. 이 느림은 텍스트 크기가 조금만 증가해도 매우 빠르게 증가할 수 있습니다. 공격자는 이 문제를 이용하여 정규 표현식을 사용하는 프로그램이 오랫동안 제대로 작동하지 않도록 만들 수 있습니다.
A **Regular Expression Denial of Service (ReDoS)** happens when someone takes advantage of weaknesses in how regular expressions (a way to search and match patterns in text) work. Sometimes, when regular expressions are used, they can become very slow, especially if the piece of text they're working with gets larger. This slowness can get so bad that it grows really fast with even small increases in the text size. Attackers can use this problem to make a program that uses regular expressions stop working properly for a long time.
## 문제의 정규 표현식 단순 알고리즘
## The Problematic Regex Naïve Algorithm
**자세한 내용은 [https://owasp.org/www-community/attacks/Regular*expression_Denial_of_Service*-\_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)에서 확인하세요.**
**Check the details in [https://owasp.org/www-community/attacks/Regular*expression_Denial_of_Service*-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
## 악성 정규 표현식 <a href="#evil-regexes" id="evil-regexes"></a>
### Engine behavior and exploitability
악성 정규 표현식 패턴은 **조작된 입력에 갇혀 서비스 거부를 일으킬 수 있는** 패턴입니다. 악성 정규 표현식 패턴은 일반적으로 반복이 있는 그룹화와 반복 또는 겹치는 대체를 포함합니다. 악성 패턴의 몇 가지 예는 다음과 같습니다:
- Most popular engines (PCRE, Java `java.util.regex`, Python `re`, JavaScript `RegExp`) use a **backtracking** VM. Crafted inputs that create many overlapping ways to match a subpattern force exponential or high-polynomial backtracking.
- Some engines/libraries are designed to be **ReDoS-resilient** by construction (no backtracking), e.g. **RE2** and ports based on finite automata that provide worstcase linear time; using them for untrusted input removes the backtracking DoS primitive. See the references at the end for details.
## Evil Regexes <a href="#evil-regexes" id="evil-regexes"></a>
악성 regular expression 패턴은 특정 입력에서 **DoS를 유발하도록 멈출 수 있는** 패턴입니다. 악성 regex 패턴은 보통 중첩된 반복(grouping with repetition)이나 반복 내부의 겹침이 있는 alternation을 포함합니다. 몇 가지 예시는 다음과 같습니다:
- (a+)+
- ([a-zA-Z]+)\*
- (a|aa)+
- (a|a?)+
- (.\*a){x} for x > 10
- (.*a){x} for x > 10
이 모든 것은 입력 `aaaaaaaaaaaaaaaaaaaaaaaa!`에 취약합니다.
All those are vulnerable to the input `aaaaaaaaaaaaaaaaaaaaaaaa!`.
## ReDoS 페이로드
### Practical recipe to build PoCs
### ReDoS를 통한 문자열 유출
대부분의 치명적인 사례는 다음 형태를 따릅니다:
CTF(또는 버그 바운티)에서 민감한 정보(플래그)가 일치하는 정규 표현식을 **제어할 수 있다면** 유용할 수 있습니다. 그런 다음 **정규 표현식이 일치할 때** **페이지가 멈추게(타임아웃 또는 더 긴 처리 시간)** 만들 수 있습니다. 이렇게 하면 문자열을 **문자 단위로 유출**할 수 있습니다:
- 취약한 서브패턴으로 들어가게 하는 접두사(선택적).
- 중첩되거나 겹치는 수량자 내부에서 애매한 매치를 만드는 긴 문자 연속(예: 많은 `a`, `_`, 또는 공백).
- 전체 실패를 강제하는 마지막 문자 — 엔진이 모든 가능성을 백트랙해야 하게 만듭니다(종종 마지막 토큰과 매치되지 않는 문자, 예: `!`).
- [**이 게시물**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets)에서 이 ReDoS 규칙을 찾을 수 있습니다: `^(?=<flag>)((.*)*)*salt$`
- 예: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
- [**이 작성물**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)에서 이 패턴을 찾을 수 있습니다: `<flag>(((((((.*)*)*)*)*)*)*)!`
- [**이 작성물**](https://ctftime.org/writeup/25869)에서는: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`를 사용했습니다.
최소 예시:
### ReDoS 입력 및 정규 표현식 제어
- `(a+)+$` vs input `"a"*N + "!"`
- `\w*_*\w*$` vs input `"v" + "_"*N + "!"`
다음은 **입력**과 **정규 표현식**을 모두 **제어하는** **ReDoS** 예제입니다:
N을 늘리면 초선형(super-linear) 성장이 관찰됩니다.
#### Quick timing harness (Python)
```python
import re, time
pat = re.compile(r'(\w*_)\w*$')
for n in [2**k for k in range(8, 15)]:
s = 'v' + '_'*n + '!'
t0=time.time(); pat.search(s); dt=time.time()-t0
print(n, f"{dt:.3f}s")
```
## ReDoS Payloads
### String Exfiltration via ReDoS
CTF(또는 bug bounty)에서는 민감한 정보(예: flag)와 매칭되는 **Regex를 제어할 수 있는 경우**가 있습니다.
그렇다면 **Regex가 매칭될 때**만 페이지가 **멈추게 (timeout 또는 더 긴 처리 시간)** 하고, **매칭되지 않을 때는 그렇지 않게** 만드는 것이 유용할 수 있습니다.
이렇게 하면 문자열을 **char by char** 방식으로 **exfiltrate**할 수 있습니다:
- 이 [**this post**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets)에서 이 ReDoS 룰을 찾을 수 있습니다: `^(?=<flag>)((.*)*)*salt$`
- Example: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
- 이 [**this writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20@%20DEKRA%20CTF%202022/solver/solver.html)에서 다음을 찾을 수 있습니다: `<flag>(((((((.*)*)*)*)*)*)*)!`
- 이 [**this writeup**](https://ctftime.org/writeup/25869)에서는 다음을 사용했습니다: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
### ReDoS Controlling Input and Regex
다음은 **ReDoS** 예제로, **input**과 **regex**를 모두 **control**할 수 있는 경우들입니다:
```javascript
function check_time_regexp(regexp, text) {
var t0 = new Date().getTime()
@ -65,16 +96,35 @@ Regexp ([a-zA-Z]+)*$ took 773 milliseconds.
Regexp (a+)*$ took 723 milliseconds.
*/
```
### 공격자용 언어/엔진 노트
- JavaScript (browser/Node): 내장 `RegExp`는 backtracking 엔진이며 regex+입력이 공격자에게 영향을 받으면 흔히 악용됩니다.
- Python: `re`는 backtracking입니다. 긴 모호한 반복과 실패하는 꼬리가 결합되면 종종 치명적인 backtracking을 유발합니다.
- Java: `java.util.regex`는 backtracking입니다. 입력만 제어할 수 있다면 복잡한 validator를 사용하는 엔드포인트를 찾아보세요; 패턴(예: 저장된 규칙)을 제어할 수 있다면 ReDoS는 보통 쉽습니다.
- Engines such as **RE2/RE2J/RE2JS** or the **Rust regex** crate are designed to avoid catastrophic backtracking. 이런 엔진을 만나면 다른 병목(예: 매우 큰 패턴)에 집중하거나 여전히 backtracking 엔진을 사용하는 구성요소를 찾아보세요.
## 도구
- [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
- 취약한 regex를 찾아 악의적 입력을 자동 생성합니다. 예:
- `pip install regexploit`
- 패턴 하나를 인터랙티브하게 분석: `regexploit`
- Python/JS 코드에서 regex를 스캔: `regexploit-py path/``regexploit-js path/`
- [https://devina.io/redos-checker](https://devina.io/redos-checker)
- [https://github.com/davisjam/vuln-regex-detector](https://github.com/davisjam/vuln-regex-detector)
- 프로젝트에서 regex를 추출하고 취약한 것을 탐지하며 대상 언어로 PoC를 검증하는 end-to-end 파이프라인입니다. 대규모 코드베이스를 수색할 때 유용합니다.
- [https://github.com/tjenkinson/redos-detector](https://github.com/tjenkinson/redos-detector)
- 패턴이 안전한지 보고하기 위해 backtracking을 분석하는 간단한 CLI/JS 라이브러리입니다.
> Tip: 입력만 제어할 수 있을 때는 길이를 두 배로 늘려가며(예: 2^k 문자) 문자열을 생성하고 지연(latency)을 측정하세요. 지연이 지수적으로 증가하면 ReDoS가 가능함을 강하게 시사합니다.
## 참고자료
- [https://owasp.org/www-community/attacks/Regular*expression_Denial_of_Service*-\_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
- [https://owasp.org/www-community/attacks/Regular*expression_Denial_of_Service*-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
- [https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets)
- [https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)
- [https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20@%20DEKRA%20CTF%202022/solver/solver.html](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20@%20DEKRA%20CTF%202022/solver/solver.html)
- [https://ctftime.org/writeup/25869](https://ctftime.org/writeup/25869)
- SoK (2024): Regular Expression Denial of Service (ReDoS)에 대한 문헌 및 엔지니어링 리뷰 — [https://arxiv.org/abs/2406.11618](https://arxiv.org/abs/2406.11618)
- Why RE2 (lineartime regex engine) — [https://github.com/google/re2/wiki/WhyRE2](https://github.com/google/re2/wiki/WhyRE2)
{{#include ../banners/hacktricks-training.md}}