- React Flight 协议:RSC 使用一种特殊的序列化格式(称为 "Flight")将组件流式传输到客户端。它使用标记(如
$,$@)来表示引用和块。
- Thenables 与 Await:JS 运行时会自动调用具有
.then方法的对象(即 "Thenables")。如果攻击者能构造一个带有.then属性的对象,并让服务器对其进行await操作,就能劫持执行流。
- 漏洞成因:Next.js/React 在处理传入的数据块流时,期望特定的块(如 Chunk 0)是数组。但代码未验证这一点。攻击者可以将 Chunk 0 替换为包含
.then键的对象,从而触发 JavaScript 的 Promise 解析机制,进而执行函数。
1. 核心前置知识
- Thenables 与 await 的特性:
- 危险点:如果攻击者能构造一个带有
.then的对象,并让服务器去await它,攻击者就能控制程序的执行流。
- React "Flight" 协议与引用:
- 例如:
$1:key表示“去引用 ID 为 1 的块,并获取它的key属性”。 - 危险点:这允许攻击者访问服务器内存中对象的原型链(
__proto__),从而获取到某些敏感的内部函数(比如构造函数constructor)。
- React 内部的 Chunk 对象:
2. 攻击链详细步骤
第一步:构造“伪造的 Chunk”(特洛伊木马)
Chunk 类:第二步:劫持 .then (关键点 A)
await 这个 Chunk 0。- 攻击者通过 Flight 协议的引用功能(
$1:__proto__:then),将这个伪造对象的.then属性,指向了 React 真实的Chunk.prototype.then函数。
- 结果:当 JS 运行时尝试执行
await chunk0时,它实际上运行了 React 内部核心代码Chunk.prototype.then.call(chunk0)。
- 为什么要这么做? 因为攻击者不能直接发送 JS 代码去执行,他必须借用服务器上已有的“合法代码”来干坏事。
第三步:触发 initializeModelChunk
Chunk.prototype.then 方法,代码会检查 this.status。- 攻击者在 JSON 里已经把
status设为"resolved_model"。
- React 看到状态已完成,于是调用内部函数
initializeModelChunk(this)来处理这个块。
第四步:上下文投毒 (Context Poisoning - 关键点 B)
initializeModelChunk。这个函数会读取当前 Chunk 的 _response 属性来获取环境信息。- 正常情况下,
_response包含合法的 React 上下文。
- 但这里的
this是攻击者伪造的对象,所以_response也是攻击者完全控制的恶意对象。
第五步:利用 reviveModel 完成 RCE
initializeModelChunk 内部会调用 reviveModel,试图解析数据。在解析过程中,React 逻辑中有一段代码(原本用于处理文件上传或表单数据)会尝试调用:_formData.get 替换成了全局的 Function 构造函数(类似于 new Function()),且 key(或前缀)被替换成了恶意代码字符串。总结
- 欺骗:让数据伪装成 Promise(Thenable)。
- 借刀杀人:利用 React 自身的引用机制,偷取了
Chunk.prototype.then和Function构造函数。
- 偷梁换柱:在 React 以为自己在处理正常的内部 Chunk 初始化时,实际上是在用攻击者提供的恶意参数(代码字符串)去喂给
Function构造函数。
Q&A
Q1:如果我们只用了 Next.js 做静态页面(SSG)或者只用了客户端渲染(CSR),还会受影响吗?
- 回答思路:区分 RSC(服务端组件)和传统 React 的区别。
- 参考答案:
“这个漏洞特指 React Server Components (RSC)。如果我们的应用完全是静态导出(Static Export),或者还在使用老版本的
Pages Router且没有启用 Server Actions/RSC 功能,那么受攻击面的风险会低很多。 但要注意,Next.js 的新版App Router默认就是开启 RSC 的。只要服务端有解析处理客户端传来的 Flight 协议数据流(特别是 Server Actions),就有风险。最稳妥的方式还是升级版本。”
Q2:这个漏洞是 React 的锅还是 Next.js 的锅?
- 回答思路:厘清责任归属,核心在于 React 的底层库。
- 参考答案:
“根源在于 React 核心库(具体是
react-server包)处理反序列化的逻辑。 但是,Next.js 是目前 RSC 落地最广泛的框架,它把请求体(Body)直接喂给了 React 的处理函数,所以 Next.js 应用是重灾区。简单说:漏洞在 React 源码里,但在 Next.js 项目中被‘引爆’了。”
Q3:JS 不是单线程且比较安全吗?为什么传一段 JSON 就能直接执行代码(RCE)?
- 回答思路:解释 JS 动态特性的“双刃剑”——原型链和 Thenable。
- 参考答案: “这正是 JS 灵活性的代价。漏洞利用了两个特性:
- 原型链污染:React 的 Flight 协议允许通过字符串引用(如
$1:__proto__:constructor)来访问内存中的任意对象构造器,这就把Function构造函数暴露出来了。 - Await 的机制:JS 的
await很‘傻’,只要对象有个then方法,它就去执行。攻击者伪造了一个带有then的对象,骗过了服务器,让服务器把这段恶意 JSON 当作代码逻辑跑了起来。 这本质上是一次对象注入(Object Injection)导致的反序列化漏洞。”
Q4:为什么攻击者能绕过 WAF(防火墙)?
- 回答思路:解释流式传输和 WAF 的检测瓶颈。
- 参考答案: “因为 RSC 是流式传输(Streaming)的。攻击者可以在 Payload 前面填充大量的垃圾数据(例如 128KB 的随机字符)。 很多 WAF 为了性能,只检查请求体的前几 KB。当垃圾数据塞满了 WAF 的缓冲区后,真正的攻击载荷(Payload)就被放行了。而且,攻击载荷是经过序列化的 Flight 协议字符串,特征比较晦涩,传统的 SQL 注入或 XSS 规则很难匹配到。”
Q5:官方补丁是怎么修的?我们以后写代码要注意什么?
- 回答思路:解释官方修复的逻辑(类型检查)。
- 参考答案:
“官方的修复逻辑其实很朴素但有效:加强类型检查。
React 现在在处理 Chunk 时,不再盲目相信传进来的对象。它会检查这个对象是否真的是内部创建的实例(比如检查
hasOwnProperty或者验证原型链),防止外部传入的 JSON 伪装成内部 Promise。 给我们的启示是:在服务端处理任何序列化数据(JSON, XML, YAML)时,永远不要相信客户端传来的数据结构,特别是当涉及到类实例化或异步操作时。”
React2Shell (CVE-2025-55182)
A 10.0 critical severity vulnerablility affecting server-side use of React.js, tracked as CVE-2025-55182 in React.js and CVE-2025-66478 specifically for the Next.js framework.

React2Shell(CVE-2025–55182): A Technical Deep Dive
In this blog, we analyze a critical 10.0‑severity vulnerability affecting the server‑side use of React.js, tracked as CVE‑2025‑55182 an…

High Fidelity Detection Mechanism for RSC/Next.js RCE (CVE-2025-55182 & CVE-2025-66478) › Searchlight Cyber
This morning, an advisory was released for Next.js about a vulnerability that leads to RCE in default configurations, with no prerequisites. The root cause of this issue lies in React Server Components, which Next.js utilizes. Over the last day, we have noticed an incredible amount of incorrect PoCs floating around on GitHub that do not

Understanding React Server Components | Tony Alicea
A deep dive into the internals of React and Next.js to understand RSCs.
GitHub - assetnote/react2shell-scanner: High Fidelity Detection Mechanism for RSC/Next.js RCE (CVE-2025-55182 & CVE-2025-66478)
High Fidelity Detection Mechanism for RSC/Next.js RCE (CVE-2025-55182 & CVE-2025-66478) - assetnote/react2shell-scanner