博客 / 詳情

返回

NextJS CVE-2025-29927 安全漏洞

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 進行權限校驗或路徑重寫的團隊,強烈建議定期進行安全審計和滲透測試,以防範後續類似風險。


參考鏈接

  1. Next.js 官方安全公告: CVE-2025-29927
  2. ZeroPath Blog: Next.js Middleware CVE-2025-29927 Auth Bypass
  3. CVE-2025-29927
user avatar shen_5bbe318c912ed 頭像 air_clou_d 頭像 denzel 頭像 wecteam 頭像 hs_developer 頭像 mi2nagemao 頭像 benfangdechaofen 頭像 u_13446 頭像
8 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.