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/[email protected]
npm install @remix-run/[email protected]

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或更高版本,并在应用层校验请求头。
  • 及时更新依赖和加强请求头安全校验是防止此类漏洞的关键。

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

相关推荐
x66ccff27 分钟前
【github】主页显示star和fork
github
chenyuhao20241 小时前
链表的面试题4之合并有序链表
数据结构·链表·面试·c#
augenstern4161 小时前
webpack重构优化
前端·webpack·重构
海拥✘1 小时前
CodeBuddy终极测评:中国版Cursor的开发革命(含安装指南+HTML游戏实战)
前端·游戏·html
寧笙(Lycode)1 小时前
React系列——HOC高阶组件的封装与使用
前端·react.js·前端框架
asqq81 小时前
CSS 中的 ::before 和 ::after 伪元素
前端·css
拖孩2 小时前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
Hejjon2 小时前
Vue2 elementUI 二次封装命令式表单弹框组件
前端·vue.js
小堃学编程3 小时前
前端学习(3)—— CSS实现热搜榜
前端·学习
Wannaer3 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js