지수 함정
일부 innocent 보이는 정규식 패턴이 특정 입력에 지수적으로 느려짐. 패턴 (a+)+b 가 'aaaab' 즉시 매칭. 끝에 'b' 없는 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 에 돌리면 CPU 가 분 단위로 회전 또는 영원 hang.
왜 발생
엔진이 a+ iteration 사이 입력 split 가능한 모든 방법 시도. a 30개면 2^30 (~10억) split. 각 split 이 'b' 없으니 실패. 엔진이 포기 전에 다 시도.
위험 패턴
안과 밖이 둘 다 같은 글자 매칭 가능한 중첩 quantifier 찾기:
(a+)+— 안과 밖이 둘 다 a 매칭(a*)*— 동일(a|a)+— 대안이 같은 거 매칭(a|b)*c— 입력에 c 없으면 모든 글자가 a 또는 b 로 시도 가능(\w+\s)+— 입력이 공백 없이 끝나면
Quantifier 가진 조각이 여러 방법으로 split 가능 AND 패턴 나머지 실패 자리 어디든 잠재 폭발.
수정
- Atomic 그룹 / possessive quantifier — backtracking 비활성화.
(?>a+)+b또는a++b. - Negated character class —
[^X]+가 X 찾으려 backtrack X..*?대신[^"]*. - Anchor —
^pattern$가 적어도 엔진을 한 위치로 제한. - 적대적 입력엔 RE2/Go — RE2 가 backtrack X; ReDoS 불가능.