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

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

相关推荐
遇见~未来9 分钟前
JavaScript数组全解析:从本质到高级技巧
开发语言·前端·javascript
石像鬼₧魂石13 分钟前
80 端口(Web 服务)渗透测试完整总结(含踩坑 + 绕过 + 实战流程)
linux·运维·服务器·前端·网络·阿里云
爱学英语的程序员32 分钟前
让AI 帮我做了个个人博客(附提示词!)
人工智能·git·vue·github·node·个人博客
C_心欲无痕38 分钟前
nginx - 核心概念
运维·前端·nginx
开开心心_Every42 分钟前
安卓做菜APP:家常菜谱详细步骤无广简洁
服务器·前端·python·学习·edge·django·powerpoint
前端_Danny44 分钟前
用 ECharts markLine 实现节假日标注
前端·信息可视化·echarts
古城小栈1 小时前
Rust 丰富&好用的 格式化语法
前端·算法·rust
自燃人~1 小时前
实战都通用的 Watchdog 原理说明
redis·面试
丢,捞仔1 小时前
uni-app上架应用添加权限提示框
前端·javascript·uni-app
Glink1 小时前
从零开始编写自己的AI账单Agent
前端·agent·ai编程