동적 정규표현식 기반 서비스 거부 공격 (ReDoS)

정규표현식 기반 서비스 거부 공격 (ReDoS)

설명

TypeScript 또는 JavaScript 코드에서 외부 입력으로 정규표현식 패턴을 정하게 하면, 공격자가 실행 시간이 매우 긴 패턴을 전달해 서비스 거부 상태를 만들 수 있습니다.

잠재적 영향

  • 이벤트 루프가 오래 점유되어 정상 요청 처리가 지연될 수 있습니다.
  • CPU 사용량 증가로 애플리케이션 인스턴스가 불안정해질 수 있습니다.

해결 방법

  • 정규표현식은 가능하면 검토한 리터럴 또는 상수로 정의하세요.
  • 동적 패턴이 필요하면 허용 목록 기반으로 선택하고, 사용자 입력을 패턴 문법으로 직접 해석하지 마세요.
  • 실행 시간이 커질 수 있는 중첩 반복과 모호한 대체 패턴을 피하세요.

예시

변경 전

typescript
function search(value: string, pattern: string) {
  return new RegExp(pattern).test(value);
}

변경 후

typescript
const allowedPatterns = new Map([
  ["username", /^[a-z0-9_]{3,32}$/i],
  ["ticket", /^TICKET-\d{4,10}$/],
]);

function search(value: string, patternName: string) {
  const pattern = allowedPatterns.get(patternName);
  if (!pattern) {
    throw new Error("Unsupported pattern");
  }
  return pattern.test(value);
}

설명:

  • 변경 전: 호출자가 전달한 문자열을 정규표현식 패턴으로 직접 해석합니다.
  • 변경 후: 이름으로 검토된 고정 패턴을 선택하고, 등록되지 않은 이름은 거부합니다.

참조