首頁 / 部落格 / React2Shell:React Server Components 重大 RCE 漏洞技術分析 (CVE-2025-55182)
SecurityReactFrontend

React2Shell:React Server Components 重大 RCE 漏洞技術分析 (CVE-2025-55182)

深入分析 CVSS 10.0 的 React Server Components Flight 協定反序列化漏洞,包含攻擊原理、Gadget Chaining 機制與修補方式。

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 元素
  • 元素類型:如 divspan
  • key:React key(此處為 null)
  • props:屬性物件,可包含巢狀子元素

當 Flight 協定處理包含物件屬性的 payload 時,反序列化器會遞迴解析物件的每個屬性。這個遞迴解析的過程,正是漏洞的根源。

漏洞根因:缺失的屬性檢查

在修補前的程式碼中,Flight 反序列化器在解析物件屬性時,未對屬性名稱進行黑名單過濾。這意味著攻擊者可以在 payload 中注入 __proto__constructor 等特殊屬性。

問題出在 react-server-dom-webpackReactFlightClient.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:在伺服器端執行任意指令

攻擊向量

此漏洞可透過以下途徑被觸發:

  1. Server Actions 輸入:攻擊者透過表單提交或 fetch 呼叫 Server Action,在請求 body 中注入惡意 Flight payload
  2. 動態路由參數:部分框架將路由參數經 Flight 協定傳遞
  3. 跨元件通訊: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 協定在設計時未充分考慮反序列化安全性,導致經典的原型鏈污染攻擊在新的場景下重現。

這個漏洞提醒我們:

  1. 序列化協定需要嚴格的安全審查:任何接受外部輸入的反序列化邏輯都是高風險區域
  2. 原型鏈污染仍然是 JavaScript 生態系的重大威脅:即使在現代框架中也不能忽視
  3. Server-side JavaScript 的攻擊面正在擴大:RSC 將更多邏輯移至伺服器端,也擴大了攻擊面

建議所有使用 React Server Components 的專案立即升級至修補版本。


資料來源

有資安相關的問題想討論,歡迎聯絡我