Mar 28, 2026·4 min read·36 visits
OpenClaw versions up to 2026.3.24 lack rate limiting on the BlueBubbles webhook endpoint. Attackers can brute-force the webhook authentication password to gain unauthorized access. Upgrading to version 2026.3.25 resolves the issue by implementing a fixed-window rate limiter.
The OpenClaw package before version 2026.3.25 fails to restrict the rate of incoming authentication attempts on its BlueBubbles webhook endpoint. This lack of rate limiting allows unauthenticated remote attackers to perform high-speed brute-force attacks against the webhook password, potentially resulting in unauthorized message processing and data access.
The openclaw npm package provides a BlueBubbles extension designed to process incoming webhooks. The webhook endpoint relies on a static authentication mechanism, evaluating a password supplied via query parameters or HTTP headers. Prior to version 2026.3.25, the application lacked any mechanism to throttle or limit repeated failed authentication attempts.
This architectural oversight is classified as CWE-307 (Improper Restriction of Excessive Authentication Attempts). Without rate limiting, the authentication interface operates at the maximum speed the underlying network and hardware can support.
An unauthenticated remote attacker can exploit this flaw to execute brute-force attacks against the webhook endpoint. If a weak or predictable password is in use, the attacker can reliably compromise the endpoint, gaining unauthorized access to process messages or access OpenClaw data.
The vulnerability exists within the handleBlueBubblesWebhookRequest function located in the extensions/bluebubbles/src/monitor.ts module. When processing incoming HTTP POST requests, the function extracts the provided password from either query parameters (such as guid or password) or HTTP headers (such as x-guid or Authorization).
The function immediately evaluates the extracted credential against the configured expected password. If the provided credential does not match, the application returns an HTTP 401 Unauthorized response. The application did not track the state of client IP addresses, nor did it record the frequency of failed authentication requests.
Because the rejection was stateless and synchronous, an attacker received immediate feedback on the validity of a password guess. The absence of a delay mechanism or a lockout threshold allowed the authentication endpoint to function as a high-speed oracle for password validity.
The vulnerability was remediated in commit 5e08ce36d522a1c96df2bfe88e39303ae2643d92. The developer introduced a comprehensive fixed-window rate limiter utilizing the createFixedWindowRateLimiter function.
To ensure accurate tracking across network topologies, the patch implements a resolveWebhookClientIp utility. This utility parses X-Forwarded-For and X-Real-IP headers to identify the true client origin, provided the trustedProxies configuration is correctly established at the gateway layer.
The rate-limiting bucket is keyed using a combination of the normalized target path and the resolved client IP address (${normalizedPath}:${clientIp}). This prevents an attacker from bypassing the limit by rotating through different endpoints.
const rateLimitKey = `${normalizedPath}:${clientIp}`;
return await withResolvedWebhookRequestPipeline({
req,
res,
targetsByPath: webhookTargets,
allowMethods: ["POST"],
rateLimiter: webhookRateLimiter,
rateLimitKey,
// ... other configs
});The withResolvedWebhookRequestPipeline middleware evaluates the request rate before execution reaches the authentication logic. If the threshold is exceeded, the pipeline halts execution and returns an HTTP 429 Too Many Requests status.
An attacker initiates the exploit by directing a high volume of HTTP POST requests to the exposed BlueBubbles webhook endpoint. The attacker iteratively cycles through a dictionary of common passwords, injecting the payload into the Authorization header or the guid query parameter.
Because the vulnerable application responds with an immediate 401 Unauthorized status upon failure, the attacker uses the HTTP response code to confirm an incorrect guess. The attack continues until the server returns an HTTP 200 OK status, indicating a successful credential match.
While a standalone public exploit is not documented, the OpenClaw security test suite (monitor.webhook-auth.test.ts) serves as a practical proof-of-concept. The test executes 130 rapid authentication guesses against the patched server, verifying that the response correctly transitions from 401 Unauthorized to 429 Too Many Requests.
Administrators must upgrade the openclaw package to version 2026.3.25 or later to mitigate this vulnerability. The applied patch enforces a default budget of approximately 120 requests per minute per IP address.
Deployments utilizing reverse proxies (such as Nginx, HAProxy, or Cloudflare) require specific configuration to ensure the rate limiter functions correctly. Administrators must populate the trustedProxies variable within the OpenClaw gateway settings.
If the proxy configuration is omitted, resolveWebhookClientIp will record the internal IP address of the reverse proxy instead of the external client. This misconfiguration causes the rate limiter to enforce a global limit across all inbound traffic, potentially resulting in a self-inflicted denial-of-service condition for legitimate webhook events.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
openclaw OpenClaw Project | <= 2026.3.24 | 2026.3.25 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-307 |
| Attack Vector | Network |
| Authentication Required | None |
| Impact | Unauthorized Access |
| Exploit Status | Proof of Concept |
| Patched Version | 2026.3.25 |
Improper Restriction of Excessive Authentication Attempts
An incorrect authorization vulnerability (CWE-863) in Gardener's customverbauthorizer admission plugin allows project administrators lacking the manage-members permission to inject arbitrary Group or ServiceAccount subjects, granting unauthorized access to project resources.
Cloudreve versions prior to 4.18.0 contain a Server-Side Request Forgery (SSRF) vulnerability. The application's validation logic fails to canonicalize various IPv4-in-IPv6 transition formats, such as NAT64, 6to4, and Teredo addresses. Consequently, an authenticated user with remote-download permissions can issue requests that bypass SSRF network boundaries, enabling connection routing to loopback, private, or cloud metadata endpoints.
Hatchet V1 Dispatcher before version 0.95.3 fails to enforce proper tenant boundaries when managing active stream connections for durable task completions. Because the global lookup map is keyed solely by task external identifiers, authenticated attackers who obtain a victim's task UUID can register a stream subscription and receive task results belonging to another tenant.
CVE-2026-88978 is a critical cross-tenant data exposure vulnerability in Hatchet, a platform for orchestrating background tasks and durable workflows. The flaw exists in the durable-task event retrieval system where client-supplied task, node, and branch UUIDs are resolved via the ListSatisfiedEntries database query without verifying the tenant ownership of the requesting worker context.
An unauthenticated timing oracle vulnerability exists in Traefik's BasicAuth middleware from version 3.6.11 up to (but not including) 3.7.13. By utilizing a request coalescing mechanism (singleflight.Group) that relies on server-side stored secret hashes for key generation, the software introduces a timing discrepancy. Concurrent requests targeting non-existent usernames generate identical singleflight keys and coalesce, resulting in accelerated response times. Conversely, requests targeting valid usernames produce distinct keys and execute independently, allowing remote attackers to systematically enumerate valid usernames.
Home Assistant Core prior to version 2026.2.3 is vulnerable to Server-Side Request Forgery (SSRF) via the IPP integration's auto-discovery mechanism. Unauthenticated mDNS advertisements can trigger HTTP requests that follow malicious redirects to loopback interfaces.