React Router 7.0.0–7.5.1과 이를 기반으로 한 Remix에서 HTTP 헤더를 통한 캐시 포이즈닝과 저장형 XSS 공격이 가능한 심각한 취약점 두 건(CVE-2025-43864, CVE-2025-43865)이 공개됐다. 공격자가 `X-React-Router-Spa-Mode` 및 `X-React-Router-Prerender-Data` 헤더를 조작하면 서버 응답을 변조해 캐시에 악성 콘텐츠를 주입할 수 있으며, 이후 모든 방문자가 피해를 입는다. Vercel은 자사 인프라의 방화벽 레이어에서 두 헤더를 자동 제거하고 CDN 캐시를 전면 초기화하는 방식으로 선제 대응했다.
핵심 포인트
- CVE-2025-43864: `X-React-Router-Spa-Mode` 헤더 조작 → 서버가 SPA 모드로 강제 동작 → 서버 사이드 렌더링 우회 → 캐시 포이즈닝
- CVE-2025-43865: `X-React-Router-Prerender-Data` 헤더에 임의 JSON 주입 → 응답에 포함된 채 캐시 저장 → 저장형 XSS 성립
- 영향 범위: React Router 7.0.0–7.5.1 및 Remix(React Router 의존); 한 번 오염으로 이후 모든 방문자 피해
- 공식 보안 권고에서 "저장형 XSS를 포함한 캐시 포이즈닝이 매우 쉽다(trivial)"고 명시
- Vercel 플랫폼: 방화벽에서 두 헤더 자동 스트리핑 + CDN 캐시 전면 초기화로 인프라 레벨 차단
- 근본 수정: React Router 7.5.2+ 업그레이드 필수; 외부 CDN(Cloudflare 등) 사용자는 업그레이드 후 캐시 수동 퍼지 필수
상세 정리
- 두 취약점 모두 HTTP 요청 헤더를 통해 서버 사이드 렌더링 로직을 직접 제어할 수 있는 구조적 결함에서 비롯됨
- `X-React-Router-Spa-Mode: 1` 헤더 전송 시 서버가 SPA 모드로 동작 → 서버 렌더링 없이 빈 HTML 셸 반환 → 이 응답이 캐시되면 정상 사용자도 빈 페이지 수신
- `X-React-Router-Prerender-Data` 헤더에 공격자가 임의의 JSON 데이터 삽입 → 해당 데이터가 응답 HTML에 인라인 삽입 → 캐시에 저장 → 저장형 XSS 완성
- 캐시 레이어가 있는 모든 배포 환경에서 포이즈닝 가능 — Vercel CDN, Cloudflare, Nginx 캐시, Varnish 등
- 포이즈닝 이후 캐시 무효화 전까지 해당 경로를 방문하는 모든 사용자가 공격자가 제어하는 콘텐츠를 수신
- Vercel은 방화벽 레이어에서 두 헤더를 자동 스트리핑하여 프레임워크 패치 없이도 헤더 기반 공격 벡터를 원천 차단
- Vercel CDN 캐시 전체 초기화 완료 — 취약점 공개 이전에 이미 오염됐을 수 있는 캐시 항목 제거
- React Router 7.5.2에서 서버 렌더링 로직의 헤더 기반 분기를 제거해 취약점 근본 수정
- Vercel 이외 환경(자체 호스팅, Cloudflare Workers, AWS Lambda 등)은 반드시 7.5.2+로 업그레이드해야 보호 가능
- 외부 CDN 사용자는 업그레이드 후 캐시를 직접 퍼지해야 함 — 이미 포이즈닝됐을 가능성 있음
- Remix는 내부적으로 React Router를 사용하므로 동일하게 영향받음 — `package.json`의 `react-router` 의존성 버전 확인 필수
- 보안 대응이 인프라 레이어(헤더 제거·캐시 퍼지)와 프레임워크 레이어(7.5.2 패치) 두 단계로 분리된 점이 심층 방어(defense-in-depth) 아키텍처의 실제 사례
- 이번 사례는 신뢰할 수 없는 HTTP 헤더를 서버 렌더링 로직 제어에 그대로 사용하면 안 된다는 원칙을 재확인시켜줌
왜 읽나
React Router 7.x 또는 Remix 기반 SSR 앱을 운영 중이거나 CDN 캐시 레이어를 두고 있다면 즉시 7.5.2+ 업그레이드가 필요하며, 외부 CDN 사용자는 업그레이드만으로 부족하고 캐시 퍼지까지 완료해야 한다. Vercel의 인프라 레벨 선제 대응 방식은 CDN·방화벽 기반 보안 아키텍처 설계의 현실적인 참고 사례로도 가치 있다.