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

ReDoS (Regular Expression Denial of Service)

설명

정규표현식(Regular Expression)을 동적으로 생성할 때, 예를 들어 사용자 입력을 그대로 정규표현식 패턴으로 사용하는 경우 발생하는 취약점입니다. 공격자가 복잡하거나 비효율적인 정규표현식을 의도적으로 전달하면, 시스템이 오랜 시간 동안 해당 정규표현식을 처리하느라 리소스를 소모하고 서비스가 중단될 수 있습니다.

잠재적 영향

  • 서비스 중단 (서비스 거부, DoS): 공격자가 비효율적인 정규표현식 입력으로 서버를 느리게 하거나 멈출 수 있습니다.

  • 시스템 불안정: 서버나 웹 애플리케이션의 응답이 느려져 정상 사용자의 사용에 지장이 생길 수 있습니다.

해결 방법

  • 정규표현식 패턴은 항상 코드에 하드코딩하고, 사용자 입력을 직접 패턴으로 사용하지 않습니다.

  • 불가피하게 동적 생성이 필요하면, 충분한 입력 검증을 통해 복잡하고 실행 시간이 길어지는 패턴을 차단해야 합니다.

  • 정규표현식 검사/제한 라이브러리(예: recheck 등)를 활용해 안전성을 확인합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

// 비권장(취약) 코드 예시
function search(text, pattern) {
  // 사용자 입력을 정규표현식 패턴에 그대로 사용
  const regex = new RegExp(pattern);
  return regex.test(text);
}

// 예시 사용
search("username", userInputPattern);

안전한 코드

설명:

  • 취약한 코드: 사용자가 입력한 값을 정규표현식 패턴으로 직접 사용하므로, 복잡한 패턴 입력시 처리 시간이 길어져 서비스 거부(DoS) 공격에 노출될 수 있습니다.

  • 안전한 코드: 정규표현식 패턴을 코드 내에 하드코딩하거나, 동적으로 사용할 경우에도 미리 허용한 패턴만 사용하여 ReDoS 공격을 방지합니다.

참조

Last updated