文章总结: CVE-2025-55182React2Shell是一个严重的ReactServerComponents漏洞,允许未经身份验证的远程代码执行。漏洞根本原因是RSC反序列化代码允许可执行的构造函数引用,攻击者可通过构造恶意HTTP请求在服务器上执行任意JavaScript代码。该漏洞主要影响使用RSC的应用,尤其是Next.js框架,因为Next.js默认开启RSC功能。文章详细分析了漏洞原理、利用条件,并提供了漏洞复现方法和受影响版本列表,建议用户尽快升级到安全版本。 综合评分: 92 文章分类: 漏洞分析,WEB安全,应用安全,漏洞预警,安全大事件
CVE-2025-55182 React2Shell 深入详解
原创
temker
绿洲安全
2025年12月19日 21:27 北京
前言
由于不安全的反序列化,该漏洞允许在服务器上进行未经身份验证的远程代码执行,该漏洞存在于受影响应用程序的默认配置中。
攻击者向目标服务器发送一个特制的HTTP请求,通过控制的数据影响服务器端执行逻辑,导致特权JavaScript代码的执行。该漏洞存在于RSC react-server包,服务器以不安全的方式处理Flight 协议格式的数据。
CVE-2025-66478(Next.js) 已被判定为 CVE-2025-55182 的重复项,在CVE列表中标记为“Rejected”。它们的漏洞成因相同,CVE-2025-55182 已涵盖了这两种情况。
Prior Knowledge
CVE-2025-55182 React2Shell漏洞与React、RSC、Flight、Next.js密切相关。
React :一个用于构建用户界面的 JavaScript 库,由 Meta 推出。React 不是语言、不是框架,它作为UI 渲染引擎,工作目标是根据状态生成视图, 并在状态变化时只更新必要的部分。
React Server Components:一种在服务器端运行的新型 React 组件,实现在服务器端执行和渲染,将执行结果以 “HTML + 描述信息”的形式发送到浏览器,浏览器根据描述信息重建UI即可。
React Flight 协议:是 React 为 RSC 设计的专用序列化与传输协议,将服务器执行后的组件树结构,以一种轻量、可流式的格式高效、安全地发送到客户端,使客户端能够局部重建 UI。
Next.js:一个基于 React 的全栈应用框架,由 Vercel 推出。它扩展了React的能力,旨在帮助开发者轻松构建高性能、可生产的现代React应用程序,并且无需繁琐的配置即可使用。Next.js 是现代 React 官方推荐的运行时环境,应用广泛。因此在 Recat 存在 CVE-2025-55182 漏洞的情况下,基于相关React版本的Next.js成为攻击的关注点。
| 层级 | 角色 | | — | — | | React | UI 渲染引擎,负责组件模型、虚拟 DOM、调度。 | | RSC(React Server Components) | React 的“服务器执行层”。 | | Flight 协议 | 服务器与客户端共享组件树的底层通信格式。 | | Next.js | 利用上述能力搭建完整 Web 框架(路由、构建、部署、数据、RSC 集成)。 |
渲染模式发展的三个阶段
-
服务器渲染 HTML
浏览器发送请求,服务器拼接完整 HTML,返回至浏览器直接显示。
-
浏览器渲染
以 React / Vue / Angular 为代表的单页应用技术出现后,服务器只发一个空壳 HTML + 一大包 JS,浏览器下载整包 JS,浏览器执行 JS 生成页面。
-
React RSC 和 Flight(CVE-2025-55182漏洞场景)
React 新架构把渲染逻辑的一部分回迁到服务器,服务器负责执行 Server Components(非交互 UI + 数据逻辑),读取数据库 / API,将UI结构以 Flight 协议流式发往客户端,浏览器负责实现交互逻辑,执行 Client Components,根据 Flight payload 重建 UI。
漏洞成因
客观条件
Flight 协议支持结构化数据从客户端发送回服务器,这导致反序列化逻辑成为潜在攻击点。
当服务器接收到来自客户端的通过 RSC Flight 协议发送过来的,由攻击者构造恶意 payload 时,React 在服务端反序列化这些 payload,重建 RSC 所需的内部模型结构。
根本问题
React 官方库中的 RSC 反序列化代码允许“可执行的构造函数引用 (constructor references)”。
问题发生在 React Server Components payload decoder,受影响的RSC模块为react-server-dom-webpack 、react-server-dom-parcel 、react-server-dom-turbopack,这些都是 RSC 的服务端渲染器 / 反序列化器,其中的decodeReplyFromBusboy函数在对multipart类型数据处理时存在设计缺陷。
反序列化器允许从客户端传来的 payload 中指定一个“引用类型”,解析器会在服务端查找对应的模块或函数,并执行。
原理分析
Next.js触发漏洞的场景说明
Server Action功能
React RSC 提供了 Server Action 功能,是一种服务器端函数调用机制,允许客户端直接调用服务端函数,函数在服务端执行。客户端通过HTTP协议实现这一过程,利用 Flight 协议和 Action ID 将调用指令发送给服务器。在Next.js框架中自实现了相关过程的处理,无需用户开发。
在请求头中,使用next-action:actionID表明该请求是对Server Action的调用,actionID在项目构建时由Next.js自动生成,并建立与函数的映射关系Action Manifest。
在请求体中,构造向函数传递的参数,形式需符合 RSC Flight 协议格式要求。
服务端收到请求后,识别到 next-action 头进入 action 处理流程,对参数进行反序列化,根据actionID与映射关系寻找函数,函数存在时执行,结果仍以RSC payload形式返回客户端。
流程为:客户端发送 next-action 请求 → 服务器反序列化flight数据 → 服务器解析 actionID → 服务器匹配函数 → 服务器执行函数并渲染 → 通过 RSC Flight 协议返回结果
actionID与函数映射关系文件路径为:.next/server/server-reference-manifest.json
客户端接收的 js 文件中存在对应关系
该 js 文件在 Next.js 项目中的位置为:.next/static/chunks
HTTP 请求头中可查看 Next-Action 值:
Server Action调用过程相关代码
Next.js中,handleAction函数是 Server Action 请求的核心执行入口,路径为node_modules/next/dist/server/app-render/action-handler.js,首先根据请求格式初步判断是否可能是server action请求。
通过在/client/components/app-router-headers.js中定义常量 ACTION_HEADER 为next-action。
在/server/lib/server-action-request-meta.js中定义函数getServerActionRequestMetadata和getIsPossibleServerAction,获得相关HTTP元数据,初步判断是否是Server Action。
分析getIsPossibleServerAction函数可以得出结论,只要构造的请求中有 next-action 头,且类型是字符串,请求方法为POST,contentType 为 application/x-www-form-urlencoded,是以 multipart/form-data 构成请求体,满足这些条件时会将请求作为 server action 进行处理。
随后进入处理过程,首先判断程序的运行时环境,仅在 Node.js Runtime 下能使用 Busboy / multipart 解析,Edge Runtime环境能力受限。
环境判断代码:
在后续处理过程调用 decodeReplyFromBusboy函数中会对请求体参数进行反序列化处理,函数声明路径为node_modules/next/dist/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js:
在这个入口函数里,字段被接收并传给后续的字段处理函数( resolveField → resolveModelChunk → initializeModelChunk → reviveModel),最终重建模型结构,将数据还原为实际对象。
handleAction内关键代码片段如下:
Next.js框架下漏洞可利用的原因
-
RSC 默认开启
Next.js 是使用 RSC 特性的最主流的框架。且默认情况下,Next.js 13.4 版本后 RSC 首选架构 App Router,在使用 App Router 的 Next.js 应用中 RSC 默认启用。在14-16版本中对 RSC、Flight 协议和 Server Actions 引入了大量新特性与解析逻辑,造成漏洞。漏洞存在于 RSC 所使用的 “Flight 协议反序列化实现”过程中,因此在特定运行时和请求条件下可达该漏洞路径。
-
Server Action 功能向任意用户提供了不受信任请求的反序列化处理路径
由于参数反序列化优先于 actionId 的有效性判断,因此在 App Router 模式下的受影响 Next.js 版本中,即使应用没有定义任何 Server Actions,只要客户端在HTTP请求中添加
next-action头,Next.js 就会将该请求体视为 Server Action payload 并进入 Flight/RSC 解码流程。这一解析逻辑无须验证 Action 是否存在,因此所有带有此标头的 payload 都会被反序列化。
非 Next.js 框架下漏洞利用条件分析
一个非 Next.js 框架如果同时满足以下条件,那么在漏洞模型上与 Next.js 等价,CVE-2025-55182 是成立的:
- 使用 React Server Components(RSC / Flight)
- 运行在 Node.js Runtime
- 存在一条 RSC / Action 的 multipart 请求处理路径
- 该路径最终调用了 React 的
decodeReplyFromBusboy - 攻击者可以使不受信任的请求进入该路径
对于非Next.js框架,以开发者自己搭建的 RSC 环境为例,React 不会自动启动 RSC 解码器,开发者必须显式搭建支持 RSC 的服务器架构,并调用相应的解码函数。
// VECTOR: Manual RSC Server Implementation// The application explicitly imports and uses the vulnerable decoder.import { decodeReply } from 'react-server-dom-webpack/server';
app.post('/my-rsc-endpoint', async (req, res) => { // The raw body is passed directly to the RSC decoder // req.body should be multipart format const args = await decodeReplyFromBusboy(req.body); });
此处/my-rsc-endpoint接口调用了 RSC 的 decodeReplyFromBusboy 函数。
React官方提示受影响的框架或打包工具:next、react-router、waku、rwsdk、@parcel/rsc、@vitejs/plugin-rsc。
React 官方提示不受该漏洞影响的情况:
- 如果应用中的 React 代码并未运行在服务器端,则应用不受此漏洞影响。
- 如果应用未使用任何支持 React Server Components 的框架、打包器或打包器插件,则应用不受此漏洞影响。
漏洞利用复现
使用nodejs环境的容器
# 拉取镜像docker pull node:25# 启动镜像映射端口docker run -it -p 3000:3000 /bin/bash
next.js应用
# 在容器内部署项目应用,[email protected]版本依赖链中包含处于CVE-2025-55182受影响区间内的RSC/Flight包npx [email protected] rsc-vulncd rsc-vuln# 启动应用npm run dev
如果复现 next-action 相关效果,需添加如下文件后再启动应用。
创建文件 app/components/TodoForm.tsx
'use client';import { addTodo } from '../actions';
export function TodoForm() { async function handleAdd() { const result = await addTodo('Buy milk'); console.log(result); }
return <button onClick={handleAdd}>Add Todo</button>;}
创建文件 app/actions.ts
'use server';
export async function addTodo(title: string) { return { id: Date.now(), title };}
修改文件 app/page.tsx
// 添加页面元素<div> <h1>My Todos</h1> <TodoForm /> <h1>My Todos</h1> <TodoForm /></div>
点击页面添加的My Todos标题触发请求。
exp利用
浏览器访问效果
exp利用效果
此处为响应体中显示命令执行结果,利用包括打开计算器、内存马、响应头显示命令执行结果、DNSlog等。
影响范围
react:19.0.0、19.1.0、19.1.1、19.1.0
Next.js:
| 漏洞版本 | 补丁版本 | | — | — | | Next.js 15.0.x | 15.0.5 | | Next.js 15.1.x | 15.1.9 | | Next.js 15.2.x | 15.2.6 | | Next.js 15.3.x | 15.3.6 | | Next.js 15.4.x | 15.4.8 | | Next.js 15.5.x | 15.5.7 | | Next.js 16.0.x | 16.0.7 | | Next.js 14 canaries 14.3.0-canary.76之后版本 | 降级到 14.3.0-canary.76 (not vulnerable) | | Next.js 15 canaries 15.6.0-canary.58之前版本 | 15.6.0-canary.58 | | Next.js 16 canaries 16.1.0-canary.12之前版本 | 16.1.0-canary.12 及之后 |
参考文章
https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182
https://aws.amazon.com/cn/security/security-bulletins/rss/aws-2025-030
https://vercel.com/kb/bulletin/react2shell
https://nvd.nist.gov/vuln/detail/CVE-2025-55182#toggleConfig1
https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
https://nextjs.org/docs/app/api-reference/directives/use-cache#serialization
https://react.dev/reference/rsc/use-server#serializable-parameters-and-return-values
https://keenlab.tencent.com/zh/2025/12/08/2025-CVE-2025-55182/
查看原文:《CVE-2025-55182 React2Shell 深入详解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论