Mar 4, 2026·7 min read·19 visits
OpenClaw versions prior to 2026.2.25 fail to enforce access controls on Signal reaction events. Unauthorized attackers can inject system events by reacting to messages, bypassing allowlists and pairing requirements.
An authorization bypass vulnerability exists in the OpenClaw Signal integration where reaction events (emojis) are processed before access control policies are enforced. This flaw allows unauthenticated or unauthorized Signal users to inject system events into the OpenClaw agent's event queue by sending reactions, bypassing the configured 'dmPolicy', 'allowFrom' lists, and 'groupPolicy'. The vulnerability is rooted in an early-return logic flow within the event handler that processes reactions prior to validating the sender's identity against the security policy.
A logic error in the OpenClaw Signal integration module permits the bypass of authorization controls for specific inbound event types. The vulnerability specifically affects how the system handles 'reaction-only' messages—Signal events that consist solely of an emoji reaction to a previous message, without accompanying text body content. In affected versions, these events are ingested and processed by the system before the sender's authorization status is evaluated.
The core function of OpenClaw's Signal handler is to act as a gateway between the Signal network and the internal agent logic. It is responsible for filtering traffic based on strict policies, such as dmPolicy (which dictates whether direct messages are allowed), allowFrom lists (whitelisting specific phone numbers), and groupPolicy. By design, no event should propagate to the internal event bus unless the sender has been explicitly authorized according to these policies.
However, due to the ordering of operations in the event processing pipeline, reaction events trigger an early execution path. This path enqueues a Signal reaction added system notification and terminates the handler's execution immediately, skipping the subsequent code blocks responsible for policy enforcement. Consequently, any Signal user—regardless of their relationship to the bot or their presence on an allowlist—can trigger valid system events within the agent's context simply by reacting to a message.
The vulnerability resides in src/signal/monitor/event-handler.ts, specifically within the createSignalEventHandler function. The architectural flaw stems from a failure to centralize access control decisions at the entry point of the data ingress pipeline. Instead, access checks were interleaved with message type processing, leading to a scenario where certain message types were handled before security validation.
In the vulnerable implementation, the code iterates through incoming Signal envelopes. Upon receiving an envelope, the handler explicitly checks if the message is a reaction (if (reaction && !hasBodyContent)). If this condition evaluates to true, the handler executes a logic block that logs the reaction, resolves the target message, and emits a system event. Crucially, this block concludes with a return statement, intending to prevent double-processing of the event as a standard text message.
The security controls—verifying the sender against the allowFrom list, checking the dmPolicy state (e.g., ensuring the user is paired), and validating group membership—were implemented after this reaction handling block. This sequential error created a blind spot: the code assumed that if an event was 'just a reaction', it did not require the same level of scrutiny as a text message, or arguably, the developers simply ordered the logic based on functional priority rather than security dependency.
The following analysis illustrates the control flow logic error in src/signal/monitor/event-handler.ts and the subsequent remediation. The vulnerability is a classic case of "Check-Use-Time" ordering issues, where data is used (processed) before permissions are checked.
In the pre-patch version, the reaction handling block (marked with [!]) executes immediately, bypassing the policy checks located further down the function:
// src/signal/monitor/event-handler.ts (Vulnerable)
export function createSignalEventHandler(deps) {
return async (envelope) => {
const { source, dataMessage } = envelope;
// [!] VULNERABILITY: Reaction check happens first
if (dataMessage.reaction) {
logger.info(`Processing reaction from ${source}`);
deps.eventBus.emit('signal.reaction', { ... });
return; // <--- Returns here, skipping auth checks below
}
// [!] Security checks are unreachable for reactions
const isAllowed = checkAccessPolicy(source);
if (!isAllowed) {
logger.warn(`Blocked message from ${source}`);
return;
}
// Process standard message...
};
}The fix involves hoisting the access decision logic to the very top of the handler scope. The commit 2aa7842adeedef423be7ce283a9144b9f1a0a669 refactors the handler to use a centralized security utility, resolveDmGroupAccessDecision, ensuring a uniform decision is made regardless of message type.
// src/signal/monitor/event-handler.ts (Fixed)
export function createSignalEventHandler(deps) {
return async (envelope) => {
const { source, dataMessage } = envelope;
// [1] FIX: Resolve access decision immediately
// This uses shared logic from src/security/dm-policy-shared.js
const accessDecision = resolveDmGroupAccessDecision(deps.config, source);
// [2] FIX: Enforce decision on reactions
if (dataMessage.reaction) {
if (accessDecision.decision !== 'allow') {
logger.info(`Blocked reaction from ${source}: ${accessDecision.reason}`);
return; // Early exit if unauthorized
}
// Only process if allowed
deps.eventBus.emit('signal.reaction', { ... });
return;
}
// [3] Enforce decision on standard messages
if (accessDecision.decision !== 'allow') {
// ... blocking logic
return;
}
// Process standard message...
};
}By moving the accessDecision resolution before any content processing, the system ensures that no telemetry or state changes occur for unauthorized entities.
Exploiting this vulnerability requires no special tools beyond a standard Signal client and knowledge of the target OpenClaw instance's phone number. The attack relies on the target running a vulnerable version of the software with the Signal integration enabled.
allowFrom list, nor do they need to have completed any "pairing" handshake. They can be a completely unknown external user.Signal reaction added event.While this does not grant direct Remote Code Execution (RCE), it allows for Event Injection. An attacker could flood the system with reactions, filling logs and potentially confusing the agent's context window or state machine if it consumes reaction events as part of its reasoning loop.
The primary impact of GHSA-792Q-QW95-F446 is the violation of integrity regarding the system's input stream. Security controls are intended to create a trust boundary where only authorized signals (literally and figuratively) influence the agent's state. This vulnerability dissolves that boundary for reaction events.
The impact on confidentiality is low but non-zero. By observing whether reactions are successfully processed (e.g., via delivery receipts or side-channel timing analysis), an attacker might infer the presence and operational status of the bot, even if the bot is configured to silently ignore unauthorized standard messages.
The impact on integrity is moderate. The system accepts and processes input from untrusted sources. In automated systems, "reaction" events are often used as control signals (e.g., "thumbs up" to approve an action). If an attacker can inject these signals, they may be able to influence the bot's decision-making process, depending on how the agent interprets reactions.
There is a potential for availability impact through resource exhaustion. Because the reaction logic processes and logs events, a high-volume flood of reactions from multiple unauthorized numbers could saturate the event bus or fill disk space with logs, although this would require a sustained attack volume.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L| Product | Affected Versions | Fixed Version |
|---|---|---|
OpenClaw OpenClaw | < 2026.2.25 | 2026.2.25 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-285 |
| Attack Vector | Network (Signal Protocol) |
| CVSS (Est.) | 6.5 (Medium) |
| Impact | Authorization Bypass / Event Injection |
| Exploit Status | Proof of Concept |
| Patch Status | Fixed in 2026.2.25 |
A critical Server-Side Request Forgery (SSRF) bypass vulnerability exists in CodeWhale before version 0.8.64 (and version 0.8.41 in the 0.8.x branch) due to a Time-of-Check to Time-of-Use (TOCTOU) bug in its DNS pre-flight validation mechanism. By returning a temporary resolution failure during validation and subsequently resolving to restricted IPs during HTTP execution, attackers can bypass security rules.
An argument injection vulnerability in CodeWhale (CVE-2026-75912 / GHSA-c6mw-8xh8-gpq6) allows unauthenticated remote attackers to execute arbitrary option commands on the git binary. By passing malicious command-line flags inside git_blame and git_show tool helper functions, an attacker can bypass typical access controls to read arbitrary local system files via the underlying git process.
SurrealDB prior to version 3.2.0 is vulnerable to an authorization bypass where authenticated users can invoke custom API endpoints belonging to other tenants. This cross-tenant data access occurs because the system fails to validate authorization scope boundaries against request-supplied namespace and database identifiers before executing scripts with elevated definer's rights.
An incorrect authorization vulnerability (CWE-863) in SurrealDB allows authenticated, low-privileged users to execute unauthorized state-modifying queries. This occurs because the database disabled permissions during evaluation of custom PERMISSIONS WHERE predicates to prevent infinite recursion.
SiYuan before v3.7.4 fails to enforce publish-access filters on five filetree path-resolution endpoints, allowing unauthenticated attackers to reconstruct private directory layouts and map document structures.
Prior to version v3.7.4, the SiYuan personal knowledge management system contained a critical logical authorization vulnerability within its database view rendering component. The flaws allowed unauthenticated remote attackers to bypass publish-access filters on databases, exposing sensitive Relation and Rollup cell contents belonging to private or password-protected repositories.