설명
정규표현식(Regular Expression)을 동적으로 생성할 때, 예를 들어 사용자 입력을 그대로 정규표현식 패턴으로 사용하는 경우 발생하는 취약점입니다. 공격자가 복잡하거나 비효율적인 정규표현식을 의도적으로 전달하면, 시스템이 오랜 시간 동안 해당 정규표현식을 처리하느라 리소스를 소모하고 서비스가 중단될 수 있습니다.
잠재적 영향
- 서비스 중단 (서비스 거부, DoS): 공격자가 비효율적인 정규표현식 입력으로 서버를 느리게 하거나 멈출 수 있습니다.
- 시스템 불안정: 서버나 웹 애플리케이션의 응답이 느려져 정상 사용자의 사용에 지장이 생길 수 있습니다.
해결 방법
- 실행 비용을 검토한 패턴을 코드에 정의하고, 사용자 입력을 직접 패턴으로 사용하지 마세요.
- 동적 선택이 필요하면 검토한 패턴의 허용 목록을 사용하고, 검사할 문자열의 길이도 제한하세요.
- 정규표현식 검사 도구(예: recheck)는 검토를 보조하는 데 사용하세요. 패턴을 상수로 정의하는 것만으로 실행 비용이 제한되지는 않습니다.
예시
변경 전
javascript
// 비권장(취약) 코드 예시
function search(text, pattern) {
// 사용자 입력을 정규표현식 패턴에 그대로 사용
const regex = new RegExp(pattern);
return regex.test(text);
}
// 예시 사용
search("username", userInputPattern);
변경 후
javascript
// 권장(안전) 코드 예시
function search(text) {
// 안전하게 하드코딩된 정규표현식 사용
const regex = /^\w+$/;
return regex.test(text);
}
// 또는, 동적 필요 시 입력값을 철저히 제한
function searchSafe(text, pattern) {
// 패턴에 허용된 값만 사용(예: 미리 정의된 목록)
const allowedPatterns = ["^\\w+$", "^\\d{4,8}$"];
if (!allowedPatterns.includes(pattern)) {
throw new Error("허용되지 않은 패턴입니다.");
}
const regex = new RegExp(pattern);
return regex.test(text);
}
설명:
- 변경 전: 사용자가 입력한 값을 정규표현식 패턴으로 직접 사용하므로, 복잡한 패턴 입력시 처리 시간이 길어져 서비스 거부(DoS) 공격에 노출될 수 있습니다.
- 변경 후: 검토한 고정 패턴이나 허용 목록만 사용해 공격자가 복잡한 패턴을 직접 전달하지 못하게 합니다.