Vite: Files outside `server.fs.allow` could be served when project paths match system paths on non-Windows machine
What fixes it
- 8.3.3vite, npmGitHub
npm install vite@8.3.3 - 8.2.4vite, npmGitHub
npm install vite@8.2.4 - 8.1.6vite, npmGitHub
npm install vite@8.1.6 - 7.3.7vite, npmGitHub
npm install vite@7.3.7 - 6.4.4vite, npmGitHub
npm install vite@6.4.4 - 1.1.0vite-plus, npmGitHub
npm install vite-plus@1.1.0
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
Summary
The content of files outside server.fs setting can be returned to the browser if the project imports a file path concatenated with the root. For example, if the project references <path-to-project-root>/etc/hosts, the content of /etc/hosts was possible to be returned.
The content of files outside the server.fs.allow option can be returned to the browser when a project imports a file whose root-relative path matches an absolute path on the host. For example, referencing <project-root>/etc/hosts could make Vite return the host's /etc/hosts file.
Impact
Only apps that meet all of the following conditions are affected:
- explicitly expose the Vite dev server to the network (using
--hostor the [server.hostoption](https://vite.dev/config/server-options#server-host)) - contain an imported file whose root-relative browser URL is also the absolute path of a readable file on the host
- The sensitive file is not matched by [
server.fs.deny](https://vite.dev/config/server-options#server-fs-deny) - the dev server is not running on Windows
Details
When Vite analyzes an in-root import, it rewrites the resolved module ID to a browser URL such as /etc/hostname. In affected versions, Vite converts that URL with fsPathFromUrl and adds the result to safeModulePaths. Because fsPathFromUrl ensures a leading slash without resolving the URL against the project root, the project URL /etc/hostname is recorded as if it were the absolute filesystem path /etc/hostname.
For a later request to /@fs/etc/hostname, the raw-filesystem middleware interprets /etc/hostname as an absolute path. The access check applies server.fs.deny, then accepts paths present in safeModulePaths before checking server.fs.allow. As a result, the request can return the host file instead of the project file that originally populated safeModulePaths.
PoC
The following example requires Linux with a readable /etc/hostname:
$ mkdir vite-safe-module-path-poc $ cd vite-safe-module-path-poc $ npm init -y $ npm install vite@8.3.1 $ mkdir -p etc $ echo 'PROJECT-DECOY\n' > etc/hostname $ echo 'import "./etc/hostname"\n' > main.js $ npx vite --host 127.0.0.1
In another terminal:
$ curl -o /dev/null -s -w '%{http_code}\n' http://127.0.0.1:5173/main.js
200
$ curl -sS -o response -w '%{http_code}\n' http://127.0.0.1:5173/@fs/etc/hostname
200
$ cmp -s response /etc/hostname && echo 'response matches host file'
response matches host fileText from GitHub Advisory Database
Affected versions 18
- vite, npm>= 8.3.0, <= 8.3.2GitHub
- vite, npm>= 8.2.0, <= 8.2.3GitHub
- vite, npm>= 8.0.0, <= 8.1.5GitHub
- vite, npm>= 7.0.0, <= 7.3.6GitHub
- vite, npm<= 6.4.3GitHub
- vite-plus, npm<= 1.0.0GitHub
- viteaffected: >= 8.3.0, < 8.3.3CVE List
- viteaffected: >= 8.2.0, < 8.2.4CVE List
- viteaffected: >= 8.0.0, < 8.1.6CVE List
- viteaffected: >= 7.0.0, < 7.3.7CVE List
- viteaffected: < 6.4.4CVE List
- vite-plusaffected: < 1.1.0CVE List
- vite, npmfrom 8.3.0, fixed in 8.3.3OSV
- vite, npmfrom 8.2.0, fixed in 8.2.4OSV
- vite, npmfrom 8.0.0, fixed in 8.1.6OSV
- vite, npmfrom 7.0.0, fixed in 7.3.7OSV
- vite, npmfrom first release, fixed in 6.4.4OSV
- vite-plus, npmfrom first release, fixed in 1.1.0OSV
References 9
- github.com/vitejs/vite/commit/170b92791421bcd484f7325936d989a82d6bd4aaFixvia CVE List
- github.com/vitejs/vite/commit/45c0e3392a298626955a0ab93a8e51232daac721Fixvia CVE List
- github.com/vitejs/vite/commit/c3e06f92e969952466b4e2f5801e85e1e00cd905Fixvia CVE List
- github.com/vitejs/vite/commit/e570d8d016096b5f8f6f09808376ca6cf73f27d0Fixvia CVE List
- github.com/vitejs/vite/commit/f0d76c7da13d5e794807b82f0b86c1931a8438e3Fixvia CVE List
- github.com/advisories/GHSA-rq7h-c2jc-7f22Advisoryvia GitHub
- github.com/vitejs/vite/security/advisories/GHSA-rq7h-c2jc-7f22Exploitvia CVE List
- nvd.nist.gov/vuln/detail/CVE-2026-112946Referencevia GitHub
- github.com/vitejs/vite/pull/23656Referencevia CVE List