从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 - 绕过原理:
- URL 预处理会解码 URL 并移除第一个
?或#到末尾的内容 doTransform方法开头再次调用removeTimestampQuery移除第二个?- 最终处理的 URL 仍为
/@fs/C:/windows/win.ini?raw,符合raw语法
- URL 预处理会解码 URL 并移除第一个
修复方案
引入 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&rawensureServingAccess中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 版本
- 限制项目目录外的文件访问
- 对特殊语法处理进行严格的输入验证
- 实现统一的资源访问控制机制