정규식 주입 (Regular Expression Injection)
Regular Expression Injection
설명
정규식 주입은 사용자 입력을 그대로 정규식 패턴으로 사용할 때 발생합니다. 메타문자(., *, +, ?, (), [], | 등)가 섞인 입력이 그대로 패턴에 들어가면, 의도와 다른 매칭이 이루어지거나, (a+)+ 같은 공격적 패턴과 특정 입력을 조합해 지수 시간 복잡도를 유발하는 ReDoS가 발생할 수 있습니다. 공격자는 이를 이용해 필터/검증을 우회하거나 CPU를 소모시켜 서비스 거부 상태를 만들 수 있습니다.
잠재적 영향
서비스 거부(ReDoS): 복잡한 주입 패턴으로 정규식 엔진의 백트래킹을 폭증시켜 CPU를 고갈시킵니다.
입력 검증/필터 우회: 검증용 정규식의 의미를 바꿔 금지 문자열을 통과시키거나 필터를 무력화할 수 있습니다.
자원/비용 증가: 워커가 정규식 처리에 묶여 지연이 커지고, 오토스케일 비용과 장애 가능성이 증가합니다.
해결 방법
사용자 입력을 정규식 패턴에 포함해야 한다면 반드시 re.escape로 메타문자를 이스케이프하세요.
가능한 경우 허용 목록(whitelist) 기반으로 패턴을 구성하고, 사용자 입력을 직접 패턴으로 사용하지 마세요.
단순 포함/검색이면 정규식 대신 문자열 연산(예: in, startswith/endswith)을 사용하세요.
입력 길이 제한(예: 100자 이하)과 요청 타임아웃을 설정하세요. 필요 시 re2 등 비백트래킹 엔진을 고려하세요.
사용자로부터 정규식 플래그나 고급 구문(lookaround, backreference 등)을 받지 않도록 하세요.
정규식 작성 시 중첩된 가변 길이 수량자((.+)+, (.) 등)와 과도한 그룹 사용을 피하세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 사용자 입력을 re.search의 패턴으로 그대로 사용하여 메타문자와 수량자가 주입됩니다. 공격자는 (a+)+ 같은 패턴과 특정 문자열을 이용해 백트래킹 폭발을 일으켜 CPU를 잠식(ReDoS)하거나, 검증/필터 정규식의 의미를 바꿔 우회할 수 있습니다.
안전한 코드: re.escape로 사용자 입력의 메타문자를 이스케이프하여 입력을 순수한 리터럴로 처리합니다. 또한 입력 길이를 제한해 최악의 경우에도 처리 비용을 줄이고, 패턴/플래그는 서버에서만 정의해 주입 가능성을 제거합니다.
참조
Last updated