next CWE-285 Next.js 미들웨어 인증 우회 (CVE-2025-29927)
- 발행
- 2025년 3월 21일
- 최종 갱신
- 2026년 5월 9일
- 상태
- Active
- GHSA
- GHSA-f82v-jwr5-mffw
요약
Next.js 13.0.0 ~ 15.2.2의 미들웨어에서 x-middleware-subrequest 헤더를 외부에서 조작하면 인증 검사를 우회할 수 있는 critical(CVSS 9.1) 취약점입니다. 14.2.25 / 15.2.3 등 패치 버전으로 즉시 업그레이드가 권장됩니다.
내 프로젝트는 영향받나요?
사용 중인 next 버전을 입력하면 이 advisory의 영향 여부를 즉시 확인합니다.
ⓘ next 패키지 버전을 입력하면 영향 여부를 즉시 확인합니다.
영향 범위
| 영향받는 범위 | 패치 버전 |
|---|---|
| >=15.0.0 <15.2.3 | 12.3.5 |
| >=14.0.0 <14.2.25 | 13.5.9 |
| >=13.0.0 <13.5.9 | 14.2.25 |
| >=12.0.0 <12.3.5 | 15.2.3 |
호스팅 환경별 영향
이 취약점은 미들웨어 실행 경로에 따라 영향 범위가 다릅니다. 호스팅 환경별로 별도 확인이 필요합니다.
- Vercel Edge Middleware: 영향받음. Vercel 측이 기본 차단을 적용했으나, 자체 Next.js 버전이 패치되지 않으면 안전하지 않습니다.
- Netlify: 영향받음. Netlify Edge Functions 환경의 Next.js 미들웨어도 동일한 우회가 가능합니다.
- Cloudflare Pages (next-on-pages): 별도 확인 필요. 어댑터의 미들웨어 구현 방식에 따라 다르므로 사용 중인 버전과 어댑터 패치 여부를 함께 점검해야 합니다.
- Self-host Node.js:
next start로 직접 호스팅하는 경우, 미들웨어를 사용한다면 영향받습니다.
취약점 메커니즘
Next.js 미들웨어 런타임은 내부 서브요청(rewrites, redirects 후속 처리 등)을 식별하기 위해 x-middleware-subrequest 헤더를 사용합니다. 본래 이 헤더는 Next.js 내부 통신용으로 외부에서 전달될 수 없어야 하지만, 실제로는 외부 요청에서도 그대로 전달이 가능했습니다.
문제는 Next.js가 x-middleware-subrequest 헤더가 존재할 때 미들웨어 본문 실행을 건너뛰는 분기를 가지고 있었다는 점입니다. 결과적으로 공격자는 보호된 라우트(예: /admin)에 다음과 같이 헤더를 임의로 추가하여 인증/인가 미들웨어를 통과하지 않고 핸들러에 도달할 수 있습니다.
curl -H "x-middleware-subrequest: middleware:middleware:middleware" \
https://target.example.com/admin
CVSS 9.1(Critical)이 부여된 이유는 (1) 인증 우회의 즉시성, (2) 사전 조건 없이 어떤 익명 사용자도 시도 가능, (3) 미들웨어를 인증 게이트로 사용하는 광범위한 Next.js 프로젝트가 영향받기 때문입니다.
패치 코드 예시
1. 패치 버전으로 업그레이드 (권장)
# 현재 사용 중인 메이저에 맞는 패치 버전으로 업그레이드
npm install [email protected]
# 또는 최신 안정 버전
npm install next@latest
각 메이저별 최소 안전 버전:
- Next.js 12:
12.3.5 - Next.js 13:
13.5.9 - Next.js 14:
14.2.25 - Next.js 15:
15.2.3
2. 임시 완화 방안 (패치 적용 전)
패치를 즉시 적용할 수 없는 경우, 미들웨어 진입 지점에서 외부 요청의 x-middleware-subrequest 헤더를 명시적으로 거부하는 방어 로직을 추가합니다.
// middleware.ts
import { NextRequest, NextResponse } from 'next/server'
export function middleware(request: NextRequest) {
if (request.headers.get('x-middleware-subrequest')) {
return new NextResponse(null, { status: 400 })
}
// 기존 인증/인가 로직
}
이 임시 완화는 호스팅 환경의 리버스 프록시 또는 WAF에서도 동일하게 적용할 수 있습니다. Cloudflare WAF, Nginx, AWS WAF 등에서 외부에서 들어오는 요청의 해당 헤더를 차단하면 즉시 효과를 볼 수 있습니다.
3. 패치 적용 후 확인 방법
업그레이드 후 위의 curl 요청을 다시 실행하면 정상적으로 미들웨어 인증을 거치게 됩니다. 응답이 401/403/리다이렉트로 돌아오면 패치가 정상 적용된 것입니다.
정리
이 취약점은 Next.js의 미들웨어 인증을 직접 우회하는 critical 수준의 결함입니다. 미들웨어를 인증 게이트로 사용하는 모든 프로젝트는 즉시 패치 버전으로 업그레이드해야 하며, 즉시 패치가 어렵다면 미들웨어 또는 WAF 레벨에서 외부의 x-middleware-subrequest 헤더를 차단하는 임시 완화를 적용한 뒤 단계적으로 업그레이드하는 것을 권장합니다.
참고 자료
- GHSA-f82v-jwr5-mffw (GitHub Advisory) (새 탭에서 열림)
- NVD CVE-2025-29927 (새 탭에서 열림)
- Snyk — Authorization Bypass in Next.js Middleware (새 탭에서 열림)
- Datadog Security Labs — 기술 분석 (새 탭에서 열림)
- Vercel — 공식 보안 권고 (새 탭에서 열림)
Credits
- · Allam Rachid
- · Allam Yasser
ConfigDeck으로 설정 파일 업데이트하기
관련 설정 파일을 ConfigDeck에서 빠르게 생성합니다.
설정 파일 생성기 →AI 코딩 도구 설정도 점검하세요
Cursor, Copilot, Claude Code 등 AI 코딩 도구 설정을 안내합니다.
AI Config 보기 →