chore(deps): update dependency vite-plus to v0.1.24 [security]#30
Merged
Conversation
2565d1e to
ae9e0ea
Compare
Contributor
🔍 Preset previews各 lint プリセットの effective ルールをブラウザで確認できます → 一覧を開く
このPRのブランチに対応する最新のプレビューです。push のたびに更新されます。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
0.1.22→0.1.24vite:
server.fs.denybypass on Windows alternate pathsCVE-2026-53571 / GHSA-fx2h-pf6j-xcff
More information
Details
Summary
The contents of files that are specified by
server.fs.denycan be returned to the browser on Windows.Impact
Only apps that match the following conditions are affected:
--hostorserver.hostconfig option)server.fs.allowDetails
Vite’s dev server denies direct access to sensitive files through
server.fs.deny, including entries such as.env,.env.*, and*.{crt,pem}. However, on Windows, the deny logic does not correctly normalize NTFS ADS path forms before access checks are applied.Because of this, requests such as
/.env::$DATA?raware treated as allowed paths, while Windows resolves them to the original file's default data stream.Similar to that, Windows allows accessing a file using a different name with the 8.3 short name compatibility feature. Vite did not reject accessing files via them.
PoC
$ npm create vite@latest $ cd vite-project/ $ npm install $ npm run devAccess via browser at

http://localhost:5173/.env::$DATA?rawExample expected result:
/.env::$DATA?rawreturns the contents of.env/tls.pem::$DATA?rawreturns the contents oftls.pemSeverity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Vitest Browser: Exposed Browser Mode API Can Proxy CDP and Overwrite Config Files, Leading to RCE
CVE-2026-53633 / GHSA-g8mr-85jm-7xhm
More information
Details
Summary
Vitest Browser Mode exposes a
cdp()API that forwards raw Chrome DevTools Protocol (CDP) methods over the Vitest browser WebSocket RPC. CDP is not gated bybrowser.api.allowWrite,browser.api.allowExec,api.allowWrite, orapi.allowExec.As a result, disabling Browser Mode write and exec operations does not prevent a browser API client from using CDP to perform equivalent actions. In a verified reproduction with
allowWrite: falseandallowExec: false, CDPPage.setDownloadBehaviorset the browser download directory to the project root, and CDPRuntime.evaluatedownloaded a controlledvite.config.ts. Vitest reloaded the changed config and executed attacker-controlled Node.js code.When the Browser Mode API is also exposed to the network, this becomes remotely exploitable because the generated browser runner page exposes the API token, active session id, project name, and project root path needed to connect to the browser WebSocket API and select the target download directory.
Impact
This affects Browser Mode projects using a CDP-capable provider, such as Playwright Chromium, when the browser API server is exposed to the network, for example with
--browser.api.host=0.0.0.0.In this mode Vitest warns that write and exec operations are disabled by default, but the generated browser runner page exposes enough metadata for a remote client to authenticate to the browser WebSocket API while an active session exists. This includes the browser API token, active session id, project name, and serialized test config including the project root path. The attacker can then call Vitest's CDP RPC and use Chrome's download controls to overwrite
vite.config.tsin the project root. When Vitest reloads the changed config, attacker-controlled Node.js code executes on the host running Vitest.The same exposed CDP bridge also allows direct browser-session JavaScript execution through
Runtime.evaluate. A separate local probe showed that CDP can navigate the browser to afile://URL and read rendered file contents, but the primary verified impact is config-file overwrite leading to RCE.Reproduction
For a concrete reproduction, start Browser Mode in watch mode using the official Lit example:
pnpm dlx tiged vitest-dev/vitest/examples/lit vitest-poc cd vitest-poc pnpm installConfigure the Browser Mode API to listen on all interfaces while explicitly disabling write and exec operations:
Then start the test server:
pnpm testVitest serves the browser runner HTML and WebSocket API at
http://localhost:63315.While the browser session is active:
Fetch the generated browser runner page:
Extract the embedded browser API token, active session id, project name, and project root:
window.VITEST_API_TOKEN__vitest_browser_runner__.sessionId__vitest_browser_runner__.config.name__vitest_browser_runner__.config.rootConnect to the browser API WebSocket as a tester client:
Call the
sendCdpEventRPC method with:Call
sendCdpEventagain withRuntime.evaluate. The evaluated JavaScript creates a Blob containing a malicious Vite config and clicks an anchor element<a download="vite.config.ts">.Observed result:
vite.config.tsis overwritten with attacker-controlled content.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
launch-editor: NTLMv2 hash disclosure via UNC path handling on Windows
CVE-2026-53632 / GHSA-v6wh-96g9-6wx3
More information
Details
Summary
The
launch-editorNPM package accesses arbitrary paths including Windows UNC paths. When a UNC path is opened, Windows automatically attempts NTLM authentication to the remote host, causing the user’s NTLMv2 password hash to be leaked to an attacker-controlled SMB server. This can result in credential compromise through offline hash cracking.Impact
If the following conditions are met, an attacker can get the NTLMv2 password hash on the computer that is using the
launch-editor:launch-editorlaunch-editoris runningThis would be a problem if the user password is too simple that it can be identified through offline hash cracking, potentially leading to further compromise of developer accounts or internal systems.
Details
launch-editoraccepts file paths without validating or restricting Windows UNC paths such as:On Windows systems, accessing a UNC path triggers an automatic NTLM authentication attempt to the remote SMB server. No user interaction or warning is required for this authentication attempt to occur.
If an attacker controls the SMB server referenced by the UNC path the victim’s NTLMv2 hash is transmitted to the attacker. The attacker can then capture the hash and perform offline password cracking. Successful cracking reveals the victim’s cleartext password.
The attacker could target a developer that uses a development server using
launch-editorto develop code locally, send them a link and grab their NTLMv2 hash.PoC
From the attacker side, we will setup an SMB server. I personally used Impacket's smbserver.py, but you could use something like Responder for this as well. For keeping it simple, we will use
smbserver.pyhere.First, let's create a directory to serve as an SMB share.
Then, start the SMB server.
Now, run any project that uses the launch-editor package. I have setup a simple "Hello world" project that uses Vite to do this. Then run the project locally (
vite).Now last, we will open a browser window and navigate to the URL used by the launch-editor package to trigger the NTLM authentication. Or we can use
curlto achieve the same.Note the IP address in the HTTP request, and make sure it connects to the IP address of the SMB server. Now we can look at the logs of
smbserver.pyand see the NTLMv2 hash coming in.Severity
CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:H/SI:H/SA:HReferences
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Release Notes
voidzero-dev/vite-plus (vite-plus)
v0.1.24: vite-plus v0.1.24Compare Source
A new
vp pm stagepublishing workflow, hardened installs and upgrades, a Node-version mismatch reinstall prompt, and the bundled vite/vitest/tsdown stack moves forward.Features
vp pm stage: a newvp pmsubcommand exposing npm's staged-publishing workflow (upload a build to a staging area without 2FA, then approve or reject it from a trusted device); it maps topnpm stage/npm stage/yarn npm ... --stagedper package manager, with an npm fallback for yarn Classic and bun (#1715), by @fengmk2vp: prompt to reinstall when up-to-date global packages were built against a different Node.js than the active one (defaults to no); adds--reinstall-node-mismatchand--ignore-node-mismatch, and skips the prompt in CI (#1666), by @liangmiQwQvp format: addformatas a visible alias ofvp fmt, so the common slipvp formatresolves correctly andvp format --init/--migrateapply the samevite.config.tswiring asvp fmt(#1727), by @semimikohFixes & Enhancements
vp install/ Node runtime download: HTTP retries now wrap the whole body stream, hash verification, and archive extraction (not just the request headers), so truncated or corrupt downloads of package managers and Node are re-fetched instead of failing on the first attempt (#1719), by @fengmk2vp upgrade --forceon Windows: install into a fresh directory before repointingcurrent, so the forced reinstall no longer fails trying to overwrite the runningvp.exe(#1714), by @fengmk2vp install -g: install global packages directly into their final prefix instead of a temp dir that gets moved, so packages whose postinstall scripts bake in absolute or relative temp paths still resolve their bins; a failed package in a multi-package install no longer removes the shims of the ones that already succeeded (#1698), by @liangmiQwQvp why: remove the-g/--globalflag, which delegated to the package manager's global mode and ignored Vite+-managed global packages;vp whystays project-scoped whilevp outdated -gkeeps using the managed global flow (#1720), by @liangmiQwQcurrentlink via PowerShell (detecting junctions, symlinks, and stale directories) instead ofcmd /c rmdir, which could fail with "The directory is not empty" (#1726), by @TheAlexLichtervp create: skip editor-config detection and package-local editor settings by default when creating a project inside an existing monorepo;--editor <name>stays an explicit opt-in and--no-editoran opt-out (#1729), by @jong-kyungvp create vite:monorepo(pnpm): keep the aliasedvite/vitestin the website app'spackage.jsonso the workspaceoverrides.vite: catalog:has a direct consumer andvp why viteresolves to@voidzero-dev/vite-plus-core; npm/yarn/bun still drop the dead-weight keys (#1728), by @fengmk2vp pack: rewrite directcreateRequire(...)("picomatch")calls in bundled tsdown output to the local bundled CJS entry, so packing no longer depends on an undeclared runtimepicomatchunder pnpmhoist: false(#1732), by @fengmk2vp migrate: resolve acatalog:husky pin from the workspace catalog (pnpm-workspace.yaml,.yarnrc.yml, orpackage.jsoncatalogs) during the git-hooks preflight, so a compatible catalog-pinned husky no longer triggers a false "could not determine husky version" warning and skips hook setup (#1710), by @fengmk2Docs
llms-full.txtpointer, install commands, and corevpcommands) for handing straight to a coding agent (#1706), by @fengmk2troubleshooting.md:vite.config.tsrelated issues are resolved by updating oxlint and oxfmt (#1708), by @leaysgurAGENTS.md(#1707), by @leaysgurChore
vpinstall: reduce retainedvpversions from 5 to 3 across the installer,vp upgrade, and the shell/PowerShell bootstrap scripts (active and previous versions stay protected for rollback); document the 3-version retention andvp upgrade --rollback(#1716), by @fengmk2.vitest-plugin-loadedfile (#1723), by @liangmiQwQbranchseer) (#1705), by @wan9chi8.0.14 → 8.0.16, vitest4.1.7 → 4.1.8, tsdown0.22.0 → 0.22.1,@vitejs/devtools0.2.0 → 0.3.1(#1713, #1735, #1737), by @voidzero-guard[bot]Bundled Versions
8.0.16f94df871.0.3a287faa0.22.14.1.81.67.00.23.00.52.0New Contributors
Welcome to our new contributor @semimikoh! 🎉
Full Changelog: voidzero-dev/vite-plus@v0.1.23...v0.1.24
Published Packages
@voidzero-dev/vite-plus-core@0.1.24@voidzero-dev/vite-plus-test@0.1.24vite-plus@0.1.24Installation
macOS/Linux:
curl -fsSL https://vite.plus | bashWindows:
Or download and run
vp-setup.exefrom the assets below.Upgrade:
v0.1.23: vite-plus v0.1.23Compare Source
Enterprise-ready HTTP (proxy + custom CA), task command shorthands in
vite.config.ts, a smoothervp create/vp migrate, and the oxc/vite/rolldown bundled stack moves forward.Highlights
vite_shared::shared_http_client()honorsHTTPS_PROXY/HTTP_PROXY/NO_PROXY, picks up macOS System Settings / Windows registry proxies, loads custom CAs fromSSL_CERT_FILEandNODE_EXTRA_CA_CERTS, and exposes aVP_INSECURE_TLSdiagnostic switch; makesvpwork through Socket Firewall Free and other TLS-intercepting proxies (#1686), by @fengmk2run.tasksentries invite.config.tsnow accept a bare string ("build": "cmd") or array ("build": ["cmd1", "cmd2"]) instead of always requiring{ command: ... }; arrays reuse the existing&&planning path so cache,dependsOn, and task options stay consistent (vite-task#391), by @jong-kyungvp outdated -g: routes through Vite+'s managed global package metadata instead of delegating to the underlyingnpm outdated -gstore, so all installed global packages are reported consistently (#1659), by @liangmiQwQFeatures
vp pm approve-builds: new unified subcommand that mirrorspnpm approve-buildsone-to-one, adapts tobun pm trust, and warns-and-noops on npm/yarn (#1662), by @fengmk2vp create: opt-in GitHub Copilot setup; selecting--agent copilotnow generates a.github/workflows/copilot-setup-steps.ymlso the Copilot Coding Agent can set up Vite+ and runvpin the new project out of the box (#1683), by @jong-kyungvp migrate: prompt to removebaseUrlfromtsconfig.jsonbefore applying type-aware lint defaults (runs@andrewbranch/ts5to6 --fixBaseUrl .under the hood; auto-applied in non-interactive mode) (#1692), by @TheAlexLichterpackageManagerin package-manager shims (npm/npx,pnpm/pnpx,yarn/yarnpkg,bun/bunx); add non-mutatingpackageManagerresolution metadata forvp env currentandvp env which(#1654), by @fengmk2--filterno-match now exits0by default; add--fail-if-no-matchto opt back in (vite-task#393), by @kazuponFixes & Enhancements
vp create: keep generated.vscode/settings.jsontrackable when the VS Code editor option is selected (avoid templates'.vscode/*.gitignoremasking it) (#1700), by @jong-kyungvp create vite:monorepo: normalize sub-packagevite-plustocatalog:even when onlyvite-plus(notvite/vitest/...) is present, and drop thevite/vitestaliases generated by the upstream library template (#1697), by @fengmk2vp add/install -g <path>: resolve the real package name frompackage.jsoninstead of using the path string, so local-path installs don't create broken directories (#1685), by @liangmiQwQvp test --coverageand other direct built-in commands now expose the workspace'spackage.json#packageManagerto child processes so tools like Vitest coverage can spawn the configured PM (#1696), by @jong-kyungvp migrate: clean up the whole ESLint ecosystem (plugins, configs, parser/resolver, type-utils) rather than justeslint; skip the migration entirely when@nuxt/eslintis detected (#1682), by @fengmk2vp create: writefmt.configPath(notconfigPath) for Zed oxfmt settings to match the official Zed OXC extension layout (#1687), by @chungweileong94vp migrate: parsetsconfig.jsonas JSONC so files with comments don't breakbaseUrldetection/removal (#1688), by @TheAlexLichtervp env setup: Unix env shims now point at the activevpexecutable instead of always assumingVP_HOME/current/bin/vp, so Homebrew-style installs work (#1631), by @leoharavp outdated -g/vp why -g: don't require a localpackage.json; global commands run regardless of cwd (#1622), by @liangmiQwQvp create: default the "Initialize a git repository?" prompt to yes (#1650), by @fengmk2vphooks: include the managed Node bin inPATHso./node_modules/.bin/vpcan findnodefrom a VS Code commit on macOS (#1647), by @TheAlexLichtervpxon Windows now invokes the package's.cmdshim instead of the Unix binary (#1652), by @tobynguyen27d02b257and5833b374; also bumps the repo's Rust nightly toolchain tonightly-2026-05-24and ships the regeneratedrunconfig types and docs for the new task command shorthand (#1689, #1695), by @branchseerRefactor
VP_SHELL_NU/VP_SHELL_PWSHwith a singleVP_SHELLoverride; add explicit shell parsing forbash,zsh,fish,nu,pwsh, andcmd, and harden auto-detection against nested shells (#1658), by @nekomoyiallocator-api2withbumpalocollections (vite-task#400), by @branchseerand_item_indexfield fromExecutionItemDisplay(vite-task#394), by @branchseerDocs
AGENTS.mdas the primary AI-agent guide for the vite-plus repository; convertCLAUDE.mdinto a compatibility pointer (#1670), by @jong-kyungAGENTS.md(#1673), by @jong-kyungpackages/core/BUNDLING.md(#1660), by @shulaodaChore
--helptext forvp env default/pin/use/execwithExamples:blocks (#1664), by @Boshenpnpm --filter @​rolldown/pluginutils buildstep now that@rolldown/pluginutilsis published from its own package (#1655), by @shulaodasync-remoterewritespnpm-workspace.yaml(#1672), by @lyzno1vite_pm_clilib tests by removing a staletest = falseflag (#1661), by @shulaodanamespace-profile-mac-default(#1701), by @fengmk2package.jsonversion equals npm latest (#1645), by @fengmk2zizmorandcargo-denyworkflows withoxc-project/security-action(#1635), by @Boshenvpbinary archives (.tar.gz/.zip) to GitHub Releases alongside the existingvp-setup-*.exeinstallers (#1665), by @Boshenrepo.jsonin ecosystem tests and bump consumers to>=1.60to dodge the Node 24.16.0 hang (#1668), by @fengmk28.0.11 → 8.0.14, rolldown1.0.0 → 1.0.3, vitest4.1.6 → 4.1.7, oxlint1.63.0 → 1.67.0, oxfmt0.48.0 → 0.52.0, oxlint-tsgolint0.22.1 → 0.23.0,@oxc-project/*and oxc Rust crates0.129.0 → 0.133.0(#1646, #1653, #1693, #1699), by @voidzero-guard[bot]Bundled Versions
8.0.14c917f1e1.0.3a287faa0.22.04.1.71.67.00.23.00.52.0New Contributors
Welcome to all new contributors! 🎉
@ericclemmons, @tobynguyen27, @shulaoda, @leohara, @chungweileong94
Full Changelog: voidzero-dev/vite-plus@v0.1.22...v0.1.23
Published Packages
@voidzero-dev/vite-plus-core@0.1.23@voidzero-dev/vite-plus-test@0.1.23vite-plus@0.1.23Installation
macOS/Linux:
curl -fsSL https://vite.plus | bashWindows:
Or download and run
vp-setup.exefrom the assets below.Upgrade:
Configuration
📅 Schedule: (in timezone Asia/Tokyo)
🚦 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.
This PR was generated by Mend Renovate. View the repository job log.