React Router 原型污染链式 RCE:CVE-2026-42211 分析
turbo-stream v2 在 TYPE_ERROR 分支里动态调用构造函数却不校验来源。只要应用里已存在一个原型污染,这条路径就能被接上 Function,把两步中危拼成 RCE。
概述
| 项目 | 详情 |
|---|---|
| CVE 编号 | CVE-2026-42211 |
| CVSS | 8.1(High) |
| CWE | CWE-502 不可信数据反序列化 |
| 影响版本 | React Router 7.0.0 ~ 7.14.1(仅 Framework Mode) |
| 修复版本 | 7.14.2 |
| 披露时间 | 2026-06-03 |
| 利用状态 | 暂无公开在野利用 |
React Router 是 React 生态里使用最广的路由库,每周下载量超过 1.2 亿次。2026 年 6 月 3 日披露的这个漏洞有个关键特点:它无法单独触发,需要「原型污染 + 不安全反序列化」两步链式配合。
更值得警惕的是影响面。Framework Mode 是官方推荐的默认模式,意味着 2024 年 10 月之后创建的多数 React 全栈项目天然开启了这条攻击面。漏洞披露后它一度升到 CVE Intruder 全球热门漏洞榜首位。
被怎么发现的
GitHub 安全实验室的研究员 @securityMB 在审计 Framework Mode 内嵌的 turbo-stream v2 序列化库时发现了问题。
正常逻辑下,TYPE_ERROR 的反序列化只会重建一个 TypeError 对象。但该分支会动态调用构造函数来水合数据,且不校验构造函数的来源。于是只要攻击者能向 Error.prototype 链注入属性——通过应用里任意一个独立的原型污染漏洞——预期的构造函数就能被替换成环境里的任意构造函数,例如 Function。
而 Function 构造函数在接收字符串参数时可以直接执行 JavaScript。链子的最后一环就此闭合。
复现过程
以下内容仅用于授权安全测试。
环境用官方脚手架搭一个受影响版本:
npx create-react-router@7.14.1 vulnerable-app
cd vulnerable-app && npm install && npm run dev
第一步:制造前置的原型污染。 实验室里用一段不安全的深度合并来模拟真实场景中 jQuery 或旧版 lodash 的遗留问题:
function deepMerge(t, s) {
for (const key in s) {
if (typeof s[key] === 'object' && s[key] !== null) {
t[key] = t[key] || {};
deepMerge(t[key], s[key]);
} else {
t[key] = s[key];
}
}
}
它会把 __proto__ 和 constructor.prototype 当成普通键一路写下去,这正是污染的入口。
第二步:触发反序列化。 污染生效后,向 Framework Mode 的数据端点发送携带特制 turbo-stream 数据的请求,让处理流程走进 TYPE_ERROR 分支。此时被污染的构造函数取代了预期类型,Function 被调用,传入的字符串即代码。公开的 PoC 脚本用 Python 把这套结构拼出来后,只需一条命令即可验证:
python3 poc_cve_2026_42211.py "id"
第三步:确认结果。 期望看到的是服务进程身份的输出(例如 uid=1000(node) ...),说明代码确实在服务端执行而非在响应里伪造。
修复方案
官方修复版本是 7.14.2,补丁移除了未文档化的自定义错误序列化逻辑,从源头掐断了这条链:
npm install react-router@7.14.2
npm list react-router
不能立即升级时,可以退到声明式模式(<BrowserRouter>)或数据模式(createBrowserRouter / <RouterProvider>),这两种模式不受影响,同时收紧 Framework Mode 端点的外部可达性。
最后一件事是排查原型污染本身。用依赖扫描盯住所有对象深度合并路径($.extend(true, ...)、_.merge 一类),并在合并前显式拦掉 __proto__、constructor、prototype——这条链的前置条件不消除,同类问题还会以别的形式回来。
总结
CVE-2026-42211 是一道加法题:原型污染单独看是低危,不安全反序列化单独看是中危,两者接上就是远程代码执行。它提醒安全团队,逐个漏洞打分并不足够,还得评估漏洞之间能否被拼接——而组合面往往不在任何单条报告的评分里。

评论
…