설명
정규 표현식 서비스 거부 공격(Regular Expression Denial of Service, ReDoS)은 악의적으로 구성된 입력을 통해 정규 표현식 매칭에 과도한 계산을 유발하여 서버 자원을 소진시키는 공격입니다. 이는 서버가 입력을 처리하느라 과도한 시간을 소비하게 하여 서비스 거부 상태를 유발할 수 있습니다.
잠재적 영향
- 서비스 거부: 서버 자원이 소진되어 정상적인 요청을 처리할 수 없게 됩니다.
- 성능 저하: 서버 성능이 급격히 저하되어 사용자 경험이 나빠집니다.
- 리소스 고갈: 서버 메모리 및 CPU 사용률이 높아져 다른 중요한 작업이 중단될 수 있습니다.
해결 방법
- 정규 표현식 검토: 정규 표현식을 간단하고 효율적으로 설계합니다.
- 시간 제한을 지원하는 엔진에서는 매칭 작업에 타임아웃을 설정하세요. Python 표준
re에는 매칭 타임아웃 인자가 없습니다. - 매칭 전에 입력 길이를 제한하고, 중첩된 반복 등 과도한 역추적을 유발하는 패턴을 단순화하세요.
예시
첫 예시는 긴 입력에서 처리가 매우 오래 걸릴 수 있습니다. 다음 비교의 타임아웃은 실행 시간을 제한하는 보완책이며, 비효율적인 패턴 자체를 단순화하지는 않습니다.
변경 전
python
# Unsafe Regular Expression code
import re
pattern = re.compile(r'(a+)+$')
test_string = 'a' * 10000 + '!'
if pattern.match(test_string):
print("Match found")
else:
print("No match")
변경 후
python
# Safe Regular Expression code
import regex
# 매칭 호출에 시간 제한 적용
pattern = regex.compile(r'(a+)+$')
test_string = 'a' * 10000 + '!'
try:
if pattern.match(test_string, timeout=1):
print("Match found")
else:
print("No match")
except TimeoutError:
print("Regex match timed out")
설명:
- 변경 전: 중첩된 반복 패턴이 거의 일치하는 입력에서 과도한 역추적을 유발하여 서비스 처리를 지연시킬 수 있습니다.
- 변경 후:
regex의 매칭 호출에 초 단위timeout을 전달하고, 시간이 초과되면 내장TimeoutError를 처리합니다.