Mar 4, 2026·7 min read·18 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 |
Netflix Lemur before 1.9.3 contains a missing authorization vulnerability (CWE-862, CWE-639) when handling certificate creation, upload, or modification. Authenticated non-read-only users can manipulate the replaces parameter to silence expiration notifications and hijack certificate rotation tasks for arbitrary targets, leading to unauthorized TLS certificate deployment and traffic interception.
CVE-2026-71317 is a critical Broken Object-Level Authorization (BOLA) / Missing Authorization vulnerability in Netflix Lemur versions prior to 1.9.3. When the self-service authority creation option is enabled (ADMIN_ONLY_AUTHORITY_CREATION = False), Lemur allows authenticated non-read-only users to request the creation of a subordinate Certificate Authority (sub-CA) chained to any internal parent authority, even if the requesting user lacks administrative or usage permissions over that parent CA. This allows attackers to generate subordinate CAs signed by trusted root certificates, exposing private keys and compromising the organizational PKI trust chain.
Netflix Lemur, a TLS/SSL certificate management framework, contains a missing authorization check in its certificate export endpoint. Prior to version 1.9.3, the validation logic verifying whether a user had permission to export a certificate was incorrectly placed inside a block that executed only if the selected plugin required a private key. When an authenticated user attempted to export a certificate using a plugin that did not require the private key, the authorization check was bypassed, allowing unauthorized access to the public portions of the certificate and producing misleading audit logs.
A critical security flaw in LibreNMS allows authenticated administrators to execute arbitrary commands by modifying the configured binary path for snmpget and accessing the About page. This occurs due to insufficient verification of the executable file's identity and integrity prior to executing it with shell_exec.
LibreNMS versions prior to 26.7.0 are vulnerable to a stored Cross-Site Scripting (XSS) vulnerability. An authenticated administrator can inject arbitrary HTML or JavaScript into graph descriptions via specific administrative configuration endpoints. When another authenticated user views the affected graph, the unescaped payload executes within their browser context.
An injection vulnerability in LibreNMS's Oxidized integration component allows administrative or network-positioned attackers to achieve stored cross-site scripting (XSS). By setting a malicious oxidized.url endpoint, the server makes outbound queries and processes returned JSON fields containing malicious HTML or JavaScript. These payloads are outputted directly in the web UI without appropriate output encoding.