- Next.js 팀은 CVE-2025-29927로 공개된 Middleware 우회 취약점을 패치하고, 신고부터 공개까지의 사고 타임라인과 개선책을 공개함
- 문제의 핵심은 내부 헤더
x-middleware-subrequest가 Middleware 재귀 방지와 실행 우회에 함께 쓰인 구조였고, 패치는 해당 헤더를 검증한 뒤 실패 시 제거하는 방식임 - 영향은
next start와output: 'standalone'을 쓰는 self-hosted Next.js 애플리케이션에 집중됐으며, static export, Vercel, Netlify, Cloudflare Workers는 영향이 없는 것으로 확인됨 - Next.js 14.2.25와 15.2.3 패치가 2025년 3월 17~18일 공개됐고, 커뮤니티 피드백 이후 13.5.9와 12.3.5 백포트도 추가됨
- 후속 조치로 파트너 메일링 리스트, GitHub private vulnerability reporting 중심의 신고 절차, LTS 정책, 공식 배포 어댑터 API, Middleware 보안 평가가 진행됨
CVE-2025-29927 처리 타임라인
- 2025년 2월 27일 06:03 GMT, 취약점이 GitHub private reporting을 통해 Next.js 팀에 전달됐고 연구자들은
security@vercel.com에도 이메일을 보냄- 최초 보고는 Next.js 12.x 같은 오래된 버전 범위를 중심으로 다뤄져 triage 큐에서 낮은 우선순위를 받음
- 2025년 3월 1일 02:00 GMT, 새 이메일 스레드로 추가 보고가 들어오며 영향 범위가 더 최근 버전까지 확장됨
- 여러 보고와 내부 논의가 겹치면서 triage가 지연됨
- 2025년 3월 5일, Next.js 팀은 보고의 유효성과 잠재 영향을 파악하기 위한 조사를 시작함
- 보안팀은 10:38 GMT에 Next.js 11.x와 12.x를 보안 패치 지원 대상에서 제외하는 LTS 정책 계획을 답변함
- 2025년 3월 14일 17:18 GMT, 보안팀이 보고를 Next.js 팀에 전달해 영향과 수정 방안 검토가 시작됐고, Next.js 엔지니어링 팀은 취약점이 유효하다고 확인함
어떤 배포가 영향을 받았나
- Next.js는 여러 방식으로 호스팅될 수 있어 배포 경로별 확인이 필요했음
- Static export는 서버 런타임 없이는 Middleware를 사용할 수 없어 즉시 영향 대상에서 제외됨
next start와output: 'standalone'을 사용하는 self-hosted Next.js 애플리케이션은 영향을 받는 것으로 확인됨- Vercel은 Next.js 라우팅 로직이 분리돼 별도 시스템에서 전 세계적으로 실행되기 때문에 해당 취약점의 영향을 받지 않음
- 오픈소스 Next.js 배포 어댑터도 검토됐으며, Netlify와 Cloudflare Workers는 애플리케이션 라우팅 분리라는 같은 이유로 영향을 받은 적이 없는 것으로 확인됨
패치 방식과 공개 과정
- 2025년 3월 14일 금요일, forward fix는
x-middleware-subrequest검증을 추가하고 검증 실패 시 필터링하는 방식으로 정해짐- 업그레이드할 수 없는 애플리케이션에는 해당 헤더가 Next.js 서버에 도달하기 전에 필터링하는 우회책이 제시됨
- 팀은 Next.js 15.x와 14.x 패치 준비를 시작함
- 2025년 3월 17일 17:54 GMT, 패치를 포함한 pull request가 Next.js GitHub 저장소에 열림
- 20:56 GMT에 merge됨
- Next.js 14.2.25 패치는 22:44 GMT에 릴리스됨
- Next.js 15.2.3 패치는 2025년 3월 18일 00:23 GMT에 릴리스됨
- CVE-2025-29927는 2025년 3월 18일 18:03 GMT에 GitHub에서 발급됨
- CVE는 2025년 3월 21일 10:17 GMT에 공개됨
- 당시 공개 정보는 CVE에 담긴 내용뿐이라 이슈의 영향을 이해하기에 충분한 세부 사항이 부족했음
- Netlify와 Cloudflare Workers가 영향을 받지 않는다는 점은 검증됐지만, 해당 팀과의 커뮤니케이션이 필요했음
- 다른 인프라 제공자와 인증 파트너에 대한 선제적 커뮤니케이션도 미흡했음
커뮤니케이션 혼선과 백포트
- CVE가 Vercel 애플리케이션의 영향 여부를 즉시 명시하지 않아, Vercel은 고객이 보호되고 있다는 changelog를 빠르게 공개함
- 해당 changelog는 이전 해결 사례의 같은 템플릿을 사용했고 Firewall을 언급해 혼란을 줬으며, 취약점 자체에 필요한 세부 정보를 충분히 제공하지 못함
- Next.js 사이트에는 전체 postmortem에 앞서 CVE를 설명하는 블로그 글이 공개됐고, 공식 소셜 채널에도 공유됨
- 2025년 3월 22일 21:21 GMT, Next.js 13.5.9 백포트가 공개됨
- 이 버전은 공개된 LTS 정책 밖에 있지만, 커뮤니티 피드백을 바탕으로 예외가 적용됨
- 2025년 3월 23일 06:44 GMT, Next.js 12.3.5 추가 백포트가 공개됨
기술적 원인
- Middleware는 응답을 생성하기 전에 들어오는 요청을 redirect, rewrite, 수정할 수 있게 하며, 캐싱과 라우팅보다 먼저 실행됨
- 일부 Next.js 애플리케이션은 쿠키를 확인해 사용자의 인증 상태를 낙관적으로 검증하는 패턴을 Middleware에서 사용함
- 인증 쿠키가 있으면 로그인된 애플리케이션으로 일찍 redirect하거나 특정 route를 차단할 수 있음
- Next.js 팀은 Middleware를 애플리케이션 route 보호의 유일한 방법으로 쓰는 방식을 권장하지 않음
- Next.js는 내부 헤더
x-middleware-subrequest를 사용해 재귀를 감지하고 방지하며 Middleware 실행을 우회함- Middleware는 페이지 렌더링 프로세스와 별도로 실행됨
- Middleware 내부에서 앱으로 fetch할 때, Middleware가 이미 실행됐다는 신호를 라우팅 프로세스에 전달하기 위해 내부 헤더가 활용됨
- 취약점 세부 내용은 보고자의 글 Next.js and the corrupt middleware에서 더 읽을 수 있음
재발 방지를 위한 후속 조치
- Partner mailing list를 열어 Next.js에 의존하는 파트너와 다른 인프라 제공자와 더 선제적으로 협력함
- 포함을 원하는 파트너는
partners@nextjs.org로 연락할 수 있음
- 포함을 원하는 파트너는
- Next.js 보안 신고는
security@vercel.com과responsible.disclosure@vercel.com을 통합해 GitHub private vulnerability reporting만 사용하도록 정리됨- 들어오는 보고를 더 효과적으로 triage하기 위한 변경임
- 공개 취약점 대응 방식과 Next.js 취약점 runbook이 개선됨
- 오픈소스에서 Next.js 같은 프레임워크로 넘어오는 보고 triage
- 보안 엔지니어와 Next.js 팀의 협업 방식
- 어떤 버전이 패치를 적극 지원받는지 설명하는 LTS 정책이 공개됨
- 이번 취약점은 문서화되지 않은 내부 헤더에 의존했기 때문에, Netlify와 Cloudflare 같은 파트너와 공식 deployment adapters API를 구현하면서 내부 헤더를 문서화하거나 적절한 API로 대체할 예정임
- Middleware 보안을 개선할 추가 지점이 있는지 더 조사 중이며, 이후 발견되는 이슈는 새 CVE 프로세스를 따름
책임 있는 공개
- 보안 연구자 Rachid Allam과 Yassir Alam이 이 문제를 책임 있게 공개함
- 두 연구자는 버그 바운티 프로그램의 일부로 보상금을 받음