CVE-2026-73653: @vitest/browser Browser Mode Provider Commands Bypass Vulnerability

CRITICAL
Advisory Identifier: GHSA-p63j-vcc4-9vmv
CVSS 9.4
CWE-552 CWE-862 CWE-22
Published
Advisory Summary

CVE-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

CVE Identifier CVE-2026-73653
GHSA Identifier GHSA-p63j-vcc4-9vmv
Severity CRITICAL
CVSS v3.1 Base Score 9.4
CWE Classification CWE-552: Files or Directories Accessible to External Parties
Affected Product @vitest/browser
Package Ecosystem npm
Published Date
Last Updated

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).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality High (C:H)
Integrity High (I:H)
Availability Low (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.

@vitest/browser fixed: 4.1.10
npm install @vitest/browser@4.1.10
@vitest/browser fixed: 3.2.7
npm install @vitest/browser@3.2.7
@vitest/browser fixed: 5.0.0-beta.6
npm install @vitest/browser@5.0.0-beta.6
Verify Direct and Transitive Dependencies

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

## Summary Browser 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). Several 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`. This 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. ## Affected commands and impact | Command | Operation | Impact | |---|---|---| | `upload` (Playwright + WebdriverIO) | Read | Arbitrary local file read; contents are loaded into the page and readable by test code. Highest-impact case. | | `takeScreenshot` (Playwright + WebdriverIO) | Write | Writes a PNG to an arbitrary path (absolute path used verbatim), creating parent directories. | | `screenshotMatcher` | Write | Writes reference/diff PNGs; directory derived from client path allows partial traversal. | | `stopChunkTrace` | Write | Writes a Playwright trace `.zip` to a path escapable via `../` in the trace name. | | `deleteTracing` | Delete | Deletes arbitrary files by path. | | `annotateTraces` | Read (disclosure) | Records a client-controlled attachment path that the reporter copies into the attachments directory, disclosing file contents. | The 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. The 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.

CVE-2026-73653 Affected @vitest/browser Versions

3 component(s)
Fixed Versions:
4.1.103.2.75.0.0-beta.6
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?
CVE-2026-73653 is a security vulnerability in @vitest/browser involving Browser Mode provider commands bypass the file-access permission gate under CWE-552: Files or Directories Accessible to External Parties.
Which @vitest/browser versions are affected?
Affected versions include releases prior to 4.1.10, 3.2.7, 5.0.0-beta.6 across affected packages: @vitest/browser.
What version fixes CVE-2026-73653?
Upgrading to 4.1.10, 3.2.7, 5.0.0-beta.6 (or the latest patched release for your respective branch) resolves the vulnerability.
Is @vitest/browser affected?
Yes, @vitest/browser is affected in releases prior to 4.1.10, 3.2.7, 5.0.0-beta.6. Upgrade your dependency to 4.1.10, 3.2.7, 5.0.0-beta.6 or later.
What is the CVSS score of CVE-2026-73653?
CVE-2026-73653 has a CVSS v3.1 base score of 9.4 (CRITICAL) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L.
What CWE is associated with CVE-2026-73653?
CVE-2026-73653 is classified under CWE-552: Files or Directories Accessible to External Parties (The product makes files or directories accessible to unauthorized actors, even though they should not be.).
How can I check npm dependencies for CVE-2026-73653?
Run the dependency tree command: 'npm ls @vitest/browser'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "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
  }
}