OpenClaw Canvas Authentication Bypass Vulnerability
ZDI-CAN-29311: OpenClaw Canvas Authentication Bypass Vulnerability
-- ABSTRACT -------------------------------------
Trend Micro's Zero Day Initiative has identified a vulnerability affecting the following products:
OpenClaw - OpenClaw
-- VULNERABILITY DETAILS ------------------------
The OpenClaw gateway's authorizeCanvasRequest() function implements an IP-based authentication fallback for canvas endpoints (/__openclaw__/a2ui/, /__openclaw__/canvas/, /__openclaw__/ws). When a WebSocket client authenticates from a private IP address, ALL subsequent HTTP requests from that same IP are granted canvas access without requiring their own authentication token.
In environments where multiple clients share a single IP address ��� corporate NAT, VPN concentrators, Kubernetes clusters, Docker host-mode networking ��� an unauthenticated attacker on the same network is granted full canvas access by virtue of sharing an IP with a legitimate authenticated client.
Three functions in src/gateway/server-http.ts create this vulnerability:
```typescript
function hasAuthorizedWsClientForIp(clients: Set<GatewayWsClient>, clientIp: string): boolean {
for (const client of clients) {
if (client.clientIp && client.clientIp === clientIp) {
return true;
}
}
return false;
}
```
This function checks if ANY connected WebSocket client shares the same IP. It does not verify that the HTTP request belongs to the same user, session, or browser as the WS client.
```typescript
async function authorizeCanvasRequest(params: { ... }): Promise<GatewayAuthResult> {
// ... token check first ...
const clientIp = resolveGatewayClientIp({ ... });
// Only allow fallback for private/loopback addresses
if (!isPrivateOrLoopbackAddress(clientIp)) {
return lastAuthFailure ?? { ok: false, reason: "unauthorized" };
}
// THE VULNERABILITY: grants access based on IP alone
if (hasAuthorizedWsClientForIp(clients, clientIp)) {
return { ok: true };
}
return lastAuthFailure ?? { ok: false, reason: "unauthorized" };
}
```
If the HTTP request comes from a private IP that matches any authenticated WS client, access is granted without verifying the request's own credentials.
```typescript
function isCanvasPath(pathname: string): boolean {
return (
pathname === A2UI_PATH || // /__openclaw__/a2ui
pathname.startsWith(${A2UI_PATH}/) ||
pathname === CANVAS_HOST_PATH || // /__openclaw__/canvas
pathname.startsWith(${CANVAS_HOST_PATH}/) ||
pathname === CANVAS_WS_PATH // /__openclaw__/ws
);
}
```
All canvas endpoints use this weaker authentication path instead of the standard authorizeGatewayConnect() which requires a valid token.
1. A company runs an OpenClaw gateway on an internal server with --bind lan and a token for authentication.
2. Developer Alice connects her OpenClaw desktop app via WebSocket using her valid token. The gateway records her IP as the corporate NAT address (e.g., 10.0.0.1).
3. Attacker Bob, on the same corporate network, also appears as 10.0.0.1 to the gateway (NAT).
4. Bob sends an HTTP request to http://gateway:18789/__openclaw__/a2ui/ with NO authentication header.
5. authorizeCanvasRequest() checks: Is 10.0.0.1 a private IP? Yes. Is there a WS client from 10.0.0.1? Yes (Alice). Access granted.
6. Bob now has full access to all canvas endpoints ��� the A2UI interface, canvas content, and the canvas WebSocket ��� without ever authenticating.
In containerized deployments using shared networking (host mode, pod networking), multiple containers share the same IP. One container's authentication enables canvas access for all containers on that IP.
openclaw:local1. Navigate to the PoC directory and start the environment:
```bash
cd vulnerabilities/04-canvas-ip-auth-bypass
docker compose up -d --wait
```
2. This starts two containers on a shared Docker network:
3. Wait a few seconds for the legitimate client to authenticate, then run the PoC:
```bash
python3 poc.py
```
4. The PoC runs three tests:
| Test | Source | Source IP | Token | Result |
|------|--------|-----------|-------|--------|
| 1 ��� Host (different IP) | Host machine | Host bridge IP | None | 401 Unauthorized |
| 2 ��� Host with token (control) |
This issue can be reached over the network, attack complexity is high, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity high, availability none.
The score comes from this vector: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
CVE-2026-3690 is classified as CWE-291: Reliance on IP Address for Authentication. The product uses an IP address for authentication.
CVE-2026-3690 is recorded against 1 package.
Published on 4 March 2026 and last revised on 8 July 2026. A public exploit is known to exist, which raises the urgency of patching considerably. Record sourced from OSV.
github.com (Web)
github.com (Web)
github.com (Package)
openclaw has other advisories on record. If you are patching this one, these are worth checking on the same host:
These advisories are the same class of weakness (CWE-291: Reliance on IP Address for Authentication) in other software:
Details
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| openclaw | — | — |
References
Similar Threats
Exploit Protection
CVE-2026-3690 carries CVSS 8.0 High rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.
Check My Site For CVE-2026-3690 →No credit card required · Results in minutes
ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.
Stay up to date with the latest from Boteraser.
We use cookies to improve your experience on our site. By using our site, you consent to cookies.
Manage your cookie preferences below:
Essential cookies enable basic functions and are necessary for the proper function of the website.
CloudFlare provides web performance and security solutions, enhancing site speed and protecting against threats.
Service URL: developers.cloudflare.com (opens in a new window)
These cookies are needed for adding comments on this website.
These cookies are used for managing login functionality on this website.
Statistics cookies collect information anonymously. This information helps us understand how visitors use our website.
Google Analytics is a powerful tool that tracks and analyzes website traffic for informed marketing decisions.
Service URL: policies.google.com (opens in a new window)
You can find more information in our Cookie Policy and Privacy Policy.