CVE-2026-73653: @vitest/browser Browser Mode Provider Commands Bypass Vulnerability
CRITICALCVE-2026-73653 is a CRITICAL (CVSS 9.4) browser mode provider commands bypass vulnerability (CWE-552: Files or Directories Accessible to External Parties) affecting @vitest/browser libraries in the npm ecosystem. The issue involves browser mode provider commands bypass the file-access permission gate. Remediation is available by upgrading affected packages to version 4.1.10, 3.2.7, 5.0.0-beta.6.
CVE-2026-73653 at a Glance
Security Impact
CVSS: 9.4
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L).
How to Fix CVE-2026-73653
To remediate this vulnerability, upgrade all affected @vitest/browser dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
npm install @vitest/browser@4.1.10
npm install @vitest/browser@3.2.7
npm install @vitest/browser@5.0.0-beta.6
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
npm ls @vitest/browser
How to Check if You Are Affected
To determine whether your Node.js application is affected by CVE-2026-73653, inspect your project dependencies using npm:
npm ls @vitest/browser
Analyze the terminal output to locate any version of @vitest/browser in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 4.1.10), your application is affected.
Note: The npm ls @vitest/browser command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-552: Files or Directories Accessible to External Parties, where the product makes files or directories accessible to unauthorized actors, even though they should not be. In @vitest/browser, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-73653 Affected @vitest/browser Versions
3 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
@vitest/browser
|
npm |
≥ 4.0.0
< 4.1.10
|
4.1.10
|
|
@vitest/browser
|
npm |
< 3.2.7
|
3.2.7
|
|
@vitest/browser
|
npm |
≥ 5.0.0-beta.1
< 5.0.0-beta.6
|
5.0.0-beta.6
|
References
Frequently Asked Questions
What is CVE-2026-73653?
Which @vitest/browser versions are affected?
What version fixes CVE-2026-73653?
Is @vitest/browser affected?
What is the CVSS score of CVE-2026-73653?
What CWE is associated with CVE-2026-73653?
How can I check npm dependencies for CVE-2026-73653?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-p63j-vcc4-9vmv",
"modified" : "2026-08-13T18:19:12Z",
"published" : "2026-07-21T19:36:12Z",
"aliases" : [ "CVE-2026-73653" ],
"summary" : "@vitest/browser: Browser Mode provider commands bypass the file-access permission gate",
"details" : "## Summary\n\nBrowser Mode exposes a set of built-in \"commands\" that run on the Node.js side of the test runner and can touch the local filesystem (taking screenshots, managing Playwright traces, uploading files for `<input type=\"file\">`, comparing screenshots).\n\nSeveral of these commands accept a file path from the browser and act on it without checking the `allowWrite` permission gate and without confining the path to the project directory. A client that can reach the Browser Mode API can therefore read, create, overwrite, or delete files anywhere the Vitest process can access, even when `allowWrite` is `false`.\n\nThis matters most when the Browser Mode API is exposed to the network (for example `test.api.host` is set, or the dev server is reachable from another machine or origin). In that configuration `allowWrite` defaults to `false` precisely to block file access, and these commands bypass that protection. On a default localhost-only setup with trusted test code, there is no untrusted party in a position to exploit it. The gap still matters wherever you rely on `allowWrite: false` to contain untrusted test code, because these commands ignore that flag.\n\n## Affected commands and impact\n\n| Command | Operation | Impact |\n|---|---|---|\n| `upload` (Playwright + WebdriverIO) | Read | Arbitrary local file read; contents are loaded into the page and readable by test code. Highest-impact case. |\n| `takeScreenshot` (Playwright + WebdriverIO) | Write | Writes a PNG to an arbitrary path (absolute path used verbatim), creating parent directories. |\n| `screenshotMatcher` | Write | Writes reference/diff PNGs; directory derived from client path allows partial traversal. |\n| `stopChunkTrace` | Write | Writes a Playwright trace `.zip` to a path escapable via `../` in the trace name. |\n| `deleteTracing` | Delete | Deletes arbitrary files by path. |\n| `annotateTraces` | Read (disclosure) | Records a client-controlled attachment path that the reporter copies into the attachments directory, disclosing file contents. |\n\nThe writes do not let an attacker choose the file contents (they produce PNG images or trace archives), so the integrity impact is creating, overwriting, or deleting a file at an arbitrary path rather than writing a chosen payload. The reads (`upload`, `annotateTraces`) are more serious because they expose the full contents of an arbitrary file.\n\nThe fix adds, to every file-touching provider command, an `allowWrite` check for write/delete operations and path confinement to the project root (matching the existing `fs` command pattern), so client-supplied absolute paths and `../` traversal are rejected.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "npm",
"name" : "@vitest/browser"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "4.0.0"
}, {
"fixed" : "4.1.10"
} ]
} ]
}, {
"package" : {
"ecosystem" : "npm",
"name" : "@vitest/browser"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "3.2.7"
} ]
} ]
}, {
"package" : {
"ecosystem" : "npm",
"name" : "@vitest/browser"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "5.0.0-beta.1"
}, {
"fixed" : "5.0.0-beta.6"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/security/advisories/GHSA-p63j-vcc4-9vmv"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/pull/10674"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/pull/10679"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/pull/10680"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/commit/33f96a145ef09ca6a43b4e555eb273e64a87be23"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/commit/5c18dd267ff7f47f24cab2f615a16b37d90feb7f"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/commit/b795e36b34969bec50b47a9f29d26f799a6a04fb"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/vitest-dev/vitest"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/releases/tag/v3.2.7"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/releases/tag/v4.1.10"
}, {
"type" : "WEB",
"url" : "https://github.com/vitest-dev/vitest/releases/tag/v5.0.0-beta.6"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-22", "CWE-552", "CWE-862" ],
"severity" : "CRITICAL",
"github_reviewed" : true,
"github_reviewed_at" : "2026-07-21T19:36:12Z",
"nvd_published_at" : null
}
}