Vite's server.fs.deny bypassed with /. for files under project root
Published 30 Apr 2025 · Updated 10 Sept 2026
Affected packages
- Affected
- >=6.3.0 <6.3.4
- Fixed in
- 6.3.4
npm install vite@6.3.4- Affected
- >=6.2.0 <6.2.7
- Fixed in
- 6.2.7
npm install vite@6.2.7- Affected
- >=6.0.0 <6.1.6
- Fixed in
- 6.1.6
npm install vite@6.1.6- Affected
- >=5.0.0 <5.4.19
- Fixed in
- 5.4.19
npm install vite@5.4.19- Affected
- <4.5.14
- Fixed in
- 4.5.14
npm install vite@4.5.14Details
Summary
The contents of files in the project `root` that are denied by a file matching pattern can be returned to the browser.
Impact
Only apps explicitly exposing the Vite dev server to the network (using --host or server.host config option) are affected. Only files that are under project `root` and are denied by a file matching pattern can be bypassed.
- Examples of file matching patterns:
.env,.env.*,*.{crt,pem},**/.env - Examples of other patterns:
**/.git/**,.git/**,.git/**/*
Details
`server.fs.deny` can contain patterns matching against files (by default it includes .env, .env.*, *.{crt,pem} as such patterns).
These patterns were able to bypass for files under root by using a combination of slash and dot (/.).
PoC
npm create vite@latest cd vite-project/ cat "secret" > .env npm install npm run dev curl --request-target /.env/. http://localhost:5173
Is GHSA-859w-5945-r5v3 in any of your client repos?
Checking one package by hand is fine. Checking it across forty client projects is not. NPMscan reads the lockfiles in every GitHub repo you pick, finds each project with an affected vite, and gives you the command that fixes it.
References
Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.