정규식 주입 (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