CVE-2026-35667
OpenClaw < 2026.3.24 - Improper Process Termination via Unpatched killProcessTree in shell-utils.ts
OpenClaw before 2026.3.24 contains an incomplete fix for CVE-2026-27486 where the !stop chat command uses an unpatched killProcessTree function from shell-utils.ts that sends SIGKILL immediately without graceful SIGTERM shutdown. Attackers can trigger process termination via the !stop command, causing data corruption, resource leaks, and skipped security-sensitive cleanup operations.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- Low
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
6.9
OpenClaw < 2026.3.24 - Improper Process Termination via Unpatched killProcessTree in shell-utils.ts
OpenClaw before 2026.3.24 contains an incomplete fix for CVE-2026-27486 where the !stop chat command uses an unpatched killProcessTree function from shell-utils.ts that sends SIGKILL immediately without graceful SIGTERM shutdown. Attackers can trigger process termination via the !stop command, causing data corruption, resource leaks, and skipped security-sensitive cleanup operations.
- Record
CVE-2026-35667- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H - Weakness
- CWE-404
- Updated
- 2026-11-02
EUVDEUVD-2026-21480
6.9
OpenClaw before 2026.3.24 contains an incomplete fix for CVE-2026-27486 where the !stop chat command uses an unpatched killProcessTree function from shell-utils.ts that sends SIGKILL immediately without graceful SIGTERM shutdown. Attackers can trigger process termination via the !stop command, causing data corruption, resource leaks, and skipped security-sensitive cleanup operations.
- Record
EUVD-2026-21480- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-3298-56p6-rpw2
6.1
OpenClaw has incomplete Fix for CVE-2026-27486: Unvalidated SIGKILL in `!stop` Chat Command via `shell-utils.ts`
Fixed in OpenClaw 2026.3.24, the current shipping release.
Advisory Details
Title: Incomplete Fix for CVE-2026-27486: Unvalidated SIGKILL in !stop Chat Command via shell-utils.ts
Description:
Summary
The !stop (and /bash stop) chat command kills background bash processes using SIGKILL directly, without first sending SIGTERM to allow graceful shutdown. This is because bash-command.ts imports killProcessTree() from src/agents/shell-utils.ts, which still contains the pre-CVE-2026-27486 aggressive kill logic, rather than from the patched src/process/kill-tree.ts.
Details
CVE-2026-27486 fixed unsafe process termination by introducing a graceful shutdown sequence in src/process/kill-tree.ts — sending SIGTERM first, waiting a configurable grace period (default 3 seconds), then escalating to SIGKILL only if the process is still alive.
However, an identical copy of the unpatched killProcessTree function remains in src/agents/shell-utils.ts (lines 170–192). This function sends SIGKILL immediately with no SIGTERM:
// src/agents/shell-utils.ts:170-192
export function killProcessTree(pid: number): void {
// ... Windows handling ...
try {
process.kill(-pid, "SIGKILL"); // Immediate hard kill, no SIGTERM
} catch {
try {
process.kill(pid, "SIGKILL");
} catch {
// process already dead
}
}
}
The !stop chat command handler in src/auto-reply/reply/bash-command.ts imports and calls this vulnerable version at line 302:
// src/auto-reply/reply/bash-command.ts:5
import { killProcessTree } from "../../agents/shell-utils.js";
// src/auto-reply/reply/bash-command.ts:300-304
const pid = running.pid ?? running.child?.pid;
if (pid) {
killProcessTree(pid); // Calls the UNPATCHED version
}
markExited(running, null, "SIGKILL", "failed");
Compare this to the patched version in src/process/kill-tree.ts:
// src/process/kill-tree.ts:46-78
function killProcessTreeUnix(pid: number, graceMs: number): void {
// Step 1: Try graceful SIGTERM to process group
try {
process.kill(-pid, "SIGTERM");
} catch { /* ... */ }
// Step 2: Wait grace period, then SIGKILL if still alive
setTimeout(() => {
if (isProcessAlive(-pid)) {
try { process.kill(-pid, "SIGKILL"); } catch { /* ... */ }
}
}, graceMs).unref();
}
PoC
This PoC demonstrates the difference between the vulnerable and patched code paths inside a running OpenClaw Gateway container.
Setup:
# Build and start the gateway container
cd CVE-2026-27486-variant-exp/
docker compose up -d
sleep 5
Exploit (vulnerable killProcessTree from shell-utils.ts):
The following script is injected into the container and executed. It starts a bash process that traps SIGTERM for graceful shutdown, then kills it using the same code path as !stop:
// exploit_sigkill.cjs — replicates src/agents/shell-utils.ts:183-190
const { spawn } = require('child_process');
const fs = require('fs');
try { fs.unlinkSync('/tmp/graceful_shutdown.txt'); } catch {}
const child = spawn('/bin/bash', ['-c',
'trap \'echo GRACEFUL_SHUTDOWN > /tmp/graceful_shutdown.txt; exit 0\' SIGTERM; while true; do sleep 1; done'
], { detached: true, stdio: 'ignore' });
child.unref();
setTimeout(() => {
// VULNERABLE: same as shell-utils.ts — SIGKILL only
try { process.kill(-child.pid, 'SIGKILL'); } catch {
try { process.kill(child.pid, 'SIGKILL'); } catch {}
}
setTimeout(() => {
if (fs.existsSync('/tmp/graceful_shutdown.txt')) {
console.log('[BLOCKED] SIGTERM was received.');
process.exit(1);
} else {
console.log('[EXPLOITED] SIGKILL sent directly — SIGTERM never delivered.');
process.exit(0);
}
}, 2000);
}, 1000);
Run:
python3 poc_exploit.py
Log of Evidence
Exploit output (SIGKILL only, no graceful shutdown):
[*] Running exploit…
- Record
GHSA-3298-56p6-rpw2- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H - Weakness
- CWE-404
- Updated
- 2026-11-02
NVD
6.9
OpenClaw before 2026.3.24 contains an incomplete fix for CVE-2026-27486 where the !stop chat command uses an unpatched killProcessTree function from shell-utils.ts that sends SIGKILL immediately without graceful SIGTERM shutdown. Attackers can trigger process termination via the !stop command, causing data corruption, resource leaks, and skipped security-sensitive cleanup operations.
- Record
CVE-2026-35667- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H - Weakness
- CWE-404
- Updated
- 2026-11-02
OSV
6.9
OpenClaw < 2026.3.24 - Improper Process Termination via Unpatched killProcessTree in shell-utils.ts
OpenClaw before 2026.3.24 contains an incomplete fix for CVE-2026-27486 where the !stop chat command uses an unpatched killProcessTree function from shell-utils.ts that sends SIGKILL immediately without graceful SIGTERM shutdown. Attackers can trigger process termination via the !stop command, causing data corruption, resource leaks, and skipped security-sensitive cleanup operations.
- Record
CVE-2026-35667- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-404
- Updated
- 2026-11-02
OSVGHSA-3298-56p6-rpw2
6.1
OpenClaw has incomplete Fix for CVE-2026-27486: Unvalidated SIGKILL in `!stop` Chat Command via `shell-utils.ts`
Fixed in OpenClaw 2026.3.24, the current shipping release.
Advisory Details
Title: Incomplete Fix for CVE-2026-27486: Unvalidated SIGKILL in !stop Chat Command via shell-utils.ts
Description:
Summary
The !stop (and /bash stop) chat command kills background bash processes using SIGKILL directly, without first sending SIGTERM to allow graceful shutdown. This is because bash-command.ts imports killProcessTree() from src/agents/shell-utils.ts, which still contains the pre-CVE-2026-27486 aggressive kill logic, rather than from the patched src/process/kill-tree.ts.
Details
CVE-2026-27486 fixed unsafe process termination by introducing a graceful shutdown sequence in src/process/kill-tree.ts — sending SIGTERM first, waiting a configurable grace period (default 3 seconds), then escalating to SIGKILL only if the process is still alive.
However, an identical copy of the unpatched killProcessTree function remains in src/agents/shell-utils.ts (lines 170–192). This function sends SIGKILL immediately with no SIGTERM:
// src/agents/shell-utils.ts:170-192
export function killProcessTree(pid: number): void {
// ... Windows handling ...
try {
process.kill(-pid, "SIGKILL"); // Immediate hard kill, no SIGTERM
} catch {
try {
process.kill(pid, "SIGKILL");
} catch {
// process already dead
}
}
}
The !stop chat command handler in src/auto-reply/reply/bash-command.ts imports and calls this vulnerable version at line 302:
// src/auto-reply/reply/bash-command.ts:5
import { killProcessTree } from "../../agents/shell-utils.js";
// src/auto-reply/reply/bash-command.ts:300-304
const pid = running.pid ?? running.child?.pid;
if (pid) {
killProcessTree(pid); // Calls the UNPATCHED version
}
markExited(running, null, "SIGKILL", "failed");
Compare this to the patched version in src/process/kill-tree.ts:
// src/process/kill-tree.ts:46-78
function killProcessTreeUnix(pid: number, graceMs: number): void {
// Step 1: Try graceful SIGTERM to process group
try {
process.kill(-pid, "SIGTERM");
} catch { /* ... */ }
// Step 2: Wait grace period, then SIGKILL if still alive
setTimeout(() => {
if (isProcessAlive(-pid)) {
try { process.kill(-pid, "SIGKILL"); } catch { /* ... */ }
}
}, graceMs).unref();
}
PoC
This PoC demonstrates the difference between the vulnerable and patched code paths inside a running OpenClaw Gateway container.
Setup:
# Build and start the gateway container
cd CVE-2026-27486-variant-exp/
docker compose up -d
sleep 5
Exploit (vulnerable killProcessTree from shell-utils.ts):
The following script is injected into the container and executed. It starts a bash process that traps SIGTERM for graceful shutdown, then kills it using the same code path as !stop:
// exploit_sigkill.cjs — replicates src/agents/shell-utils.ts:183-190
const { spawn } = require('child_process');
const fs = require('fs');
try { fs.unlinkSync('/tmp/graceful_shutdown.txt'); } catch {}
const child = spawn('/bin/bash', ['-c',
'trap \'echo GRACEFUL_SHUTDOWN > /tmp/graceful_shutdown.txt; exit 0\' SIGTERM; while true; do sleep 1; done'
], { detached: true, stdio: 'ignore' });
child.unref();
setTimeout(() => {
// VULNERABLE: same as shell-utils.ts — SIGKILL only
try { process.kill(-child.pid, 'SIGKILL'); } catch {
try { process.kill(child.pid, 'SIGKILL'); } catch {}
}
setTimeout(() => {
if (fs.existsSync('/tmp/graceful_shutdown.txt')) {
console.log('[BLOCKED] SIGTERM was received.');
process.exit(1);
} else {
console.log('[EXPLOITED] SIGKILL sent directly — SIGTERM never delivered.');
process.exit(0);
}
}, 2000);
}, 1000);
Run:
python3 poc_exploit.py
Log of Evidence
Exploit output (SIGKILL only, no graceful shutdown):
[*] Running exploit…
- Record
GHSA-3298-56p6-rpw2- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H - Weakness
- CWE-404
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
openclawnpm |
before 2026.3.24 | 2026.3.24 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-35667 is a medium vulnerability (CVSS 6.9) in Openclaw, published March 30, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.15%, the 4th percentile. Fixed in openclaw 2026.3.24.
References
github.com/openclaw/openclaw/security/advisories/GHSA-3298-56p6-rpw2
vulncheck.com/advisories/openclaw-improper-process-termination-via-unpatched-killprocesstree-in-shell-utils-ts
github.com/advisories/GHSA-jfv4-h8mc-jcp8
github.com/advisories/GHSA-3298-56p6-rpw2
github.com/CVEProject/cvelistV5/tree/main/cves/2026/35xxx/CVE-2026-35667.json
nvd.nist.gov/vuln/detail/CVE-2026-35667
github.com/openclaw/openclaw
Left out here: the rest of 2 source descriptions. The JSON record has them.