React Router和Remix中的CVE-2025-31137漏洞详解与修复指南

什么是CVE-2025-31137漏洞?

CVE-2025-31137是一个影响React Router(7.0.0到7.4.0版本)和Remix框架(2.11.1到2.16.2版本)中Express适配器的安全漏洞。该漏洞允许攻击者通过伪造HTTP请求头中的HostX-Forwarded-Host字段,插入恶意的URL路径,从而操控请求的URL,导致未授权的重定向或访问敏感资源

漏洞原理简述

  • Web服务器通常通过HostX-Forwarded-Host请求头获取访问的域名和端口。

  • 漏洞在于代码未正确处理这些请求头中的"端口"部分,攻击者可以在端口位置插入路径字符串。

  • 例如,伪造请求头:

    text 复制代码
    Host: 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/express@7.4.1
npm install @remix-run/express@2.16.3

2. 代码中增加请求头校验

在应用层增加中间件,验证HostX-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路径注入漏洞。
  • 漏洞利用了HostX-Forwarded-Host请求头中端口部分未校验的缺陷。
  • 影响广泛,可能导致未授权访问、重定向和缓存投毒。
  • 解决方案是升级到React Router 7.4.1及Remix 2.16.3或更高版本,并在应用层校验请求头。
  • 及时更新依赖和加强请求头安全校验是防止此类漏洞的关键。

请务必尽快升级相关依赖,保障应用安全稳定运行.

相关推荐
zhanshuo6 分钟前
不依赖框架,如何用 JS 实现一个完整的前端路由系统
前端·javascript·html
火柴盒zhang7 分钟前
websheet在线电子表格(spreadsheet)在集团型企业财务报表中的应用
前端·html·报表·合并·spreadsheet·websheet·集团财务
khalil9 分钟前
基于 Vue3实现一款简历生成工具
前端·vue.js
拾光拾趣录15 分钟前
浏览器对队头阻塞问题的深度优化策略
前端·浏览器
用户81221993672216 分钟前
[已完结]后端开发必备高阶技能--自研企业级网关组件(Netty+Nacos+Disruptor)
前端
万少20 分钟前
2025中了 聊一聊程序员为什么都要做自己的产品
前端·harmonyos
寻月隐君41 分钟前
Rust 网络编程实战:用 Tokio 手写一个迷你 TCP 反向代理 (minginx)
后端·rust·github
程序员爱钓鱼1 小时前
Go 语言泛型 — 泛型语法与示例
后端·面试·go
喜欢吃豆2 小时前
快速手搓一个MCP服务指南(九): FastMCP 服务器组合技术:构建模块化AI应用的终极方案
服务器·人工智能·python·深度学习·大模型·github·fastmcp
abigale032 小时前
webpack+vite前端构建工具 -11实战中的配置技巧
前端·webpack·node.js