NextJS CVE-2025-29927 安全漏洞
CVE-2025-29927 是一個存在於 Next.js 框架中的關鍵安全漏洞。該漏洞允許攻擊者通過偽造或篡改 x-middleware-subrequest 請求頭,繞過中間件(Middleware)的安全檢查,從而訪問到原本受保護的路由或 API,進而導致授權繞過(Authorization Bypass)以及潛在的更深層次安全風險。本篇文章將對漏洞成因、受影響範圍、修復版本及臨時緩解方案進行詳細説明。
一、漏洞概述
1. 漏洞原理
Next.js 在內部通過一個名為 x-middleware-subrequest 的請求頭,來防止自身中間件的遞歸調用或無限循環。但研究者發現,攻擊者可以在外部請求中人為加上此請求頭,並使用特定格式,使 Next.js 中間件以為這是一個“子請求”,從而跳過原本應執行的認證或安全檢查。
2. 漏洞影響
2.1. 授權繞過 (Auth Bypass):
應用依賴中間件進行的登錄態或權限校驗會被忽略,攻擊者可能在未登錄狀態下訪問需要管理員或高級權限的 API/頁面。
2.2. 潛在安全頭繞過:
如果應用通過 Middleware 注入安全頭(CSP、HSTS 等),也可能被繞過,導致瀏覽器端的防護失效。
2.3. 改寫路徑 (Rewrite) 失效:
某些場景中,Next.js 中間件會根據路徑做改寫或重定向。攻擊者可利用漏洞跳過改寫,訪問內部路由或私有接口。
二、受影響範圍
1. 影響版本
根據官方與社區披露,受影響的版本範圍及對應修復版本如下:
- Next.js 11.1.4 ~ 13.5.6:未修補版本
- Next.js 14.x:在 14.2.25 之前均受影響
- Next.js 15.x:在 15.2.3 之前均受影響
2. 修復版本
最新修復版本:
- 15.2.3 (針對 15.x)
- 14.2.25 (針對 14.x)
- 13.5.9 (針對 13.x)
- 12.3.5 (針對 12.x)
<font style="color:#0e0e0e;">其中,Next.js 13 和 12 的對應修補版也已發佈:13.5.9、12.3.5。請確認你的項目版本,並及時更新到安全版本或更高版本。</font>
3. 受影響部署方式
- 自託管 (self-hosted) Next.js:使用 next start 運行、啓用了 Middleware 的應用會在請求進入時依賴該中間件進行認證/安全檢查,因此容易受影響。
- Standalone 輸出:同樣受影響。
4. 不受影響場景
- 託管在 Vercel:官方託管環境默認會對 x-middleware-subrequest 有額外處理,通常不會受此漏洞影響。
- Netlify 或純靜態部署(next export):因為 Middleware 不會被執行或無條件禁用,所以不受本漏洞影響。
- Cloudflare Managed WAF:若打開了相關規則可阻攔可疑請求頭,也可能減輕風險。
- <font style="color:rgb(23, 23, 23);">作為靜態導出部署的應用程序(未執行中間件)</font>
三、漏洞成因
Next.js 在處理用户請求時,會檢查 x-middleware-subrequest 以識別內部子請求,防止中間件遞歸調用。但在受影響版本中,對該頭的來源與拼接方式缺乏嚴格校驗,導致外部惡意請求也能帶上此頭,從而騙過 Next.js 判斷邏輯,完全繞過中間件安全機制。
在老版本(如 12.2 以下)時,攻擊者可使用:
x-middleware-subrequest: pages/_middleware
在較新版本中(如 13.x、14.x、15.x),需使用更復雜的字符串,例如:
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
或
x-middleware-subrequest: src/middleware:middleware:middleware
來觸發繞過行為。
四、漏洞利用示例
假設應用在 /middleware.ts 中實施了以下邏輯,用於驗證用户是否登錄,若未登錄則阻止訪問 /admin 路由:
export function middleware(req: NextRequest) {
const token = req.cookies.get('session');
if (!token && req.nextUrl.pathname.startsWith('/admin')) {
return NextResponse.redirect('/login');
}
return NextResponse.next();
}
攻擊者若在請求頭裏附加偽造的:
GET /admin/dashboard HTTP/1.1
Host: example.com
x-middleware-subrequest: middleware:middleware:middleware
可能讓 Next.js 判定該請求是內部中間件調用,從而直接跳過此驗證,成功訪問 /admin/dashboard。
五、修復與緩解
1. 升級到安全版本
最直接與安全的方案是升級到官方發佈的帶安全補丁的版本:
- Next.js 15.x: 升級到 >= 15.2.3
- Next.js 14.x: 升級到 >= 14.2.25
- Next.js 13.x: 升級到 >= 13.5.9
- Next.js 12.x: 升級到 >= 12.3.5
2. 臨時措施:攔截 x-middleware-subrequest 在 Edge/Proxy 層
如果在短期內無法進行升級,可在反向代理或負載均衡層(如 Nginx、Cloudflare、AWS ALB)直接丟棄或重寫來自外部的 x-middleware-subrequest,確保只有真正的內部請求頭能通過。示例 Nginx 配置:
proxy_set_header x-middleware-subrequest "";
或使用 ACL 攔截任何外部請求帶有該頭的情況。但要注意,這種做法需要在Next.js 中間件以外的地方實現,否則也可能被繞過。
3. 二次校驗
如果你在中間件中做了授權校驗,也可以在 API 路由或頁面層再次檢測權限,避免因為單點繞過導致嚴重後果。
六、時間線 (示例)
- 2025-02-27:研究人員通過 GitHub 私有漏洞通道向 Next.js 官方報告
- 2025-03-14:官方開始確認和修復
- 2025-03-17 ~ 03-18:相繼發佈修復版本 14.2.25, 15.2.3
- 2025-03-21:正式公開安全公告,並分配 CVE-2025-29927
- 2025-03-22~03-23:向後續的 13.x、12.x 回滾補丁 (13.5.9, 12.3.5)
七、總結
Next.js 早在 2016 年就開始發佈安全通告;隨着使用者增多,官方也不斷完善漏洞收集、補丁發佈及社區通知流程。本次 CVE-2025-29927 也再次提醒:關鍵安全邏輯不要只依賴前置中間件,需多層校驗;更要及時跟進框架升級和安全通報,避免類似漏洞造成嚴重影響。
若你的項目尚無法升級或缺乏安全策略,務必儘快採取臨時措施(如阻止該頭外部傳入),並在第一時間完成更新。對於依賴 Next.js 進行權限校驗或路徑重寫的團隊,強烈建議定期進行安全審計和滲透測試,以防範後續類似風險。
參考鏈接
- Next.js 官方安全公告: CVE-2025-29927
- ZeroPath Blog: Next.js Middleware CVE-2025-29927 Auth Bypass
- CVE-2025-29927