什么是CVE-2025-31137漏洞?
CVE-2025-31137是一个影响React Router(7.0.0到7.4.0版本)和Remix框架(2.11.1到2.16.2版本)中Express适配器的安全漏洞。该漏洞允许攻击者通过伪造HTTP请求头中的Host
或X-Forwarded-Host
字段,插入恶意的URL路径,从而操控请求的URL,导致未授权的重定向或访问敏感资源
漏洞原理简述
-
Web服务器通常通过
Host
或X-Forwarded-Host
请求头获取访问的域名和端口。 -
漏洞在于代码未正确处理这些请求头中的"端口"部分,攻击者可以在端口位置插入路径字符串。
-
例如,伪造请求头:
textHost: victim.com:maliciousPath
这里的
maliciousPath
被错误地解析为URL路径,导致服务器错误地处理请求,可能绕过访问控制或触发缓存投毒等攻击
影响范围
- 影响所有使用Express适配器的React Router 7.x和Remix 2.x版本。
- 由于React Router每周下载量超过1300万次,影响范围广泛,可能波及大量线上应用
- 漏洞的CVSS评分为7.5(高危),攻击无需用户交互,易于远程利用,影响应用可用性和安全性
漏洞示例代码(简化版)
以下示例展示了受影响的代码逻辑,说明如何从请求头中解析端口,导致路径注入:
js
// 伪代码示意漏洞逻辑
const hostHeader = req.headers['host']; // e.g. "victim.com:maliciousPath"
const xForwardedHost = req.headers['x-forwarded-host']; // 优先级更高
// 取端口部分(冒号后面)
const hostPort = hostHeader && hostHeader.split(':')[1];
const xForwardedHostPort = xForwardedHost && xForwardedHost.split(':')[1];
// 选择第一个有效端口值作为路径处理
const hostnamePort = xForwardedHostPort || hostPort;
// 这里未对hostnamePort做合法性校验,导致路径注入
processRequestPath(hostnamePort);
攻击者可以利用上述逻辑,将恶意路径注入hostnamePort
,影响路由匹配和资源访问
如何防范和修复?
1. 升级依赖包
官方已发布补丁版本,修复了该漏洞:
包名 | 受影响版本 | 修复版本 |
---|---|---|
@react-router/express | 7.0.0 - 7.4.0 | 7.4.1 |
@remix-run/express | 2.11.1 - 2.16.2 | 2.16.3 |
升级命令示例:
bash
npm install @react-router/[email protected]
npm install @remix-run/[email protected]
2. 代码中增加请求头校验
在应用层增加中间件,验证Host
和X-Forwarded-Host
头部,只允许白名单中的域名和端口,避免恶意注入。
示例中间件(Express):
js
const allowedHosts = ['example.com', 'api.example.com'];
function validateHostHeader(req, res, next) {
const host = req.headers['host'] || '';
const xForwardedHost = req.headers['x-forwarded-host'] || '';
const checkHost = (header) => {
if (!header) return false;
// 只允许主机名部分,不允许路径或异常字符
const hostname = header.split(':')[0];
return allowedHosts.includes(hostname);
};
if (!checkHost(host) || (xForwardedHost && !checkHost(xForwardedHost))) {
return res.status(400).send('Invalid Host header');
}
next();
}
// 使用中间件
app.use(validateHostHeader);
3. 使用安全的缓存键设计
Vercel团队指出,他们通过将查询参数纳入缓存键,有效防止了基于_data
参数的缓存投毒攻击
演示案例
假设你有一个简单的Express服务器使用React Router Express适配器:
js
const express = require('express');
const { createRequestHandler } = require('@remix-run/express');
const app = express();
app.all(
'*',
createRequestHandler({
// Remix配置
})
);
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
若未升级,攻击者可发送如下请求:
text
GET / HTTP/1.1
Host: localhost:/maliciousPath
服务器可能错误地将/maliciousPath
作为请求路径处理,导致安全风险。
升级到补丁版本后,服务器会正确过滤和拒绝此类异常请求。
总结
- CVE-2025-31137是React Router和Remix Express适配器中的高危URL路径注入漏洞。
- 漏洞利用了
Host
和X-Forwarded-Host
请求头中端口部分未校验的缺陷。 - 影响广泛,可能导致未授权访问、重定向和缓存投毒。
- 解决方案是升级到React Router 7.4.1及Remix 2.16.3或更高版本,并在应用层校验请求头。
- 及时更新依赖和加强请求头安全校验是防止此类漏洞的关键。
请务必尽快升级相关依赖,保障应用安全稳定运行.