공격 벡터
ReDoS (Regular Expression Denial of Service) 가 catastrophic backtracking 의 실전 익스플로잇. 공격자가 취약한 정규식에 입력 공급 가능하면 서버가 분 단위로 CPU 코어 회전 — 또는 본인 프로세스가 out-of-memory 또는 timeout 신호로 죽을 때까지.
실전 예시: Cloudflare 2019
2019년 7월, 중첩 quantifier 가진 단일 정규식이 글로벌 Cloudflare 장애 유발. 패턴이 HTTP 요청 본문에 대해 방화벽 룰 체크. 적대적 본문이 지수 backtracking trigger; CPU saturation 이 네트워크 통해 전파. 장애 ~30분 지속, 수백만 영향.
실전의 흔한 취약 패턴
- 중첩 quantifier 있는 이메일 검증기 — 많은 옛 이메일 정규식이
(.+)+모양. - Greedy lookahead 있는 URL 파서 —
.*?(?=&)가 & 없는 긴 입력에 나쁘게 backtrack 가능. - HTML/XML 추출 — backreference 와 greedy 있는
<(.+)>.*</\1>. - Markdown 재작성 —
**(.+?)**체인이 패턴 이상하게 중첩하면 폭발 가능.
방어
- 신뢰 안 되는 패턴 돌리지 마. 사용자가 정규식 작성 가능 (검색 필터 등) 면 RE2 사용 또는 엄격 timeout 부과.
- Fragile 패턴에 신뢰 안 되는 입력 주지 마. Atomic 그룹, possessive quantifier, negated class 사용.
- Timeout 설정. 대부분 언어가 정규식 실행 시간 cap 가능. Python
re가 native 로는 X, butregex모듈은 함. - 사용자 공급 입력엔 RE2 사용 — Go 의
regexp, Python 의google-re2바인딩. Linear time 보장.
감지 도구
코드베이스에서 취약 패턴 스캔하는 도구 존재: safe-regex (npm), recheck, GitHub 의 CodeQL 쿼리. 주기적 실행.