ReDoS 공격 방지: Regolith를 활용한 해결 방안
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
TypeScript/JavaScript에서 정규표현식(Regex)을 사용하는 개발자, 보안 및 성능 최적화가 필요한 프로젝트 팀
핵심 요약
- Regolith는 Rust 기반의 선형 시간 복잡도(linear time complexity)를 갖는 Regex 라이브러리로, ReDoS 공격(Regular Expression Denial of Service)에 면역됨
- JavaScript/TypeScript의 기본 RegExp는 지수 시간 복잡도(exponential time complexity)로 ReDoS 취약
- backreferences 및 look-around와 같은 취약한 기능을 제거하여 선형 시간 보장
- CVE-2025-5889와 같은 ReDoS 취약점으로 인한 대규모 패치 작업을 방지
섹션별 세부 요약
1. ReDoS 공격 개요
- ReDoS 공격은 취약한 Regex 패턴에 특정 입력을 주입하여 서비스 중단을 유발
- JavaScript/TypeScript의 기본 RegExp는 지수 시간 복잡도로 ReDoS 취약
- 예: brace-expansion 프로젝트의 CVE-2025-5889 취약점은 4250만 개의 GitHub 프로젝트에 영향
2. Regolith의 설계 원칙
- Rust 기반의 Regex 라이브러리 사용으로 선형 시간 복잡도(linear worst-case time complexity) 보장
- backreferences 및 look-around 기능 제거로 ReDoS 취약성 제거
- JavaScript/TypeScript의 RegExp와 호환성 유지, 최소한의 코드 변경으로 사용 가능
3. Regolith의 예제 사용
import { Regolith } from '@regolithjs/regolith';
const pattern = new Regolith("^\\d+$");
pattern.test("12345"); // true
pattern.test("Hello"); // false
- 정규표현식 테스트 시 성능 저하 없이 안전하게 실행
- 지수 시간 복잡도가 아닌 선형 시간 복잡도로 실행
4. ReDoS의 영향과 Regolith의 효과
- brace-expansion 같은 대규모 프로젝트의 패치 작업은 4250만 개의 Pull Request 및 수십만 시간의 엔지니어링 작업 필요
- Regolith 채택 시 ReDoS 공격으로 인한 보안 및 성능 문제 해결
결론
- *Regolith를 사용하면 ReDoS 취약성을 완전히 방지할 수 있으며, backreferences 및 look-around 기능 제거의 trade-off를 감수해야 하지만 보안 및 성능 최적화**에 유리한 선택이다.