环境搭建:
docker-compose.yml
1 | services: |
访问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 | curl http://ip:5173/@fs/etc/passwd?import?.svg?.wasm?init |
