Vite 开发服务器任意文件读取漏洞分析
字数 2296 2025-08-29 22:41:10
Vite 开发服务器任意文件读取漏洞深度分析与防护指南
1. 漏洞概述
Vite 作为现代前端开发工具,近期披露了多个安全漏洞(CVE-2025-30208、CVE-2025-31125、CVE-2025-31486 和 CVE-2025-32395),这些漏洞暴露了 Vite 开发服务器在处理 URL 请求时存在路径验证不足的问题,可能导致攻击者读取服务器上的任意文件。
1.1 漏洞列表
| CVE编号 | 披露时间 | 问题描述 |
|---|---|---|
| CVE-2025-30208 | 2025-04-25 | 通过特定查询参数(?raw?? 或 ?import&raw??)绕过 @fs 文件访问限制 |
| CVE-2025-31125 | 2025-04-25 | 通过特殊构造URL绕过路径限制 |
| CVE-2025-31486 | 2025-04-25 | 通过.svg文件或相对路径绕过限制 |
| CVE-2025-32395 | 2025-04-25 | 使用'#'绕过路径穿越检查 |
2. 漏洞技术分析
2.1 核心问题
这些漏洞的核心在于 Vite 开发服务器在处理 URL 请求时,对路径和查询参数的验证不足:
- 路径穿越检查不充分
- 查询参数处理逻辑缺陷
- URL 解码/编码处理不当
- 特殊字符(#)处理问题
2.2 CVE-2025-30208 详细分析
漏洞原理:
Vite 使用 @fs 前缀允许开发模式下访问绝对路径文件,通过 ensureServingAccess() 函数检查请求是否在允许目录范围内。但处理查询参数时存在缺陷。
绕过方式:
GET /@fs/etc/passwd?raw??
或
GET /@fs/etc/passwd?import&raw??
技术细节:
- 第一个问号在
decodeURI时被移除 - 第二个问号在
removeImportQuery时被删除 - 导致正则检查失效,绕过安全限制
2.3 CVE-2025-31125 分析
利用方式:
通过 base64 编码和 wasm 文件特性绕过:
http://localhost:5173/@fs/C:/windows/win.ini?import&?inline=1.wasm?init
原理:
cleanUrl会清除?import&?inline=1.wasm?init内容- 通过
inline内联为 base64 字符串输出
2.4 CVE-2025-31486 分析
利用方式:
curl 'http://127.0.0.1:5173/etc/passwd?.svg?.wasm?init'
原理:
- 利用
.svg文件扩展名匹配正则\.svg(\?.*)?$ - 结合 wasm 初始化参数绕过
2.5 CVE-2025-32395 分析
利用方式:
curl --request-target /@fs/Users/doggy/Desktop/vite-project/etc/passwd http://127.0.0.1:5173
原理:
- Node.js 的
http.IncomingMessage对象保留#后内容 - Vite 路径匹配只检查
#前部分 - 导致
isFileLoadingAllowed检查被绕过
3. 漏洞复现环境搭建
3.1 环境准备
- 安装 Node.js 和 npm
- 创建测试项目目录
- 安装特定版本 Vite 和依赖:
npm install vite@4.5.9 @vitejs/plugin-vue@^4.0.0 vue@^3.2.47 --save-dev
3.2 配置文件
vite.config.js:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
server: {
fs: {
strict: false, // 故意设置为false以复现漏洞
allow: ['/path/to/allowed'] // 设置允许访问的目录
}
}
})
package.json 脚本:
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
}
}
3.3 启动开发服务器
npm run dev
4. 漏洞修复方案
4.1 官方修复措施
-
CVE-2025-30208:
- 改进正则表达式匹配,处理多个问号情况
- 使用
/\?+$/匹配n个问号结尾并替换为空
-
CVE-2025-31125:
- 加强对
inline和wasm参数的处理 - 严格限制 base64 编码输出
- 加强对
-
CVE-2025-31486:
- 完善
.svg文件扩展名检查 - 限制相对路径访问
- 完善
-
CVE-2025-32395:
- 正确处理
#字符的路径解析 - 完整路径验证而非仅检查
#前部分
- 正确处理
4.2 升级建议
立即升级到修复版本:
- Vite 5.4.6 或更高版本
- Vite 4.5.5 或更高版本(如使用Vite 4)
- Vite 3.2.11 或更高版本(如使用Vite 3)
4.3 临时缓解措施
- 生产环境禁用开发服务器
- 限制开发服务器访问IP
- 配置严格的
fs.allow规则 - 启用
fs.strict模式
// vite.config.js
export default defineConfig({
server: {
fs: {
strict: true,
allow: [
// 只允许特定目录
'/your/project/root',
// 必要时添加其他必要目录
'/node_modules'
]
}
}
})
5. 安全开发建议
-
最小权限原则:
- 严格限制开发服务器可访问的文件系统范围
- 避免使用
fs.strict: false
-
网络隔离:
- 开发服务器仅绑定本地接口(127.0.0.1)
- 避免将开发服务器暴露在公网
-
输入验证:
- 对所有URL路径和参数进行严格验证
- 实现多层防御机制
-
安全审计:
- 定期检查项目依赖的安全公告
- 使用自动化工具扫描漏洞
-
防御性编码:
- 处理路径时总是规范化(normalize)
- 考虑使用
path.resolve()而非字符串拼接
6. 历史相关漏洞参考
-
CVE-2022-35204:
- Vite < 2.9.13 目录遍历漏洞
- 通过编码路径绕过
fsServeRoot检查 - 修复:先解码URL进行
fs.allow检查,再重新编码
-
CVE-2024-45811:
- 通过
?import&raw绕过限制 - 影响版本:Vite < 3.2.11, < 4.5.5, < 5.2.14
- 修复:在
allow判断前增加rawRE正则检查
- 通过
7. 总结
Vite 开发服务器的这些文件读取漏洞揭示了现代前端工具在安全设计上的挑战。开发者在享受开发便利性的同时,必须:
- 保持工具链及时更新
- 理解安全配置选项的含义
- 遵循最小权限原则
- 避免将开发服务器暴露在不安全网络环境
- 定期审查项目安全状况
通过采取这些措施,可以显著降低因开发工具漏洞导致的安全风险。