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

2025年12月3日,React 團隊緊急發布安全公告,披露了一個影響 React Server Components 的嚴重安全漏洞。攻擊者可以在無需身份驗證的情況下,通過精心構造的 HTTP 請求實現遠程代碼執行,完全控制伺服器。
如果你在使用以下任一技術棧,請立即檢查:
react-server-dom-webpack、react-server-dom-parcel 或 react-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__ 等特殊屬性名,訪問到模塊導出對象的原型鏈屬性。

完整的攻擊流程如下:
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. 函數被調用,執行攻擊者代碼 💥

攻擊者可以構造如下請求:
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--
這個請求會:
vm 模塊vm.runInThisContext 方法execSync('id'),實現命令執行根據安全研究,以下 Node.js 模塊如果存在於 webpack bundle 中,都可以被利用:
| 模塊 | 方法 | 攻擊效果 |
|---|---|---|
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-extra、gray-matter、multer、sharpchild_process:構建工具、PDF 生成、圖像處理常用(103M+ 周下載量)
execa、shelljs、puppeteer、sharpvm:模板引擎、測試框架使用(21M+ 周下載量)
ejs、pug、handlebars、vm2這意味著大多數使用 React Server Components 的應用都可能存在可被利用的危險模塊!
React 團隊已經在以下版本中修復了漏洞:
react-server-dom-webpack: >= 19.0.1, >= 19.1.2, >= 19.2.1react-server-dom-parcel: >= 19.0.1, >= 19.1.2, >= 19.2.1react-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 版本選擇對應的修復版本
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
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
npm install react@latest react-dom@latest react-server-dom-webpack@latestnpm install react@latest react-dom@latest react-server-dom-webpack@latest waku@latestrwsdk>=1.0.0-alpha.0,然後升級 React 相關包檢查你的專案是否包含危險模塊:
# 檢查是否包含危險模塊
npm list | grep -E "(vm|child_process|fs)"
在 next.config.js 中排除危險包,防止它們被打包:
module.exports = {
serverExternalPackages: [
'sharp',
'puppeteer',
'execa',
'shelljs'
]
}
如果你的應用部署在支持 WAF 的環境,可以添加以下規則攔截可疑請求:
# 攔截包含危險模式的請求
$ACTION_*#constructor
$ACTION_*#__proto__
$ACTION_*#prototype
vm#runInThisContext
child_process#execSync
fs#writeFileSync
監控日誌中的異常模式:
#constructor、#__proto__ 的 Server Action 請求vm、child_process 等模塊的異常訪問
這個漏洞給我們幾個重要的安全啟示:
在 JavaScript 中,使用方括號訪問屬性時,永遠要考慮原型鏈。對於用戶可控的屬性名,必須使用 hasOwnProperty 或 Object.prototype.hasOwnProperty.call() 進行檢查。
任何涉及反序列化用戶輸入的地方都是高風險區域。React Server Components 的 Flight 協議本質上就是一種序列化/反序列化機制,需要嚴格驗證。
即使修復了漏洞,也應該儘量減少伺服器端 bundle 中包含的危險模塊。只打包真正需要的程式碼。
Next.js 等框架在 React 底層之上添加了額外的驗證層,這種深度防禦策略在關鍵時刻起到了保護作用。
你可能會想:既然可以訪問 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(已執行)
這就是為什麼攻擊者需要 vm 或 child_process 這樣的"執行型"gadget。
在 Next.js 中,攻擊難度更高,因為:
resolveServerReference() 會在調用 requireModule() 之前進行驗證但這不意味著 Next.js 應用完全安全——如果攻擊者能夠:
仍然可能實現攻擊。
CVE-2025-55182 是一個極其嚴重的漏洞,CVSS 10.0 的評分意味著:
如果你在使用 React Server Components,請立即:
安全無小事,及時更新是關鍵!🔐
作者注:本文基於 React 官方安全公告和實際漏洞研究編寫。如果你發現了本文中的錯誤或需要補充,歡迎指正。
免責聲明:本文僅用於安全研究和教育目的。請勿將本文中的技術用於非法用途。