React2Shell:React Server Components 重大 RCE 漏洞技術分析
2025 年 12 月 3 日,React 官方揭露了一個影響 React Server Components (RSC) 的重大漏洞 CVE-2025-55182,被安全研究社群稱為「React2Shell」。此漏洞的 CVSS 評分為 10.0(Critical),允許攻擊者透過惡意序列化 payload 在伺服器端實現遠端程式碼執行(RCE)。
影響範圍
受影響的套件與版本:
| 套件 | 受影響版本 | 修補版本 |
|---|---|---|
| react-server-dom-webpack | 19.0.0 - 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
| react-server-dom-parcel | 19.0.0 - 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
| react-server-dom-turbopack | 19.0.0 - 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
使用 Next.js App Router、Remix RSC 模式、或任何啟用 React Server Components 的框架皆受影響。根據 Wiz 的報告,約 39% 的雲端環境中存在受影響的部署。
Flight 協定簡介
要理解此漏洞,首先需要了解 React Server Components 的 Flight 協定。
Flight 是 RSC 用來在伺服器與客戶端之間傳輸元件樹的序列化協定。當伺服器渲染 RSC 時,元件樹會被序列化為 Flight 格式的串流,客戶端再反序列化還原為 React 元素。
Flight 格式的基本結構:
0:["$","div",null,{"children":"Hello"}]
1:["$","span",null,{"className":"highlight","children":"World"}]每一行代表一個 React 元素,包含:
- 行號:chunk ID
$前綴:表示這是 React 元素- 元素類型:如
div、span - key:React key(此處為 null)
- props:屬性物件,可包含巢狀子元素
當 Flight 協定處理包含物件屬性的 payload 時,反序列化器會遞迴解析物件的每個屬性。這個遞迴解析的過程,正是漏洞的根源。
漏洞根因:缺失的屬性檢查
在修補前的程式碼中,Flight 反序列化器在解析物件屬性時,未對屬性名稱進行黑名單過濾。這意味著攻擊者可以在 payload 中注入 __proto__、constructor 等特殊屬性。
問題出在 react-server-dom-webpack 的 ReactFlightClient.js 中的物件重建邏輯:
// 修補前(簡化示意)
function parseModelRecursively(response, parentObj, key, value) {
// 直接設定屬性,未檢查 key 是否為危險屬性
parentObj[key] = parseModel(response, value);
}攻擊者可以透過精心建構的 Flight payload,將 constructor 屬性指向任意物件,進而存取 Function 建構子。
攻擊機制:Gadget Chaining
此漏洞的利用分為三個階段:
第一階段:建構惡意物件
攻擊者建構一個包含 constructor 屬性的物件,使其指向 Function 物件:
// 攻擊者建構的 payload 概念(簡化)
{
"constructor": {
"prototype": {
"then": "<malicious function>"
}
}
}第二階段:建立 Thenable 物件
React 內部大量使用 Promise 模式。當反序列化器遇到一個具有 .then 方法的物件時,會將其視為「thenable」——一個類 Promise 物件。
攻擊者利用原型鏈污染,讓目標物件繼承一個攻擊者控制的 then 方法:
// Flight payload 結構(Dynatrace 分析)
0:["$","div",null,{
"children": {
"__proto__": {
"then": ["$","Function",null,{
"body": "return process.mainModule.require('child_process').execSync('id').toString()"
}]
}
}
}]第三階段:Promise 自動解析觸發 RCE
React 的渲染引擎在處理子元素時,若發現物件具有 then 方法,會自動嘗試「解析」這個 thenable:
// React 內部處理邏輯(簡化)
if (typeof child.then === 'function') {
// 將 thenable 視為 Promise,呼叫 .then()
child.then(resolve, reject);
}當 then 被呼叫時,攻擊者注入的惡意函式就會在伺服器端執行,實現 RCE。
完整攻擊流程
攻擊者建構惡意 Flight payload
│
▼
伺服器接收並開始反序列化
│
▼
反序列化器遞迴解析物件屬性
(未過濾 __proto__ / constructor)
│
▼
原型鏈被污染,目標物件獲得 .then 方法
│
▼
React 渲染引擎將物件視為 thenable
│
▼
呼叫 .then() → 執行攻擊者控制的函式
│
▼
RCE:在伺服器端執行任意指令攻擊向量
此漏洞可透過以下途徑被觸發:
- Server Actions 輸入:攻擊者透過表單提交或
fetch呼叫 Server Action,在請求 body 中注入惡意 Flight payload - 動態路由參數:部分框架將路由參數經 Flight 協定傳遞
- 跨元件通訊:Client Component 傳遞 props 給 Server Component 時
其中 Server Actions 是最常見的攻擊面,因為它直接接受客戶端輸入並進行反序列化。
實際利用情況
根據 Microsoft Threat Intelligence 和 AWS Security 的報告,此漏洞在揭露後 48 小時內即被觀察到實際利用:
- 多個 APT 組織開始掃描暴露的 Next.js 應用程式
- 攻擊者利用 RCE 植入加密貨幣挖礦程式
- 部分攻擊涉及資料竊取和持久化後門
修補方式
React 團隊在修補中加入了屬性名稱的黑名單檢查:
// 修補後(簡化示意)
const BLOCKED_KEYS = new Set([
'__proto__',
'constructor',
'prototype'
]);
function parseModelRecursively(response, parentObj, key, value) {
if (BLOCKED_KEYS.has(key)) {
// 忽略危險屬性,記錄警告
console.warn('Blocked dangerous key in Flight payload:', key);
return;
}
parentObj[key] = parseModel(response, value);
}同時也加入了對 thenable 物件來源的驗證,確保只有經過合法序列化流程產生的 Promise 才會被自動解析。
緩解措施
若無法立即升級,可採取以下緩解措施:
1. 輸入驗證
在 Server Actions 中加入 payload 驗證:
'use server'
import { z } from 'zod';
const ActionSchema = z.object({
name: z.string().max(100),
email: z.string().email(),
});
export async function submitForm(formData: FormData) {
const validated = ActionSchema.parse({
name: formData.get('name'),
email: formData.get('email'),
});
// 使用驗證後的資料
}2. WAF 規則
設定 Web Application Firewall 攔截包含 __proto__ 或 constructor 的請求:
# Cloudflare WAF 規則範例
(http.request.body contains "__proto__") or
(http.request.body contains "\"constructor\"")3. 網路層隔離
限制 Server Components 的網路存取,降低 RCE 後的橫向移動風險。
升級指南
# 升級至修補版本
npm update react react-dom react-server-dom-webpack
# 確認版本
npm ls react-server-dom-webpack若使用 Next.js:
# Next.js 已在 15.2.1 中整合修補
npm update next時間線
| 日期 | 事件 |
|---|---|
| 2025-11-15 | 安全研究員向 React 團隊回報漏洞 |
| 2025-12-03 | React 官方發布安全公告與修補版本 |
| 2025-12-05 | 觀察到野外利用行為 |
| 2025-12-08 | Wiz 發布雲端影響分析報告 |
| 2025-12-12 | Microsoft / AWS 發布威脅情報報告 |
| 2025-12-15 | Dynatrace / Unit42 發布詳細技術分析 |
結論
React2Shell 是 React Server Components 架構中的一個根本性設計缺陷。Flight 協定在設計時未充分考慮反序列化安全性,導致經典的原型鏈污染攻擊在新的場景下重現。
這個漏洞提醒我們:
- 序列化協定需要嚴格的安全審查:任何接受外部輸入的反序列化邏輯都是高風險區域
- 原型鏈污染仍然是 JavaScript 生態系的重大威脅:即使在現代框架中也不能忽視
- Server-side JavaScript 的攻擊面正在擴大:RSC 將更多邏輯移至伺服器端,也擴大了攻擊面
建議所有使用 React Server Components 的專案立即升級至修補版本。
資料來源:
- React Official Security Advisory - CVE-2025-55182
- Wiz - React2Shell Cloud Impact Analysis
- Dynatrace - Flight Protocol Exploitation Deep Dive
- Microsoft Threat Intelligence - React2Shell in the Wild
有資安相關的問題想討論,歡迎聯絡我。