Vite 任意文件读取漏洞(CVE-2025-30208)
字数 1354 2025-08-29 22:41:32

Vite 任意文件读取漏洞(CVE-2025-30208) 深度分析与教学文档

漏洞概述

Vite 是一个现代前端构建工具,为Web项目提供快速、精简的开发体验。该工具主要由两部分组成:

  1. 具有热模块替换(HMR)功能的开发服务器
  2. 使用Rollup打包代码的构建命令

在Vite 6.2.3、6.1.2、6.0.12、5.4.15和4.5.10之前的版本中,存在一个严重的安全漏洞,允许攻击者绕过server.fs.deny限制,读取文件系统上的任意文件。

漏洞编号

  • CVE编号: CVE-2025-30208
  • GitHub Advisory: GHSA-x574-m823-4x7w

影响版本

  • Vite < 6.2.3
  • Vite < 6.1.2
  • Vite < 6.0.12
  • Vite < 5.4.15
  • Vite < 4.5.10

漏洞原理

正常访问控制机制

Vite使用server.fs.allow机制控制允许访问的目录范围,主要涉及三个关键函数:

  1. isFileServingAllowed: 判断URL是否允许被Vite服务器访问
  2. isFileLoadingAllowed: 检查文件路径是否符合Vite的文件访问规则
  3. ensureServingAccess: 处理HTTP请求,如果文件不被允许访问则返回403

漏洞利用方式

攻击者可以通过在URL的@fs前缀后增加?raw???import&raw??参数,绕过文件访问限制。例如:

/@fs/path/to/sensitive/file?raw??
或
/@fs/path/to/sensitive/file?import&raw??

技术细节

  1. 正则匹配绕过:

    • 漏洞版本的正则匹配模式位于packages/vite/src/node/utils.ts
    • 通过添加?raw???import&raw??参数,攻击者首先成功通过正则匹配
    • 当URL被输入ensureServingAccess时,系统会判定这不是系统文件,从而绕过两个安全检查
  2. 修复方案:

    • 在正则匹配之前使用urlWithoutTrailingQuerySeparators方法处理URL
    • 权限检测现在基于urlWithoutTrailingQuerySeparators处理后的文件路径
    • 新增了对trailingQuerySeparatorsRE的处理

环境搭建

  1. 安装受影响版本的Vite:

    npm install vite@6.2.2  # 明确指定漏洞版本
    
  2. 创建测试项目结构:

    project/
    ├── src/
    │   └── main.js
    ├── vite.config.js
    └── sensitive.txt
    
  3. 配置vite.config.js:

    export default {
      server: {
        fs: {
          allow: ['.'],  // 仅允许访问项目根目录
          deny: ['../']  // 禁止访问上级目录
        }
      }
    }
    

漏洞复现步骤

  1. 启动Vite开发服务器:

    npx vite
    
  2. 尝试正常访问受限文件(应失败):

    http://localhost:5173/@fs/path/to/sensitive/file
    
  3. 使用漏洞payload访问(成功读取):

    http://localhost:5173/@fs/path/to/sensitive/file?raw??
    或
    http://localhost:5173/@fs/path/to/sensitive/file?import&raw??
    

漏洞修复方案

  1. 升级到安全版本:

    npm install vite@latest
    
  2. 关键修复点:

    • 引入urlWithoutTrailingQuerySeparators方法处理URL
    • 修改正则匹配逻辑,正确处理查询参数
    • 权限检测基于处理后的URL路径
  3. 修复代码diff:

    + const urlWithoutTrailingQuerySeparators = (url: string) => {
    +   return url.replace(trailingQuerySeparatorsRE, '')
    + }
    
    - const isFileServingAllowed = (url: string) => {
    + const isFileServingAllowed = (rawUrl: string) => {
    +   const url = urlWithoutTrailingQuerySeparators(rawUrl)
    

防御建议

  1. 立即升级Vite到最新安全版本
  2. 在生产环境中限制Vite开发服务器的访问
  3. 使用防火墙规则限制开发服务器的网络暴露
  4. 定期审查项目依赖的安全公告

参考资源

  1. 官方修复commit: vitejs/vite@f234b574
  2. GitHub Advisory: GHSA-x574-m823-4x7w
  3. EXP利用代码: ThumpBo/CVE-2025-30208-EXP
Vite 任意文件读取漏洞(CVE-2025-30208) 深度分析与教学文档 漏洞概述 Vite 是一个现代前端构建工具,为Web项目提供快速、精简的开发体验。该工具主要由两部分组成: 具有热模块替换(HMR)功能的开发服务器 使用Rollup打包代码的构建命令 在Vite 6.2.3、6.1.2、6.0.12、5.4.15和4.5.10之前的版本中,存在一个严重的安全漏洞,允许攻击者绕过 server.fs.deny 限制,读取文件系统上的任意文件。 漏洞编号 CVE编号: CVE-2025-30208 GitHub Advisory: GHSA-x574-m823-4x7w 影响版本 Vite < 6.2.3 Vite < 6.1.2 Vite < 6.0.12 Vite < 5.4.15 Vite < 4.5.10 漏洞原理 正常访问控制机制 Vite使用 server.fs.allow 机制控制允许访问的目录范围,主要涉及三个关键函数: isFileServingAllowed : 判断URL是否允许被Vite服务器访问 isFileLoadingAllowed : 检查文件路径是否符合Vite的文件访问规则 ensureServingAccess : 处理HTTP请求,如果文件不被允许访问则返回403 漏洞利用方式 攻击者可以通过在URL的 @fs 前缀后增加 ?raw?? 或 ?import&raw?? 参数,绕过文件访问限制。例如: 技术细节 正则匹配绕过 : 漏洞版本的正则匹配模式位于 packages/vite/src/node/utils.ts 通过添加 ?raw?? 或 ?import&raw?? 参数,攻击者首先成功通过正则匹配 当URL被输入 ensureServingAccess 时,系统会判定这不是系统文件,从而绕过两个安全检查 修复方案 : 在正则匹配之前使用 urlWithoutTrailingQuerySeparators 方法处理URL 权限检测现在基于 urlWithoutTrailingQuerySeparators 处理后的文件路径 新增了对 trailingQuerySeparatorsRE 的处理 环境搭建 安装受影响版本的Vite: 创建测试项目结构: 配置 vite.config.js : 漏洞复现步骤 启动Vite开发服务器: 尝试正常访问受限文件(应失败): 使用漏洞payload访问(成功读取): 漏洞修复方案 升级到安全版本: 关键修复点: 引入 urlWithoutTrailingQuerySeparators 方法处理URL 修改正则匹配逻辑,正确处理查询参数 权限检测基于处理后的URL路径 修复代码diff: 防御建议 立即升级Vite到最新安全版本 在生产环境中限制Vite开发服务器的访问 使用防火墙规则限制开发服务器的网络暴露 定期审查项目依赖的安全公告 参考资源 官方修复commit: vitejs/vite@f234b574 GitHub Advisory: GHSA-x574-m823-4x7w EXP利用代码: ThumpBo/CVE-2025-30208-EXP