🇰🇷 한글 설명
RE2JS는 선형 시간 매칭을 제공하는 정규표현식 엔진 RE2의 JavaScript 포팅 버전입니다. 2.2.0부터 2.8.7 이전 버전에서 LOOKBEHINDS를 활성화하고 matcher().find(), matchAll(), split(), matcher().replaceAll()을 반복 사용하면 입력 전체에 대해 이차 시간 복잡도의 작업이 발생할 수 있습니다. 이로 인해 공격자가 조작한 텍스트가 단일 스레드 워커를 점유하여 서비스 거부(DoS)를 유발할 수 있습니다. 이 문제는 2.8.7 버전에서 수정되었습니다.
💡 쉬운 설명
RE2JS라는 문자열 검색 라이브러리에서 특정 기능을 사용할 때 처리 시간이 과도하게 길어지는 문제가 있습니다. 공격자가 특수하게 만든 입력을 보내면 서버가 계속 같은 작업을 반복하며 다른 요청을 처리하지 못하게 됩니다.
🇺🇸 원문 (English)
RE2JS is the JavaScript port of RE2, a regular expression engine that provides linear time matching. From 2.2.0 until 2.8.7, enabling LOOKBEHINDS and using repeated matching through matcher().find(), matchAll(), split(), or matcher().replaceAll() can cause quadratic total work. Machine.match restarts lookbehind scanning from offset zero for each requested start position, while Matcher-based APIs request capture slots that prevent the early exit used for captureless matching. Dense matches therefore repeatedly rescan the input, allowing attacker-influenced text to monopolize a single-threaded worker and deny service. This issue is fixed in version 2.8.7.
📍 영향받는 시스템
RE2JS 2.2.0 이상 2.8.7 미만을 사용하는 JavaScript/Node.js 애플리케이션
⚔️ 공격 벡터
LOOKBEHINDS 옵션이 활성화된 정규식에 대해 조작된 대량의 매칭 가능 텍스트를 입력하여 반복 스캔을 유발
🛡️ 대응 방법
re2js 패키지를 2.8.7 이상 버전으로 업그레이드
🔧 검증 코드
출력된 버전이 2.8.7 미만이면 취약하며, 2.8.7 이상이면 패치가 적용된 것입니다.
npm list re2js 2>/dev/null | grep re2js