2025 年,React 曝出了一个严重的安全漏洞(CVE-2025-55182)。攻击者可以通过构造恶意的 JSON 数据,在服务器上执行任意代码——想读你的配置文件?可以。想在你服务器上跑命令?也行。
然后,Cloudflare 挂了。
等等,React 的漏洞怎么把 Cloudflare 搞挂了?这就是今天要讲的故事。
先搞清楚几个概念
SSR 是什么
SSR 说白了就是:让服务器帮你把页面渲染好,再发给浏览器。
传统方式是浏览器下载一堆 JavaScript,然后自己慢慢渲染。问题是:
- 用户要等 JS 加载完才能看到内容
- 搜索引擎爬不到动态生成的内容,SEO 完蛋
SSR 解决了这两个问题,但也带来了新问题:你的前端代码现在跑在服务器上了。服务器能访问文件系统、能执行命令、能连数据库。一旦出漏洞,后果很严重。
Next.js 和 React 的关系
React 只是个 UI 库,Next.js 是 Vercel 基于 React 搞的全栈框架。
Next.js 把 React 的 SSR 能力包装得很好用,还搞了个叫 RSC 的东西,直接访问数据库。听起来很酷,但这也意味着攻击面变大了。
React 出漏洞,Next.js 跟着遭殃,用 Next.js 的网站全都有风险。
受影响的项目示例
比如使用量很大的统计开源软件 umami,如还在使用老版本,请尽快升级:
漏洞技术细节
新西兰安全研究员 Lachlan Davidson 发现,React Server Components 的 Flight Protocol 解析器根本不验证输入数据。
漏洞原理
这个协议会解析特定格式的数据,其中有一些特殊标记:
| 标记 | 含义 |
|---|---|
$@ |
代表 Promise 异步对象 |
$F |
代表服务端函数引用 |
$1, $2... |
内部引用标记 |
问题在于:解析器直接信任了所有输入,没有任何验证。攻击者可以通过构造特殊的 JSON,让解析器把恶意代码当成合法结构执行。
PoC 代码
Lachlan 公开了漏洞的 PoC:
查看核心攻击载荷
javascript
这段代码的精妙之处在于:
- 利用
$@标记:让解析器认为这是一个 Promise - 原型链污染:通过
constructor:constructor获取到Function构造器 - 代码注入:
_prefix字段的内容会被当作代码执行
攻击者只需要把 console.log(7*7+1) 换成 require('child_process').exec('rm -rf /') 就能删掉你的服务器。
攻击流程
一句话总结:React 信任了所有输入,然后爆炸了。
Cloudflare 怎么被牵连的
这才是最精彩的部分。让我们来看一条完美的因果链:
翻译成人话
- React 漏洞曝光了
- Cloudflare 想趁机宣传一波,发布针对 Next.js 的 WAF 防护
- 为了支持 Next.js 的大请求,要把缓存上限从 128KB 改到 1MB
- 结果发现测试工具不支持这个配置
- 于是决定跳过测试
- 跳过测试需要关掉规则引擎的一条子规则
- 关掉的瞬间,触发了一个 空指针异常
- Cloudflare 全球部分节点崩溃,互联网大面积瘫痪
如果 React 没出漏洞,后面这一串连锁反应根本不会发生。
问题出在哪
React:能力配不上野心
React Server Components 的理念很好——让组件在服务器上运行,减少客户端负担。但基本的输入验证都没做好就敢上线,属于典型的"功能先行,安全靠边"。
Flight Protocol 解析器应该:
- 验证所有
$开头的特殊标记 - 禁止通过原型链访问危险对象
- 对可执行内容做沙箱隔离
一个都没做。
Next.js:又蠢又坏
Next.js 把 React 的代码复制了一份到自己仓库里,而不是通过依赖引用。结果就是:
- React 发补丁,Next.js 要单独更新
- 补丁发布有时间差
- 用旧版本的项目可能永远收不到更新
社区内猜测可能是需要做定制化 React 做铺垫,咱不懂,咱也不说 🙊
Cloudflare:公式化草台班子
- 想蹭热度发新功能
- 测试工具不支持就跳过测试
- 跳过测试的方式是关规则引擎的子规则
- 关规则触发了没人知道的 Bug
- 然后挂了
这波操作堪称教科书级别的"怎么把小问题搞成大事故"。
时间线
所以呢
无论是能力赶不上野心的 React,还是又蠢又坏的 Next.js,亦或是公式化草台班子 Cloudflare
——我已经没什么好总结的了。
现在我就想问一句:
下一个傻子什么时候登场?
我已经新建好文件夹了。

