从CVE-2025-30208到CVE-2025-31125再到CVE-2025-31486
字数 1944 2025-08-30 06:50:36

Vite 任意文件读取漏洞系列分析

漏洞概述

本文详细分析 Vite 构建工具中一系列任意文件读取漏洞(CVE-2025-30208、CVE-2025-31125、CVE-2025-31486)的技术细节,包括漏洞原理、利用方式和修复方案。

CVE-2025-30208:绕过 raw 语法限制

背景

CVE-2025-30208 是历史漏洞 CVE-2024-45811 的绕过。CVE-2024-45811 的核心在于 Vite 的静态资源处理机制中,raw 语法可以将资源文件内容原样返回。

CVE-2024-45811 原始漏洞

  • POC: /@fs/C:/windows/win.ini?raw
  • 原理: 使用 raw 语法直接读取文件内容
  • 修复方案: 使用 rawRE 正则匹配 URL,满足条件则调用 ensureServingAccess 验证文件是否在允许范围内

绕过方式 (CVE-2025-30208)

  • POC: /@fs/C:/windows/win.ini??raw
  • 绕过原理:
    1. URL 预处理会解码 URL 并移除第一个 ?# 到末尾的内容
    2. doTransform 方法开头再次调用 removeTimestampQuery 移除第二个 ?
    3. 最终处理的 URL 仍为 /@fs/C:/windows/win.ini?raw,符合 raw 语法

修复方案

引入 trailingQuerySeparatorsRE 正则,移除 URL 后面多余的连续 ?&

CVE-2025-31125:利用 inline 和 wasm 语法

漏洞原理

发现新的文件读取方法,通过 inline.wasm?init 语法获取文件内容的 base64 编码。

关键技术点

  1. inline 语法:

    • 文档说明:添加 inline 可将文件内容作为静态资源内嵌
    • 示例: import stuff from './foo.js?inline'
  2. WebAssembly 语法:

    • .wasm?init 结尾可返回文件内容的 base64 编码

漏洞利用

  • POC: /@fs/C:/windows/win.ini?inline&wasm?init
  • 执行流程:
    1. wasmHelperPlugin 只检查 URL 是否以 .wasm?init 结尾
    2. fileToDevUrl 方法检查 /[?&]inline\b/ 正则
    3. cleanUrl 移除参数部分,最终文件路径为 C:/Windows/win.ini

修复方案

对满足 inline 语法的 URL 调用 ensureServingAccess 进行验证。

CVE-2025-31486:双重绕过技术

第一种绕过:利用 SVG 内联

  • POC: /@fs/C:/windows/win.ini.svg
  • 原理:
    1. 满足 svgExtRE 正则
    2. 通过 shouldInline 方法检查
    3. 限制:文件大小需小于 build.assetsInlinelimit(默认 4kB)

第二种绕过:绕过 ensureServingAccess 校验

  • POC: /@fs/C:/windows/win.ini?import&raw
  • 执行流程:
    1. trailingQuerySeparatorsRE 处理后 URL 为 /@fs/C:/path/to/project/windows/win.ini?import&raw
    2. ensureServingAccesscleanUrl 处理后为 /@fs/C:/path/to/project/(项目根路径)
    3. 通过目录合法性校验
    4. 实际处理时使用原始 URL,最终得到 C:/windows/win.ini?raw

技术总结

  1. 漏洞演变路径:

    • CVE-2024-45811: 原始 raw 语法漏洞
    • CVE-2025-30208: 通过双重问号绕过修复
    • CVE-2025-31125: 发现 inline 和 wasm 新向量
    • CVE-2025-31486: SVG 内联和校验绕过
  2. 关键防御点:

    • 严格的 URL 解析和规范化
    • 资源访问权限的全面校验
    • 特殊语法处理的边界条件检查
  3. 经验教训:

    • 补丁需要考虑全局影响,避免局部修复
    • 多种资源处理方式需要统一的安全检查
    • URL 解析和规范化是安全的关键环节

防御建议

  1. 及时更新到修复了这些漏洞的 Vite 版本
  2. 限制项目目录外的文件访问
  3. 对特殊语法处理进行严格的输入验证
  4. 实现统一的资源访问控制机制
Vite 任意文件读取漏洞系列分析 漏洞概述 本文详细分析 Vite 构建工具中一系列任意文件读取漏洞(CVE-2025-30208、CVE-2025-31125、CVE-2025-31486)的技术细节,包括漏洞原理、利用方式和修复方案。 CVE-2025-30208:绕过 raw 语法限制 背景 CVE-2025-30208 是历史漏洞 CVE-2024-45811 的绕过。CVE-2024-45811 的核心在于 Vite 的静态资源处理机制中, raw 语法可以将资源文件内容原样返回。 CVE-2024-45811 原始漏洞 POC : /@fs/C:/windows/win.ini?raw 原理 : 使用 raw 语法直接读取文件内容 修复方案 : 使用 rawRE 正则匹配 URL,满足条件则调用 ensureServingAccess 验证文件是否在允许范围内 绕过方式 (CVE-2025-30208) POC : /@fs/C:/windows/win.ini??raw 绕过原理 : URL 预处理会解码 URL 并移除第一个 ? 或 # 到末尾的内容 doTransform 方法开头再次调用 removeTimestampQuery 移除第二个 ? 最终处理的 URL 仍为 /@fs/C:/windows/win.ini?raw ,符合 raw 语法 修复方案 引入 trailingQuerySeparatorsRE 正则,移除 URL 后面多余的连续 ? 和 & 。 CVE-2025-31125:利用 inline 和 wasm 语法 漏洞原理 发现新的文件读取方法,通过 inline 和 .wasm?init 语法获取文件内容的 base64 编码。 关键技术点 inline 语法 : 文档说明:添加 inline 可将文件内容作为静态资源内嵌 示例: import stuff from './foo.js?inline' WebAssembly 语法 : 以 .wasm?init 结尾可返回文件内容的 base64 编码 漏洞利用 POC : /@fs/C:/windows/win.ini?inline&wasm?init 执行流程 : wasmHelperPlugin 只检查 URL 是否以 .wasm?init 结尾 fileToDevUrl 方法检查 /[?&]inline\b/ 正则 cleanUrl 移除参数部分,最终文件路径为 C:/Windows/win.ini 修复方案 对满足 inline 语法的 URL 调用 ensureServingAccess 进行验证。 CVE-2025-31486:双重绕过技术 第一种绕过:利用 SVG 内联 POC : /@fs/C:/windows/win.ini.svg 原理 : 满足 svgExtRE 正则 通过 shouldInline 方法检查 限制:文件大小需小于 build.assetsInlinelimit (默认 4kB) 第二种绕过:绕过 ensureServingAccess 校验 POC : /@fs/C:/windows/win.ini?import&raw 执行流程 : trailingQuerySeparatorsRE 处理后 URL 为 /@fs/C:/path/to/project/windows/win.ini?import&raw ensureServingAccess 中 cleanUrl 处理后为 /@fs/C:/path/to/project/ (项目根路径) 通过目录合法性校验 实际处理时使用原始 URL,最终得到 C:/windows/win.ini?raw 技术总结 漏洞演变路径 : CVE-2024-45811: 原始 raw 语法漏洞 CVE-2025-30208: 通过双重问号绕过修复 CVE-2025-31125: 发现 inline 和 wasm 新向量 CVE-2025-31486: SVG 内联和校验绕过 关键防御点 : 严格的 URL 解析和规范化 资源访问权限的全面校验 特殊语法处理的边界条件检查 经验教训 : 补丁需要考虑全局影响,避免局部修复 多种资源处理方式需要统一的安全检查 URL 解析和规范化是安全的关键环节 防御建议 及时更新到修复了这些漏洞的 Vite 版本 限制项目目录外的文件访问 对特殊语法处理进行严格的输入验证 实现统一的资源访问控制机制