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



GHSA-JFV4-H8MC-JCP8

OpenClaw: The Cleanup Crew That Killed Everyone Else's Processes

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 18, 2026·5 min read·33 visits

Executive Summary (TL;DR)

OpenClaw < 2026.2.14 used a 'search and destroy' method to clean up stale agents, matching processes by name rather than ID. On shared servers, this meant it could kill unrelated processes belonging to other users if they shared similar command-line arguments. The fix implements strict Parent PID (PPID) verification.

A process safety vulnerability in the OpenClaw Personal AI Assistant allowed the CLI runner to terminate arbitrary processes on the local system. By relying on loose regex matching of command-line arguments without verifying process lineage (PPID) or ownership, OpenClaw could accidentally execute a Denial of Service (DoS) against other users on shared environments.

The Cleanup Crew From Hell

In the world of autonomous agents, managing subprocesses is like herding cats. You spawn them, they do work, and sometimes they refuse to leave. OpenClaw, a personal AI assistant, includes a 'cleanup' routine designed to sweep up these stale agent sessions—zombie processes left behind after a crash or a suspension.

Ideally, a cleanup routine is a scalpel: it identifies the specific resources it owns and carefully disposes of them. OpenClaw, unfortunately, brought a chainsaw. The affected component, specifically the CLI runner, was tasked with killing 'resume' processes and other agent executors. However, in its zeal to keep the system clean, it skipped a fundamental rule of operating systems: verify before you vilify.

The vulnerability isn't a complex memory corruption or a buffer overflow. It's a logic flaw in how the application identifies 'what to kill'. By trusting the output of a system-wide process list (ps) and filtering it with a regular expression, OpenClaw created a scenario where any process looking vaguely like an OpenClaw agent could be summarily executed via SIGKILL.

The Root Cause: Identity Theft via Regex

The core issue lies in src/agents/cli-runner/helpers.ts. When the CLI wanted to terminate a session, it didn't track the PIDs it spawned. Instead, it queried the operating system for all running processes and filtered the list for strings that looked like its own command-line arguments, such as codex exec resume {sessionId}.

This is CWE-283: Improper Control of a Resource Based on its Identifier. The code assumed that if a process was named codex exec, it must belong to the current OpenClaw instance. It completely ignored the Parent Process ID (PPID) and the user ID (UID) of the process owner.

On a single-user laptop, this is annoying but mostly harmless. On a multi-tenant server (like a shared development box or a university shell server), it's a disaster. If User A runs OpenClaw, and User B is running a script that happens to have codex in the argument list, User A's instance will effectively murder User B's process. Even worse, it used SIGKILL (-9) immediately, giving the victim process zero chance to save data or clean up its own resources.

The Smoking Gun: src/agents/cli-runner/helpers.ts

Let's look at the logic that caused the problem. The vulnerability stems from a naive implementation of process discovery. The original code looked something like this (simplified for clarity):

// VULNERABLE CODE (Conceptual)
const cleanupStaleProcesses = (sessionId) => {
  // 1. Get ALL processes
  const output = execSync('ps aux').toString();
  
  // 2. Filter by simple string matching
  const lines = output.split('\n');
  lines.forEach(line => {
    if (line.includes(`codex exec resume ${sessionId}`)) {
      const pid = extractPid(line);
      // 3. The Kill Shot (No questions asked)
      process.kill(pid, 'SIGKILL');
    }
  });
};

There are three fatal errors here:

  1. Scope: ps aux lists everyone's processes, not just the user's.
  2. Verification: It blindly trusts the regex match.
  3. Severity: It jumps straight to SIGKILL.

The fix, introduced in version 2026.2.14, changes the game entirely. It queries specifically for the PPID and verifies lineage:

// PATCHED CODE (Conceptual)
const cleanupChildren = () => {
  const myPid = process.pid;
  // 1. Get PID, PPID, and Args specifically
  const output = execSync('ps -axww -o pid,ppid,args').toString();
  
  parseOutput(output).forEach(proc => {
    // 2. CRITICAL: Check if WE are the parent
    if (proc.ppid === myPid && isAgentProcess(proc.args)) {
      try {
        // 3. Be polite first
        process.kill(proc.pid, 'SIGTERM');
      } catch (e) {
        // Fallback only if necessary
        process.kill(proc.pid, 'SIGKILL');
      }
    }
  });
};

Exploitation: The 'Resume' Trick

Exploiting this on a shared system is trivially easy and can be done accidentally. Since the attacker acts as the 'cleaner', they don't need elevated privileges—they just need to run the vulnerable software.

The Setup

Imagine a shared Linux server used by a dev team.

  1. The Victim (Bob) is running a long-term data processing script. He names it codex-data-migration.py and runs it with python codex-data-migration.py --resume-from-checkpoint.
  2. The Attacker (Alice) logs in and starts OpenClaw to debug her agent.
  3. Alice's OpenClaw instance finishes a task and triggers cleanup().

The Trigger

Alice's OpenClaw runs ps and scans for codex and resume. It sees Bob's process: root 1234 python codex-data-migration.py --resume-from-checkpoint

The regex matches codex and resume. OpenClaw assumes this is a stale agent executor belonging to Alice.

The Impact

OpenClaw sends kill -9 1234. Bob's migration dies instantly. No database connections are closed. No state is saved. Bob yells across the office asking who touched the server.

The Fix: Trust, But Verify

The mitigation in version 2026.2.14 is robust because it shifts the source of truth from syntax (what the command looks like) to lineage (who started the command).

Key changes in the patch:

  • PPID Validation: The cleanup routine now strictly enforces proc.ppid === process.pid. OpenClaw will only kill processes that it personally spawned. It can no longer reach across user boundaries or even unrelated processes owned by the same user.
  • Graceful Termination: Switching to SIGTERM first allows the child process to handle the signal and clean up its own resources (close file handles, etc.) before being forced to exit.
  • Better Regex: The regex was tightened to respect word boundaries, ensuring that searching for codex doesn't match codexx.

> [!NOTE] > Researcher Note: There is a theoretical TOCTOU (Time-of-Check Time-of-Use) race condition where a PID could be recycled between the ps check and the kill command. However, given the speed of execution and the specific PPID check, exploiting this window is highly impractical.

Official Patches

OpenClaw (npm)NPM package page with version history

Fix Analysis (2)

Technical Appendix

CVSS Score
4.3/ 10
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:H

Affected Systems

OpenClaw Personal AI Assistant (npm package)Node.js environments hosting OpenClawShared hosting / Multi-tenant Linux servers

Affected Versions Detail

Product
Affected Versions
Fixed Version
openclaw
OpenClaw
< 2026.2.142026.2.14
AttributeDetail
CWE IDCWE-283
Attack VectorLocal (AV:L)
CVSS v4.04.3 (Medium)
Privileges RequiredLow (PR:L)
ImpactDenial of Service (DoS)
Exploit MaturityProof-of-Concept

MITRE ATT&CK Mapping

T1059Command and Scripting Interpreter
Execution
T1489Service Stop
Impact
CWE-283
Improper Control of a Resource Based on its Identifier

The product does not properly verify that a resource identifier, such as a Process ID (PID), is associated with a resource that is valid for the operation.

Known Exploits & Detection

InternalInternal unit tests demonstrating the false-positive matching behavior

Vulnerability Timeline

Fix authored and tested by OpenClaw team
2026-02-14
Version 2026.2.14 released to npm
2026-02-18
GHSA-jfv4-h8mc-jcp8 advisory published
2026-02-18

References & Sources

  • [1]OpenClaw Repository
  • [2]CWE-283: Improper Control of a Resource Based on its Identifier

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

•1 day ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
8 views•6 min read
•2 days ago•GHSA-FGMC-2HQJ-86V4
6.9

GHSA-FGMC-2HQJ-86V4: Default Administrative Credentials in vantage6-server

A vulnerability in the vantage6 federated learning framework allows unauthenticated remote attackers to gain administrative control of the server via hardcoded default credentials (root/root) when deployed under default configurations in versions 4.2.3 and below.

Amit Schendel
Amit Schendel
8 views•5 min read
•2 days ago•GHSA-X9F6-9RVM-MMRG
6.9

GHSA-X9F6-9RVM-MMRG: Improper Access Control and Volume Mount Isolation Bypass in vantage6 Node

An improper access control vulnerability in the vantage6 node component allows concurrently running algorithm containers to read and modify sensitive input and output files of other tasks. The lack of strict workspace directory isolation exposes a significant attack surface in multi-tenant or federated environments where untrusted algorithms are executed.

Amit Schendel
Amit Schendel
3 views•4 min read
•2 days ago•CVE-2026-47760
8.7

CVE-2026-47760: Cross-Site Scripting (XSS) via SVG Namespace Sanitizer Bypass in TinyMCE

TinyMCE versions 6.8.0 through 7.0.1 contain a high-severity Cross-Site Scripting (XSS) vulnerability. The flaw exists in the custom HTML parser and sanitizer module, which incorrectly manages SVG namespace scopes when parsing nested elements. A low-privileged or unauthenticated attacker can submit a crafted HTML payload containing nested SVG structures to bypass sanitization filters, leading to arbitrary JavaScript execution in the context of the victim's browser session.

Alon Barad
Alon Barad
14 views•7 min read
•2 days ago•CVE-2026-47759
8.7

CVE-2026-47759: Stored Cross-Site Scripting (XSS) via Unsanitized data-mce-* Serialization Bypass in TinyMCE

CVE-2026-47759 is a critical stored Cross-Site Scripting (XSS) vulnerability affecting multiple active branches of the TinyMCE rich text editor. The flaw resides in the editor's handling of user-controlled, prefixed internal attributes, such as data-mce-href, data-mce-src, and data-mce-style. When processing raw HTML inputs, TinyMCE's internal validation schema neglects to inspect these custom prefixed attributes. During HTML serialization, the editor's engine extracts these unsanitized values and copies them back into standard executable attributes, overwriting any previously sanitized standard values and leading to execution of arbitrary code.

Amit Schendel
Amit Schendel
9 views•7 min read
•2 days ago•CVE-2026-47762
8.7

CVE-2026-47762: Stored Cross-Site Scripting (XSS) in TinyMCE Protect Pattern Restoration

A high-severity stored Cross-Site Scripting (XSS) vulnerability was identified in the TinyMCE rich text editor. The flaw exists in the handling of the 'protect' configuration option, where forged placeholder comments containing malicious payloads bypass the editor's sanitization routines and execute arbitrary JavaScript during serialization and content restoration.

Amit Schendel
Amit Schendel
7 views•8 min read