Vite任意文件读取bypass调试分析(CVE-2025-32395)
字数 1537 2025-08-29 22:41:01

Vite任意文件读取漏洞分析及绕过技术(CVE-2025-32395)

漏洞概述

在Vite开发服务器中发现一个严重的安全漏洞(CVE-2025-32395),该漏洞允许攻击者通过特制的HTTP请求读取服务器上的任意文件。当Vite服务器在Node.js或Bun环境下运行并暴露在网络上时,攻击者可以利用此漏洞绕过文件访问限制。

影响版本

  • 6.2.0 <= Vite <= 6.2.5
  • 6.1.0 <= Vite <= 6.1.4
  • 6.0.0 <= Vite <= 6.0.14
  • 5.0.0 <= Vite <= 5.4.17
  • Vite <= 4.5.12

漏洞原理

正常文件访问流程

  1. 请求处理流程

    • 请求首先由viteServePublicMiddleware处理
    • 然后进入viteTransformMiddleware进行转换处理
    • 最后到达viteServeRawFsMiddleware进行文件系统访问
  2. 安全检查机制

    • ensureServingAccess方法负责检查文件访问权限
    • isFileServingAllowedisFileLoadingAllowed方法进行具体验证
    • isUriInFilePath方法检查请求路径是否在允许的目录范围内

漏洞触发条件

攻击者可以通过在请求URL中包含#字符来绕过安全检查:

  1. new URL处理时会忽略#后面的内容
  2. 安全检查阶段只验证#前的内容
  3. 实际文件读取时却使用完整的原始URL

漏洞复现

环境搭建

  1. 从GitHub下载受影响版本的Vite源代码
  2. 使用WebStorm配置开发环境
  3. 在Windows环境下创建测试文件E:/tmp/flag.txt

攻击Payload

curl --request-target /@fs/Projects/vite-6.2.1/#/../../../../../tmp/flag.txt http://localhost:5173/

复现步骤

  1. 启动Vite开发服务器
  2. 使用上述curl命令发送恶意请求
  3. 服务器将返回E:/tmp/flag.txt文件内容

技术分析

绕过机制详解

  1. URL解析差异

    • 安全检查阶段:/@fs/Projects/vite-6.2.1/#后内容被忽略)
    • 文件读取阶段:完整路径/@fs/Projects/vite-6.2.1/#/../../../../../tmp/flag.txt
  2. 目录穿越

    • 安全检查认为请求的是允许目录下的文件
    • 实际读取时通过../实现目录穿越
  3. 绕过效果

    • 成功绕过ensureServingAccess的安全检查
    • 实现任意文件读取

与相关漏洞对比

  • CVE-2025-30208:使用?import绕过
  • CVE-2025-31125:读取无后缀文件绕过
  • CVE-2025-31486:虽然类似,但使用?import参数
  • 本漏洞(CVE-2025-32395):使用#实现更彻底的绕过

修复方案

官方在commit 3bb0883d22d59cfd901ff18f338e8b4bf11395f7中修复了此漏洞:

  1. 新增rejectInvalidRequestMiddleware中间件
  2. 检查URL中是否包含#字符
  3. 如果发现#字符,直接返回400错误

修复代码关键部分:

function rejectInvalidRequestMiddleware() {
  return (req, res, next) => {
    if (req.url.includes('#')) {
      res.statusCode = 400
      res.end()
      return
    }
    next()
  }
}

防护建议

  1. 立即升级到已修复的Vite版本
  2. 避免将开发服务器暴露在公共网络
  3. 在生产环境使用反向代理并配置适当的安全规则
  4. 定期检查服务器日志中的可疑请求

总结

该漏洞展示了URL解析差异如何导致安全绕过,攻击者通过精心构造包含#的URL,利用安全检查与实际文件读取阶段的处理不一致,成功实现任意文件读取。开发者在实现安全检查时应确保所有处理阶段的一致性,避免因解析差异导致的安全问题。

参考链接

Vite任意文件读取漏洞分析及绕过技术(CVE-2025-32395) 漏洞概述 在Vite开发服务器中发现一个严重的安全漏洞(CVE-2025-32395),该漏洞允许攻击者通过特制的HTTP请求读取服务器上的任意文件。当Vite服务器在Node.js或Bun环境下运行并暴露在网络上时,攻击者可以利用此漏洞绕过文件访问限制。 影响版本 6.2.0 <= Vite <= 6.2.5 6.1.0 <= Vite <= 6.1.4 6.0.0 <= Vite <= 6.0.14 5.0.0 <= Vite <= 5.4.17 Vite <= 4.5.12 漏洞原理 正常文件访问流程 请求处理流程 : 请求首先由 viteServePublicMiddleware 处理 然后进入 viteTransformMiddleware 进行转换处理 最后到达 viteServeRawFsMiddleware 进行文件系统访问 安全检查机制 : ensureServingAccess 方法负责检查文件访问权限 isFileServingAllowed 和 isFileLoadingAllowed 方法进行具体验证 isUriInFilePath 方法检查请求路径是否在允许的目录范围内 漏洞触发条件 攻击者可以通过在请求URL中包含 # 字符来绕过安全检查: new URL 处理时会忽略 # 后面的内容 安全检查阶段只验证 # 前的内容 实际文件读取时却使用完整的原始URL 漏洞复现 环境搭建 从GitHub下载受影响版本的Vite源代码 使用WebStorm配置开发环境 在Windows环境下创建测试文件 E:/tmp/flag.txt 攻击Payload 复现步骤 启动Vite开发服务器 使用上述curl命令发送恶意请求 服务器将返回 E:/tmp/flag.txt 文件内容 技术分析 绕过机制详解 URL解析差异 : 安全检查阶段: /@fs/Projects/vite-6.2.1/ ( # 后内容被忽略) 文件读取阶段:完整路径 /@fs/Projects/vite-6.2.1/#/../../../../../tmp/flag.txt 目录穿越 : 安全检查认为请求的是允许目录下的文件 实际读取时通过 ../ 实现目录穿越 绕过效果 : 成功绕过 ensureServingAccess 的安全检查 实现任意文件读取 与相关漏洞对比 CVE-2025-30208 :使用 ?import 绕过 CVE-2025-31125 :读取无后缀文件绕过 CVE-2025-31486 :虽然类似,但使用 ?import 参数 本漏洞(CVE-2025-32395):使用 # 实现更彻底的绕过 修复方案 官方在commit 3bb0883d22d59cfd901ff18f338e8b4bf11395f7 中修复了此漏洞: 新增 rejectInvalidRequestMiddleware 中间件 检查URL中是否包含 # 字符 如果发现 # 字符,直接返回400错误 修复代码关键部分: 防护建议 立即升级到已修复的Vite版本 避免将开发服务器暴露在公共网络 在生产环境使用反向代理并配置适当的安全规则 定期检查服务器日志中的可疑请求 总结 该漏洞展示了URL解析差异如何导致安全绕过,攻击者通过精心构造包含 # 的URL,利用安全检查与实际文件读取阶段的处理不一致,成功实现任意文件读取。开发者在实现安全检查时应确保所有处理阶段的一致性,避免因解析差异导致的安全问题。 参考链接 CVE-2025-32395详情 官方修复commit