The GitHub Actions job "Required Checks" on texera.git/main has succeeded.
Run started by GitHub user github-merge-queue[bot] (triggered by 
github-merge-queue[bot]).

Head commit for run:
e67ba7e04526e1d17ef48d9b6969bb51914a3c18 / Mend Renovate <[email protected]>
fix(deps, frontend): update dependency vitest to v4.1.11 (#8454)

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [vitest](https://vitest.dev)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest))
| [`4.1.10` →
`4.1.11`](https://renovatebot.com/diffs/npm/vitest/4.1.10/4.1.11) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/4.1.11?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/4.1.10/4.1.11?slim=true)
|

---

### Vitest: Path Traversal / Arbitrary File Read via
@&#8203;vitest/mocker Redirect Mock
[CVE-2026-84373](https://nvd.nist.gov/vuln/detail/CVE-2026-84373) /
[GHSA-82fw-gwwq-j7x9](https://redirect.github.com/advisories/GHSA-82fw-gwwq-j7x9)

<details>
<summary>More information</summary>

#### Details
##### Summary
`@vitest/mocker` registers a redirect mock's target path without
validating it
against the dev server's file-serving allowlist. An attacker who can
reach the
dev server's WebSocket can register a redirect mock pointing outside the
project
root; when the mocked module is requested, the plugin's `load` hook
returns
`readFile(<attacker path>)` as the module source, disclosing local
files.

This is exploitable **without authentication** only through the public
`mockerPlugin` / standalone `interceptorPlugin` exports (used by
third-party dev
servers), which register the handler on Vite's unauthenticated HMR
socket.
Vitest's own browser mode registers mocks over a **token-authenticated**
RPC and
is not remotely reachable by default (see Scope).

##### Affected code
`packages/mocker/src/node/interceptorPlugin.ts`.

The `load` hook is the file-read sink:

```ts
if (mock.type === 'redirect') {
  return readFile(mock.redirect, 'utf-8')
}
```

`mock.redirect` is derived from client input at registration time with
no
boundary check:

```ts
if (event.type === 'redirect') {
  const redirectUrl = new URL(event.redirect)
  event.redirect = join(server.config.root, redirectUrl.pathname)
}
registry.register(event)
```

There is no `server.fs.allow` / `server.fs.deny` check and no assertion
that the
resolved path stays within the project root.

##### Registration paths and trust boundaries
- **Public `mockerPlugin` / `interceptorPlugin` (unauthenticated).** In
`configureServer`, the plugin registers
`server.ws.on('vitest:interceptor:register', …)`
on Vite's HMR WebSocket. That socket performs no token, Origin, or
same-origin
check, so any client that can reach it can register a redirect mock.
This is
  the path the "unauthenticated" impact applies to.
- **Vitest browser mode (authenticated).** Mocks register over the
browser RPC
(`registerMock`), which sits behind a per-run token
(`isValidApiRequest`, a
random `api.token`). The interceptor's `configureServer` socket is not
used for
registration here (in v5 it does not run at all, as the plugin is
injected per
environment). The same missing boundary check exists on the
authenticated RPC
path, but reaching it requires the token, so it is not a
remote-unauthenticated
  read.

##### Path handling
`new URL(redirect).pathname` combined with `join(root, pathname)` does
**not**
confine reads to the root:

- Special/hierarchical schemes (`file:`, `http:`) are normalized by
WHATWG URL,
so `..` segments are collapsed and the result stays under the root.
Payloads of
  the form `file:///../../etc/passwd` do **not** escape.
- A non-special (opaque) scheme preserves `..` in `pathname`, so
`join(root, "../../…/etc/passwd")` resolves outside the root and reads
an
  arbitrary file.

Even without escaping the root, the missing `server.fs` check allows
reading any
in-root file the dev server would otherwise refuse to serve (for example
an
in-root `.env` or source that is denied by `server.fs.deny`).

##### Scope / preconditions
- This is a **development-server** issue. The dev server binds to
`localhost` by
default and is not reachable from the network unless the developer
exposes it
  (`server.host` / `0.0.0.0`, a LAN bind, or a proxy).
- A raw (non-browser) client against a reachable server bypasses browser
origin
and CORS protections entirely and can both register the mock and read
the
  response.
- A browser-based drive-by against a localhost server is substantially
mitigated
by Vite defaults: the default CORS origin allowlist is limited to
`localhost`
origins, and `server.allowedHosts` blocks DNS-rebinding, so a
cross-origin page
  cannot read the file contents back.

##### Impact
Disclosure of local files readable by the dev-server process (source,
in-root
`.env`/secrets, and, via the opaque-scheme payload, files outside the
project
root). No integrity or availability impact.

##### Affected versions
Present since `@vitest/mocker` was introduced.

- **Affected: `@vitest/mocker` >= 2.1.0** (shipped in `vitest` and
  `@vitest/browser` >= 2.1.0), through 4.1.x and the 5.0.0 pre-releases.
- **Fixed:** Vitest 4.1.11 and 5.0.0. Older majors (2.1.x, 3.x) are not
  maintained and are not planned to receive the fix.

##### Fix
Validate the resolved redirect target against Vite's file-serving
allowlist
(`isFileLoadingAllowed`) before registering it, at every registration
site, and
stop registering the interceptor WebSocket events in Vitest's browser
mode
(mocks there flow through the authenticated RPC).

#### Severity
- CVSS Score: 5.9 / 10 (Medium)
- Vector String: `CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N`

#### References
-
[https://github.com/vitest-dev/vitest/security/advisories/GHSA-82fw-gwwq-j7x9](https://redirect.github.com/vitest-dev/vitest/security/advisories/GHSA-82fw-gwwq-j7x9)
-
[https://nvd.nist.gov/vuln/detail/CVE-2026-84373](https://nvd.nist.gov/vuln/detail/CVE-2026-84373)
-
[https://github.com/vitest-dev/vitest/pull/10972](https://redirect.github.com/vitest-dev/vitest/pull/10972)
-
[https://github.com/vitest-dev/vitest/pull/10974](https://redirect.github.com/vitest-dev/vitest/pull/10974)
-
[https://github.com/vitest-dev/vitest/commit/51edf2b072902aec6d30c90ebaafd8f121c6f9d8](https://redirect.github.com/vitest-dev/vitest/commit/51edf2b072902aec6d30c90ebaafd8f121c6f9d8)
-
[https://github.com/vitest-dev/vitest/commit/8ff9b9a9efca7c6cfd5243569440de8d7a33aec4](https://redirect.github.com/vitest-dev/vitest/commit/8ff9b9a9efca7c6cfd5243569440de8d7a33aec4)
-
[https://github.com/vitest-dev/vitest/commit/fe5a11d3ceac5ec10d6d7d21a46d4caca132c48f](https://redirect.github.com/vitest-dev/vitest/commit/fe5a11d3ceac5ec10d6d7d21a46d4caca132c48f)
-
[https://github.com/vitest-dev/vitest/releases/tag/v4.1.11](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.11)
-
[https://github.com/vitest-dev/vitest/releases/tag/v5.0.0-rc.2](https://redirect.github.com/vitest-dev/vitest/releases/tag/v5.0.0-rc.2)
-
[https://github.com/advisories/GHSA-82fw-gwwq-j7x9](https://redirect.github.com/advisories/GHSA-82fw-gwwq-j7x9)

This data is provided by the [GitHub Advisory
Database](https://redirect.github.com/advisories/GHSA-82fw-gwwq-j7x9)
([CC-BY
4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
</details>

---

### Vitest: Path Traversal / Arbitrary File Read via
@&#8203;vitest/mocker Redirect Mock
[CVE-2026-84373](https://nvd.nist.gov/vuln/detail/CVE-2026-84373) /
[GHSA-82fw-gwwq-j7x9](https://redirect.github.com/advisories/GHSA-82fw-gwwq-j7x9)

<details>
<summary>More information</summary>

#### Details
##### Summary
`@vitest/mocker` registers a redirect mock's target path without
validating it
against the dev server's file-serving allowlist. An attacker who can
reach the
dev server's WebSocket can register a redirect mock pointing outside the
project
root; when the mocked module is requested, the plugin's `load` hook
returns
`readFile(<attacker path>)` as the module source, disclosing local
files.

This is exploitable **without authentication** only through the public
`mockerPlugin` / standalone `interceptorPlugin` exports (used by
third-party dev
servers), which register the handler on Vite's unauthenticated HMR
socket.
Vitest's own browser mode registers mocks over a **token-authenticated**
RPC and
is not remotely reachable by default (see Scope).

##### Affected code
`packages/mocker/src/node/interceptorPlugin.ts`.

The `load` hook is the file-read sink:

```ts
if (mock.type === 'redirect') {
  return readFile(mock.redirect, 'utf-8')
}
```

`mock.redirect` is derived from client input at registration time with
no
boundary check:

```ts
if (event.type === 'redirect') {
  const redirectUrl = new URL(event.redirect)
  event.redirect = join(server.config.root, redirectUrl.pathname)
}
registry.register(event)
```

There is no `server.fs.allow` / `server.fs.deny` check and no assertion
that the
resolved path stays within the project root.

##### Registration paths and trust boundaries
- **Public `mockerPlugin` / `interceptorPlugin` (unauthenticated).** In
`configureServer`, the plugin registers
`server.ws.on('vitest:interceptor:register', …)`
on Vite's HMR WebSocket. That socket performs no token, Origin, or
same-origin
check, so any client that can reach it can register a redirect mock.
This is
  the path the "unauthenticated" impact applies to.
- **Vitest browser mode (authenticated).** Mocks register over the
browser RPC
(`registerMock`), which sits behind a per-run token
(`isValidApiRequest`, a
random `api.token`). The interceptor's `configureServer` socket is not
used for
registration here (in v5 it does not run at all, as the plugin is
injected per
environment). The same missing boundary check exists on the
authenticated RPC
path, but reaching it requires the token, so it is not a
remote-unauthenticated
  read.

##### Path handling
`new URL(redirect).pathname` combined with `join(root, pathname)` does
**not**
confine reads to the root:

- Special/hierarchical schemes (`file:`, `http:`) are normalized by
WHATWG URL,
so `..` segments are collapsed and the result stays under the root.
Payloads of
  the form `file:///../../etc/passwd` do **not** escape.
- A non-special (opaque) scheme preserves `..` in `pathname`, so
`join(root, "../../…/etc/passwd")` resolves outside the root and reads
an
  arbitrary file.

Even without escaping the root, the missing `server.fs` check allows
reading any
in-root file the dev server would otherwise refuse to serve (for example
an
in-root `.env` or source that is denied by `server.fs.deny`).

##### Scope / preconditions
- This is a **development-server** issue. The dev server binds to
`localhost` by
default and is not reachable from the network unless the developer
exposes it
  (`server.host` / `0.0.0.0`, a LAN bind, or a proxy).
- A raw (non-browser) client against a reachable server bypasses browser
origin
and CORS protections entirely and can both register the mock and read
the
  response.
- A browser-based drive-by against a localhost server is substantially
mitigated
by Vite defaults: the default CORS origin allowlist is limited to
`localhost`
origins, and `server.allowedHosts` blocks DNS-rebinding, so a
cross-origin page
  cannot read the file contents back.

##### Impact
Disclosure of local files readable by the dev-server process (source,
in-root
`.env`/secrets, and, via the opaque-scheme payload, files outside the
project
root). No integrity or availability impact.

##### Affected versions
Present since `@vitest/mocker` was introduced.

- **Affected: `@vitest/mocker` >= 2.1.0** (shipped in `vitest` and
  `@vitest/browser` >= 2.1.0), through 4.1.x and the 5.0.0 pre-releases.
- **Fixed:** Vitest 4.1.11 and 5.0.0. Older majors (2.1.x, 3.x) are not
  maintained and are not planned to receive the fix.

##### Fix
Validate the resolved redirect target against Vite's file-serving
allowlist
(`isFileLoadingAllowed`) before registering it, at every registration
site, and
stop registering the interceptor WebSocket events in Vitest's browser
mode
(mocks there flow through the authenticated RPC).

#### Severity
- CVSS Score: 5.9 / 10 (Medium)
- Vector String: `CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N`

#### References
-
[https://github.com/vitest-dev/vitest/security/advisories/GHSA-82fw-gwwq-j7x9](https://redirect.github.com/vitest-dev/vitest/security/advisories/GHSA-82fw-gwwq-j7x9)
-
[https://nvd.nist.gov/vuln/detail/CVE-2026-84373](https://nvd.nist.gov/vuln/detail/CVE-2026-84373)
-
[https://github.com/vitest-dev/vitest/pull/10972](https://redirect.github.com/vitest-dev/vitest/pull/10972)
-
[https://github.com/vitest-dev/vitest/pull/10974](https://redirect.github.com/vitest-dev/vitest/pull/10974)
-
[https://github.com/vitest-dev/vitest/commit/51edf2b072902aec6d30c90ebaafd8f121c6f9d8](https://redirect.github.com/vitest-dev/vitest/commit/51edf2b072902aec6d30c90ebaafd8f121c6f9d8)
-
[https://github.com/vitest-dev/vitest/commit/8ff9b9a9efca7c6cfd5243569440de8d7a33aec4](https://redirect.github.com/vitest-dev/vitest/commit/8ff9b9a9efca7c6cfd5243569440de8d7a33aec4)
-
[https://github.com/vitest-dev/vitest/commit/fe5a11d3ceac5ec10d6d7d21a46d4caca132c48f](https://redirect.github.com/vitest-dev/vitest/commit/fe5a11d3ceac5ec10d6d7d21a46d4caca132c48f)
-
[https://github.com/vitest-dev/vitest](https://redirect.github.com/vitest-dev/vitest)
-
[https://github.com/vitest-dev/vitest/releases/tag/v4.1.11](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.11)
-
[https://github.com/vitest-dev/vitest/releases/tag/v5.0.0-rc.2](https://redirect.github.com/vitest-dev/vitest/releases/tag/v5.0.0-rc.2)

This data is provided by
[OSV](https://osv.dev/vulnerability/GHSA-82fw-gwwq-j7x9) and the [GitHub
Advisory Database](https://redirect.github.com/github/advisory-database)
([CC-BY
4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
</details>

---

### Release Notes

<details>
<summary>vitest-dev/vitest (vitest)</summary>

###
[`v4.1.11`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.11)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.10...v4.1.11)

#####    🐞 Bug Fixes

- Revive global concurrency limit for test lifecycle \[backport to v4]
 -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va)
and [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10992](https://redirect.github.com/vitest-dev/vitest/issues/10992)
[<samp>(5146d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5146df80b)
- **browser**:
- Encode iframeId in tester iframe URL \[backport to v4]  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va),
**Pduhard** and **Claude Opus 4.8** in
[#&#8203;10955](https://redirect.github.com/vitest-dev/vitest/issues/10955)
[<samp>(10b2c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/10b2cd201)
- Trigger playwright/chromium gc on lower disk availability \[backport
to v4]  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa),
**Hiroshi Ogawa** and **OpenCode** in
[#&#8203;10951](https://redirect.github.com/vitest-dev/vitest/issues/10951)
[<samp>(9851d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9851dbc41)
- **mocker**:
- Restrict redirect mocks to the fs allowlist \[backport to v4]  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10974](https://redirect.github.com/vitest-dev/vitest/issues/10974)
[<samp>(fe5a1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fe5a11d3c)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.10...v4.1.11)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Etc/UTC)

- Branch creation
  - At any time (no schedule defined)
- 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.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/apache/texera).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC42OS4xIiwidXBkYXRlZEluVmVyIjoiNDQuNjkuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVsZWFzZS92MS4yIiwic2VjdXJpdHkiXX0=-->

---------

Co-authored-by: Meng Wang <[email protected]>
Co-authored-by: mengw15 <[email protected]>

Report URL: https://github.com/apache/texera/actions/runs/36190095445

With regards,
GitHub Actions via GitBox

Reply via email to