2025 年 11 月 30 日,安全研究员 Lachlan 把一个关键漏洞报告给 Meta。三天后,Meta 发布修复和 CVE-2025-55182 公告。这个漏洞后来被叫作 React2Shell。
这事最刺眼的地方,不是“又一个 RCE”。而是它出现在 React Server Components 背后的 Flight 协议里。一个研究员原本是在研究协议细节,结果顺着框架没让多数开发者看见的那层机制,挖到了远程代码执行风险。
React 的麻烦不在于它突然变得不可信。恰恰相反,React 长期给人的印象是稳定、成熟、抽象干净。所以这次更像一次提醒:抽象越顺手,边界越容易被看错。
发生了什么,谁该立刻处理
这次事件的事实线很短,也很清楚。
| 问题 | 目前能确认的信息 |
|---|---|
| 报告时间 | 2025 年 11 月 30 日,Lachlan 向 Meta 报告 |
| 修复时间 | 2025 年 12 月 3 日,Meta 发布修复和 CVE-2025-55182 公告 |
| 漏洞性质 | 与 React Server Components / Flight 相关的远程代码执行风险 |
| 相关生态 | 使用 RSC、Server Functions 的框架和网站,Next.js 生态尤其需要排查 |
| 直接动作 | 按 Meta 公告升级;不要把 TypeScript 类型当运行时输入校验 |
这里要克制一点。现有材料没有证明已经出现大规模真实攻击,也没有给出确定受影响网站数量。能说的是:影响面可能很大,因为 RSC 和 Server Functions 已经进入主流 React 框架的日常开发路径。
最该紧张的不是普通访客,而是两类人。
一类是 React / Next.js 开发者。尤其是项目里已经启用 RSC、Server Functions,或者依赖框架自动处理客户端到服务端调用的团队。你们要做的不是讨论漏洞名字吓不吓人,而是按 Meta 公告确认版本、升级依赖、重新检查入口。
另一类是企业里的平台组和安全团队。很多公司内部会有统一脚手架、模板仓库、Next.js 基建封装。这里的风险不是某个业务写错一行代码,而是错误模式被模板复制几十次。排查要从依赖清单、框架版本、RSC 使用点、Server Functions 暴露面一起看。
现在还看不清的,是真实利用规模、受影响站点数量,以及各框架下游修复节奏。没有证据,就不要替攻击者写战报。但没有战报,也不等于可以慢慢等。
Flight 不是普通 JSON,TypeScript 也不是门卫
React Server Components 想解决的问题很诱人:让服务端组件、客户端交互、服务端函数调用,看起来像在同一个 JavaScript 世界里自然流动。
Next.js 这类框架把体验又往前推了一步。你写 Server Function,客户端动作可以触发服务端代码。少写胶水代码,少造 API 层,开发者当然喜欢。
代价藏在传输层。
普通 JSON 只能表达有限的数据:字符串、数字、布尔值、数组、普通对象。RSC / Server Functions 要处理的东西更复杂。它可能涉及 Date、BigInt、Map、Set、Promise、引用关系,甚至对象属性和方法相关的表达。
Flight 就是这条通道。
它不是“JSON 加一点框架私货”。它能表达更接近 JavaScript 运行时的复杂对象世界。客户端发来的东西,经过框架处理后,可能不再只是一个表单字段,而是一组被还原、引用、连接过的结构。
攻击面就在这里变形。
开发者写下 name: string,TypeScript 会在开发期帮你发现很多错误。这很好。TypeScript 不是废物,恰恰是现代前端工程化的重要支柱。
但它不负责替你检查运行时的陌生输入。用户发来的数据,到了服务端那一刻,类型标注不会自动变成安全检查。
这个边界很多人知道,但很少人时时刻刻按它写代码。框架越像魔法,忘得越快。
对开发团队来说,排查清单可以很朴素:
- 按 Meta 公告升级 React 及相关框架依赖,以官方列出的修复版本为准。
- 盘点项目里使用 RSC、Server Functions 的入口,尤其是能被客户端触发的路径。
- 对来自客户端的数据做运行时校验,不要只依赖函数签名和 TypeScript 标注。
- 检查日志和监控中异常的 Flight / Server Function 请求形态,但不要把“没看到异常”当成安全结论。
- 如果公司有统一 Next.js 模板或内部框架封装,优先修模板,再催业务升级。
这不是让所有团队停工迁移。更现实的动作是:升级、盘点、加校验、盯下游公告。采购新框架、上新项目模板、做技术选型的团队,可以把 RSC / Server Functions 的安全边界说明列进评审项。不是不用,而是别把它当透明空气。
前端框架越像基础设施,越不能靠感觉划边界
我更在意的不是某个漏洞技巧,而是这次暴露出来的错位:框架努力让开发者少感知复杂性,安全却常常就藏在复杂性里。
Flight 对多数开发者来说并不是一个每天要读的公开协议。很多人看到那种请求格式,会把它当成框架内部细节。安全测试也容易沿着传统表单、传统 REST API、传统 JSON 参数的思路走。
可 RSC 的世界不是传统 API。
它把“远程调用”“对象传输”“服务端执行”包进了更顺滑的编程模型里。顺滑是生产力,也是遮蔽物。开发者越觉得“框架会处理”,越要追问三件事:这个对象从哪来?谁能控制它?运行时到底验没验?
这有点像早期铁路。不完全一样,但结构相似。铁路不是因为有事故就该被否定;铁路的问题在于,一旦成为基础设施,单点失误会沿着网络放大。速度越快,调度和信号系统越不能靠经验凑合。
RSC 也是这样。它不是坏东西。Server Functions 也不是原罪。问题在于,生态叙事一直强调“少写 API”“服务端和客户端无缝衔接”,却没有同等强度地提醒:无缝不等于无边界。
“利之所在,趋之若鹜。”框架追求采用率,团队追求交付速度,开发者追求少写样板代码。这些动机都正常。但安全不会因为动机正常就自动成立。
React2Shell 给出的现实约束很硬:
- 如果团队没有运行时校验习惯,类型系统越漂亮,误判越隐蔽。
- 如果框架协议缺少足够清晰的安全心智,开发者会把内部机制当成普通输入层。
- 如果企业只盯业务代码,不盯模板、脚手架和依赖链,漏洞会顺着工程化体系一起扩散。
接下来最该观察的,不是社交媒体上谁把漏洞说得更吓人。
要看三件实事:Meta 公告里的修复版本是否被主要框架及时吸收;Next.js 等生态项目如何说明受影响范围和升级路径;安全社区是否发现新的变体或绕过方式。
这三件事决定了它是一次被快速按住的高危事件,还是一次暴露 RSC 安全模型认知缺口的长期补课。
