React2Shell 漏洞分析:React/Next.js 伺服器端渲染(SSR)引發的遠端程式碼執行風險
隨著現代 Web 開發逐漸從純客戶端渲染(CSR)轉向伺服器端渲染(SSR)與靜態生成(SSG),Next.js 與 React Server Components (RSC) 已成為企業級應用的主流技術堆疊。然而,近期資安社群關注的「React2Shell」漏洞概念,揭示了開發者在處理伺服器端資料序列化與環境變數注入時,可能導致嚴重的遠端程式碼執行(RCE)風險。這類漏洞通常源於對 dangerouslySetInnerHTML 的不當使用,或是 Server-side Action 中對於不受信任輸入的處理不當。
漏洞核心機制:從序列化陷阱到代碼注入
React2Shell 漏洞並非指涉單一的 CVE 編號,而是一類發生在 React/Next.js 生態系中的典型攻擊向量。其核心在於「邊界模糊」——當應用程式在伺服器端執行邏輯並將結果傳遞至客戶端時,若未對資料進行嚴格的消毒(Sanitization),攻擊者可透過注入特定的 JSON 負載或操控 React 的內部屬性(如 __proto__ 或 dangerouslySetInnerHTML),迫使伺服器執行惡意指令。
在 Next.js 的環境中,Server Actions 提供了一個直接從客戶端呼叫伺服器函式的途徑。如果開發者在 Server Action 中直接使用了像是 eval()、child_process.exec(),或是透過動態鍵值存取了敏感的物件屬性,攻擊者就能藉由偽造的請求參數觸發 RCE。這種攻擊模式在結合了 Node.js 執行環境的特性後,威脅程度會從單純的 XSS 提升至作業系統層級的控制權奪取。
技術深挖:攻擊路徑與情境模擬
典型的攻擊路徑通常包含以下步驟:
- 探測階段:攻擊者尋找應用程式中暴露的 Server Actions 端點,觀察其接受的參數格式。
- 注入階段:利用 React 在處理
props時的特性,嘗試注入包含__html酬載的物件,或是利用原型鏈污染(Prototype Pollution)影響伺服器端的全域物件。 - 觸發階段:當 Next.js 在伺服器端嘗試將這些污染過的資料序列化並嵌入到初始 HTML 頁面時,惡意代碼隨之執行。
// 錯誤範例:不安全的 Server Action
export async function updateUserProfile(formData: FormData) {
const data = Object.fromEntries(formData);
// 假設開發者為了彈性,動態執行了某些邏輯
// 攻擊者若傳入 "constructor": { "prototype": ... }
// 可能導致伺服器端邏輯崩潰或執行任意代碼
const result = await someInternalLibrary.process(data);
return result;
}
企業 IT 與資安工程師的防禦策略
針對 React2Shell 類型的風險,防禦工作必須從開發規範(SDLC)與架構層級同時著手:
1. 嚴格的資料驗證與 Schema 定義
不要信任任何來自客戶端的輸入。在 Server Actions 或 API Routes 中,應強制使用如 Zod 或 Yup 等函式庫進行 Schema 驗證。確保傳入的資料型態、長度與內容完全符合預期,嚴禁動態解析不受限的 JSON 物件。
2. 限制環境變數與敏感資訊暴露
Next.js 區分了 NEXT_PUBLIC_ 前綴的環境變數。資安工程師應定期稽核 .env 檔案,確保後端 API Key、資料庫憑證等絕不會帶有此標記,避免這些資訊被打包進客戶端 JS Bundle 中,減輕資訊洩漏後被擴大攻擊的風險。
3. 停用不安全的 React 屬性
除非絕對必要,否則應全面禁止使用 dangerouslySetInnerHTML。若業務需求必須渲染 HTML,應使用 DOMPurify 在伺服器端先進行深度消毒。此外,應配置 Content Security Policy (CSP) 以限制內聯腳本(Inline Scripts)的執行。
4. 執行環境隔離
在架構層面上,建議將 Next.js 應用程式運行在非特權容器中,並限制容器的出站流量(Egress Filtering)。即使攻擊者成功達成 RCE,也能有效防止其下載後續木馬或對內網進行橫向移動。
MITRE ATT&CK 對應
- T1190 – Exploit Public-Facing Application(利用公網應用程式漏洞進行初始存取)
- T1059.003 – Command and Scripting Interpreter: Windows Command Shell(利用指令解釋器執行代碼)
- T1505.003 – Server Software Component: Web Shell(植入 Web Shell 以維持權限)
結論:現代框架下的資安新常態
React 與 Next.js 雖然提供了強大的開發效率,但也將前端與後端的界線變得模糊。React2Shell 類型的風險提醒我們,SSR 應用本質上是一個執行在伺服器端的複雜 Node.js 程式。身為資安與系統工程師,我們必須跳脫傳統「前端僅負責顯示」的思維,將後端安全防護的標準全面落實到 React Server Side 邏輯中,才能在追求技術進步的同時,確保企業資訊資產的安全。
參考資料與原文來源
- Next.js Security Documentation: Server Actions and Data Fetching (Vercel)
- OWASP Top 10: Injection Risks in Modern JavaScript Frameworks (OWASP)
- React Security Best Practices: Preventing XSS and SSR Injection (React.dev)
- Understanding Prototype Pollution in Node.js Applications (Snyk)
🧠本文由 DreamJ AI 技術新聞生成系統 自動撰寫並進行語意優化,僅供技術研究與教學使用。
請以原廠公告、CVE 官方資料與安全建議為最終依據。












發佈留言