Loading...
Skip to main content

CVE-2026-30921 — Vulnerability in @oneuptime/common — CVE Details

CRITICAL

OneUptime: Synthetic Monitor RCE via exposed Playwright browser object

Published March 7, 2026Updated March 10, 2026Source: osv

Summary

Summary OneUptime Synthetic Monitors allow low-privileged project users to submit custom Playwright code that is executed on the `oneuptime-probe` service. In the current implementation, this untrusted code is run inside Node's `vm` and is given live host Playwright objects such as `browser` and `page`. This creates a distinct server-side RCE primitive: the attacker does not need the classic `this.constructor.constructor(...)` sandbox escape. Instead, the attacker can directly use the injected Playwright `browser` object to reach `browser.browserType().launch(...)` and spawn an arbitrary executable on the probe host/container. This appears to be a separate issue from the previously published `node:vm(GHSA-h343-gg57-2q67)` breakout advisory because the root cause here is exposure of a dangerous host capability object to untrusted code, not prototype-chain access to `process`. ## Details A normal project member can create or edit monitors and monitor tests: - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/Common/Models/DatabaseModels/Monitor.ts#L45-L78 - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/Common/Models/DatabaseModels/MonitorTest.ts#L27-L60 The dashboard exposes a Playwright code editor for Synthetic Monitors and allows the user to queue a test run: - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/App/FeatureSet/Dashboard/src/Components/Form/Monitor/MonitorStep.tsx#L861-L918 - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/App/FeatureSet/Dashboard/src/Components/Form/Monitor/MonitorTest.tsx#L66-L84 The probe worker polls queued monitor tests and executes them: - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/Probe/Jobs/Monitor/FetchMonitorTest.ts#L55-L85 For `MonitorType.SyntheticMonitor`, the user-controlled `customCode` is passed into `SyntheticMonitor.execute(...)`: - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/Probe/Utils/Monitors/Monitor.ts#L323-L338 `SyntheticMonitor.execute(...)` then runs that code through `VMRunner.runCodeInNodeVM(...)` and injects the live Playwright `browser` and `page` objects into the VM context: - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/Probe/Utils/Monitors/MonitorTypes/SyntheticMonitor.ts#L156-L168 `VMRunner.runCodeInNodeVM(...)` creates a Node `vm` context and exposes host objects into it, including the additional context objects: - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/Common/Server/Utils/VM/VMRunner.ts#L323-L405 The proxy wrapper blocks only a small set of property names and still forwards normal method calls with the real host `this` binding. Because of that, untrusted monitor code can still use legitimate Playwright methods on the injected `browser` object. That is enough for code execution because Playwright's `Browser` exposes `browserType()`, and `BrowserType.launch()` accepts attacker-controlled process launch options such as `executablePath`, `args`, and `ignoreDefaultArgs`. An attacker can therefore cause the probe to spawn an arbitrary executable. Even if Playwright later errors because the spawned process is not a real browser, the command has already executed. This same execution path is also used for normal scheduled monitors, not only one-shot monitor tests: - https://github.com/OneUptime/oneuptime/blob/8e90f451426b160718bdd1796b68c5ec15318101/Probe/Jobs/Monitor/FetchList.ts#L110-L121 As a result, the issue can be abused either as a one-shot RCE via `Test Monitor` or as a persistent scheduled RCE by saving a malicious Synthetic Monitor. ### PoC 1. Log in as any user with normal project membership. 2. Go to `Monitors -> Create New Monitor`. 3. Select `Synthetic Monitor`. 4. In `Playwright Code`, paste the following script: ```javascript const HostFunction = Object.getOwnPropertyDescriptor(console, "log").value.constructor; return { data: { node: HostFunction('return process.version')(), cwd: HostFunction('return process.cwd()')(), id: HostFunction( 'return process.getBuiltinModule("child_process").execSync("id").toString()' )(), }, }; ``` 5. Select any one browser type, for example `Chromium`. 6. Select any one screen type, for example `Desktop`. 7. Set retry count to `0`. 8. Click `Test Monitor` and choose a probe. Expected result: - the monitor execution succeeded and in the `Show More Details` the command output is shown. <img width="899" height="249" alt="image" src="https://github.com/user-attachments/assets/98ebd26f-431b-438e-9459-7deeebf97b18" /> ### Impact This is a server-side `Remote Code Execution` issue affecting the probe component. Who is impacted: - any OneUptime deployment where an attacker can obtain ordinary project membership - environments where the probe has access to internal services, secrets, Kubernetes metadata, database credentials, proxy credentials, or other cluster-local trust relationships

Advisory Timeline

  • First published March 7, 2026 (219 days ago).
  • Last revised March 10, 2026 — 4 days after initial publication.

Remediation

Upgrade to the fixed version using your package manager.

npm
Update @oneuptime/common to 10.0.20 or later
npm install @oneuptime/common@10.0.20

After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.

Affected Packages (1)

Affects 1 ecosystem: npm (1).

PackageEcosystemAffectedFixed In
@oneuptime/common
npm
All versions10.0.20

Vulnerability Classification

Common Weakness Enumeration (CWE) identifiers for this vulnerability type.

CVSS Score Breakdown

What the CVSS (Common Vulnerability Scoring System) 9.9 score means for each attack dimension.

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
High
Availability
High

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Frequently Asked Questions

What is CVE-2026-30921?
OneUptime: Synthetic Monitor RCE via exposed Playwright browser object This vulnerability has been assigned a severity rating of CRITICAL (CVSS score: 9.9/10).
How do I check if my project is affected by CVE-2026-30921?
CVE-2026-30921 affects @oneuptime/common. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-30921 and 200,000+ other known vulnerabilities.

Severity & Exploitability

CVSS Score
9.9

Exploitation is straightforward and causes maximum impact. Patch immediately.

Also Known As

GHSA-4j36-39gm-8vq8

Related CVEs

  • CVE-2026-30887
    CRITICAL

    OneUpTime's Unsandboxed Code Execution in Probe Allows Any Project Member to Achieve RCE

  • CVE-2026-27728
    CRITICAL

    OneUptime: OS Command Injection in Probe NetworkPathMonitor via unsanitized destination in traceroute exec()

  • CVE-2026-30957
    CRITICAL

    OneUptime has Synthetic Monitor RCE via exposed Playwright browser object

  • CVE-2026-30956
    CRITICAL

    OneUptime has authorization bypass via client‑controlled is-multi-tenant-query header that leads to cross‑tenant data exposure and account takeover

  • CVE-2026-27574
    CRITICAL

    OneUptime:: node:vm sandbox escape in probe allows any project member to achieve RCE

  • CVE-2026-107722
    CRITICAL

    fast-jwt: Incomplete patch of CVE-2026-34950: Non-whitespace key-prefix re-enables RSA→HS256 algorithm confusion

  • CVE-2026-108261
    CRITICAL

    TinaCMS admin preview iframe loads an attacker-controlled origin from the URL fragment

  • CVE-2025-65966
    HIGH

    OneUptime Unauthorized User Creation via API

Check if you're affected

Scan your dependencies to see if this vulnerability affects your projects.

Scan Your Dependencies