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 是一道加法题:原型污染单独看是低危,不安全反序列化单独看是中危,两者接上就是远程代码执行。它提醒安全团队,逐个漏洞打分并不足够,还得评估漏洞之间能否被拼接——而组合面往往不在任何单条报告的评分里。

← 返回文章列表

评论

…