Vite-CVE-2025-30208漏洞复现与漏洞分析

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, ‘’) 是为了拦截分隔符

比如,urlexample.com/page?&param=value& 时,urlWithoutTrailingQuerySeparators 会变成 example.com/page?param=value,去掉了尾部多余的 &?

rawRE.test(urlWithoutTrailingQuerySeparators) || urlRE.test(urlWithoutTrailingQuerySeparators)部分

这里 rawREurlRE 是两个正则表达式,用于检测 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&timestamp__1384=CuGQDILGOGCDkDl1%2BG7KD8FdWoNBjeD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值