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
漏洞原理
正常文件访问流程
-
请求处理流程:
- 请求首先由
viteServePublicMiddleware处理 - 然后进入
viteTransformMiddleware进行转换处理 - 最后到达
viteServeRawFsMiddleware进行文件系统访问
- 请求首先由
-
安全检查机制:
ensureServingAccess方法负责检查文件访问权限isFileServingAllowed和isFileLoadingAllowed方法进行具体验证isUriInFilePath方法检查请求路径是否在允许的目录范围内
漏洞触发条件
攻击者可以通过在请求URL中包含#字符来绕过安全检查:
new URL处理时会忽略#后面的内容- 安全检查阶段只验证
#前的内容 - 实际文件读取时却使用完整的原始URL
漏洞复现
环境搭建
- 从GitHub下载受影响版本的Vite源代码
- 使用WebStorm配置开发环境
- 在Windows环境下创建测试文件
E:/tmp/flag.txt
攻击Payload
curl --request-target /@fs/Projects/vite-6.2.1/#/../../../../../tmp/flag.txt http://localhost:5173/
复现步骤
- 启动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错误
修复代码关键部分:
function rejectInvalidRequestMiddleware() {
return (req, res, next) => {
if (req.url.includes('#')) {
res.statusCode = 400
res.end()
return
}
next()
}
}
防护建议
- 立即升级到已修复的Vite版本
- 避免将开发服务器暴露在公共网络
- 在生产环境使用反向代理并配置适当的安全规则
- 定期检查服务器日志中的可疑请求
总结
该漏洞展示了URL解析差异如何导致安全绕过,攻击者通过精心构造包含#的URL,利用安全检查与实际文件读取阶段的处理不一致,成功实现任意文件读取。开发者在实现安全检查时应确保所有处理阶段的一致性,避免因解析差异导致的安全问题。