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·39 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

•13 minutes ago•CVE-2026-61595
7.7

CVE-2026-61595: Multi-Tenancy Isolation Bypass on WebSocket and SSE Paths in djust

The multi-tenant isolation mechanism in djust prior to version 1.0.7 fails open on active WebSocket and Server-Sent Events (SSE) connections. Because the tenant context is stored in thread-local variables and initialized exclusively via HTTP middleware, asynchronous event loops executing ASGI/WebSocket code paths do not carry the resolved tenant identifier. When queries are executed without this context, the default database manager fails open, allowing authenticated users of any tenant to query and read sensitive rows across all other tenant accounts.

Amit Schendel
Amit Schendel
1 views•5 min read
•about 1 hour ago•CVE-2025-59953
9.8

CVE-2025-59953: Unauthenticated Remote Code Execution in LMDeploy AsyncRPCServer via Insecure Pickle Deserialization

LMDeploy prior to version 0.10.2 is vulnerable to remote code execution because its AsyncRPCServer component implements unauthenticated, remote-accessible communication sockets and uses the insecure pickle.loads() deserializer to process incoming requests.

Alon Barad
Alon Barad
1 views•6 min read
•about 2 hours ago•CVE-2026-68904
7.0

CVE-2026-68904: Uncontrolled Resource Consumption (Socket Leak and Reconnection Storm) in node-opcua

CVE-2026-68904 is a high-severity Denial of Service (DoS) vulnerability in the node-opcua library. It arises from a logical flaw in the keepalive session manager combined with incorrect socket termination at the TCP transport layer. When server-side anomalies occur, affected clients fall into an infinite, high-frequency reconnection loop. Due to the use of graceful teardown (socket.end) instead of immediate termination (socket.destroy) during negotiation failures, sockets remain open in the FIN-WAIT-2 state. This accumulates system file descriptors and memory, eventually crashing the client process.

Amit Schendel
Amit Schendel
8 views•8 min read
•about 3 hours ago•CVE-2026-61593
8.1

CVE-2026-61593: Cross-Site Request Forgery in djust Server-Sent Events Transport Layer

CVE-2026-61593 is a high-severity Cross-Site Request Forgery (CSRF) vulnerability discovered in the Server-Sent Events (SSE) transport layer of djust, an open-source framework that implements Phoenix LiveView-style reactive server-side rendering for Django applications. Before version 1.0.7, a lack of origin verification on the SSE stream endpoint, combined with @csrf_exempt decorators on message POST endpoints, allowed an attacker to hijack active client sessions through cross-origin interactions.

Alon Barad
Alon Barad
5 views•5 min read
•about 4 hours ago•CVE-2026-81192
7.0

CVE-2026-81192: Local Code Execution via Untrusted Search Path in OpenTelemetry.Resources.Host

An untrusted search path vulnerability (CWE-426) in the OpenTelemetry.Resources.Host NuGet package on macOS allows a local attacker to execute arbitrary code with elevated privileges by hijacking standard system commands such as sh and ioreg.

Alon Barad
Alon Barad
4 views•6 min read
•about 5 hours ago•CVE-2026-61598
7.1

CVE-2026-61598: Remote State Modification via Mass Assignment in djust Framework

CVE-2026-61598 is a high-severity mass-assignment vulnerability (CWE-915) affecting the Python package djust prior to version 1.0.7. An authenticated client can supply arbitrary parameter names to modify public view attributes on the server via WebSocket events, leading to unauthorized state manipulation, authorization bypass, or price tampering.

Alon Barad
Alon Barad
8 views•6 min read