Vite任意文件读取漏洞CVE-2025-30208
前言
Vite 是一款高效的现代化前端构建工具,也就是vue,React等创建项目的时候,会添加vite进行构建。

漏洞描述
Vite 在版本 6.2.3、6.1.2、6.0.12、5.4.15 和 4.5.10 之前的版本中存在一个安全漏洞。该漏洞与 @fs 模块有关,它原本用于限制对 Vite 服务允许列表之外文件的访问。然而,通过在 URL 后添加 “?raw??” 或 “?import&raw??”,可以绕过这一限制并返回文件内容(如果文件存在的话)。这是因为尾部的分隔符如 “?” 在多个地方被移除,但没有在查询字符串的正则表达式中考虑到这种情况。这导致任意文件的内容可能会被返回到浏览器中。
漏洞前提
即使用了 --host 参数或 server.host 配置选项的应用
补充
–host 参数的作用是在本地研发阶段进行测试使用也就是可以使用localhost访问自己服务
一般添加在package.json当中

受影响的版本
6.2.0 <= vite < 6.2.3
6.1.0 <= vite < 6.1.2
6.0.0 <= vite < 6.0.12
5.0.0 <= vite < 5.4.15
vite < 4.5.10
环境搭建
我采取的是node 21.6.2版本,vite6.2.0
漏洞复现
漏洞过程很简单,只不过搞清楚一下他的流程和修复代码,界面不用管,这只是一个我的毕设

默认情况下你可以看浏览器图标,有的情况下,比较懒,vite的图标就会显示在上面

如果你访问一个文件夹就会返回500,并且他的日志会进行记录

当然也包括访问不存在的文件的情况下

唯一一个比较好的好处就是他不会记录ip,前端的一个弊端,除非特意做了这样的处理

如果你拼接处的是有效路径他就会返回文件中的内容到界面当中
漏洞分析
根据官方给的版本,6.2.3是已经修复后的,所以我们拿6.2.3和6.2.1进行比较
最为明显的是下面一系列代码

删掉了一部分代码,新增加了一部分代码
处理情况下是对URL进行了处理,但具体处理了什么?
(rawRE.test(url) || urlRE.test(url)) &&
!ensureServingAccess(url, server, res, next)
删除的这段代码,是对应的--host部分,让其在服务器上可以访问到自己,看是否符合特定模式
新增加的代码,我们先融合
const trailingQuerySeparatorsRE = /[?&]+$/
const urlWithoutTrailingQuerySeparators = url.replace(
trailingQuerySeparatorsRE,
'',
)
(rawRE.test(urlWithoutTrailingQuerySeparators) ||
urlRE.test(urlWithoutTrailingQuerySeparators)) &&
!ensureServingAccess(
urlWithoutTrailingQuerySeparators,
server,
res,
next,
)
trailingQuerySeparatorsRE是一个正则匹配,匹配 URL 字符串尾部的一个或多个查询分隔符(即 ? 或 &),现在就很明确,?import&raw??,是为了拦截这部分的符号
url.replace(trailingQuerySeparatorsRE, ‘’) 是为了拦截分隔符
比如,url 为 example.com/page?¶m=value& 时,urlWithoutTrailingQuerySeparators 会变成 example.com/page?param=value,去掉了尾部多余的 & 和 ?。
rawRE.test(urlWithoutTrailingQuerySeparators) || urlRE.test(urlWithoutTrailingQuerySeparators)部分
这里 rawRE 和 urlRE 是两个正则表达式,用于检测 urlWithoutTrailingQuerySeparators 是否匹配某些特定的 URL 模式。
rawRE.test(urlWithoutTrailingQuerySeparators),检查是否是原始资源,比如CSS,HTML,JS等
urlRE.test(urlWithoutTrailingQuerySeparators),检查是否是请求还是图片等等
ensureServingAccess 函数用于检查 urlWithoutTrailingQuerySeparators 是否可以在服务器上访问。它会验证,也就是会出现Internal server error: ENOENT: no such file or directory等问题或者是返回成功
修复方案
升级:https://github.com/vitejs/vite/releases
临时缓解方案
部署对应项目:拦截“?import&raw??” 的外部用户请求
参考链接
返回成功
修复方案
升级:https://github.com/vitejs/vite/releases
临时缓解方案
部署对应项目:拦截“?import&raw??” 的外部用户请求
参考链接
https://avd.aliyun.com/detail?id=AVD-2025-30208×tamp__1384=CuGQDILGOGCDkDl1%2BG7KD8FdWoNBjeD
2068

被折叠的 条评论
为什么被折叠?



