← Blog

Agent Passport blocks every recent OpenClaw CVE. Here is how.

OpenClaw has had a rough few weeks. Eight vulnerabilities disclosed in under a month: SSRF in the gateway, missing webhook authentication, path traversal in the browser upload handler, and a one-click RCE via malicious link. Endor Labs published a thorough breakdown of six of them. The University of Toronto put out an advisory on the WebSocket hijacking issue.

If you run AI agents on top of OpenClaw, or any similar framework, you should read what follows.


Why this keeps happening

Endor Labs put the root cause clearly: "Trust boundaries extend beyond traditional user input. Configuration values, LLM outputs, and tool parameters are potential attack surfaces that require validation at every layer."

Traditional web security thinks about user input: form fields, query strings, headers from browsers. AI agent frameworks add a new attack surface that most security tooling was not designed to catch. The LLM output IS input. Tool call parameters ARE input. A URL that an agent constructs from a web page it just fetched IS untrusted input.

This is not an OpenClaw-specific problem. It is a structural problem with how agent frameworks expose capabilities. A tool that can make HTTP requests is a potential SSRF vector. A tool that reads or writes files is a potential path traversal vector. A webhook endpoint that accepts agent triggers is a potential authentication bypass.

The fix is not patching individual CVEs after the fact. It is a consent and validation layer that runs before any tool call executes.


The nine CVEs, and what blocks each one

CVE / Advisory Type CVSS Agent Passport block
CVE-2026-25253 One-click RCE via malicious link Critical Kill switch; mandate scope limits reachable commands
UoToronto advisory WebSocket hijacking, safety controls disabled Critical Webhook Origin Verification; mandate enforcement survives control-plane compromise
CVE-2026-26322 SSRF in Gateway tool 7.6 SSRF Shield (auto-fires on external_api actions)
CVE-2026-26319 Missing Telnyx webhook auth 7.5 Webhook Origin Verification + HMAC-SHA256
CVE-2026-26329 Path traversal in browser upload High Path Traversal Guard (auto-fires on data actions)
GHSA-56f2-hvwg-5743 SSRF in image tool 7.6 SSRF Shield
GHSA-pg2v-8xwh-qhcc SSRF in Urbit auth 6.5 SSRF Shield
GHSA-c37p-4qqg-3p76 Twilio webhook auth bypass 6.5 Webhook Origin Verification + HMAC-SHA256

A note on the RCE and WebSocket hijacking vulnerabilities: Agent Passport cannot patch the underlying OpenClaw gateway bugs. Those require framework-level fixes. What it does is limit blast radius. If an attacker hijacks the control plane, the mandate system still gates what the agent can actually do.


How Agent Passport works

Agent Passport is a consent layer. Before an agent takes any sensitive action, it calls check-action. If there is no valid mandate for that action, the agent stops and asks.

A mandate specifies what is allowed:

{
  "action_type": "external_api",
  "agent_id": "agent:my-assistant",
  "scope": {
    "allowlist": ["api.github.com", "api.anthropic.com"],
    "rate_limit": "200/hour"
  },
  "ttl": "2026-03-01T00:00:00Z",
  "status": "active"
}

Six action types are gated: financial, communication, data, system, external_api, and identity. Anything not on the allowlist is denied.

result=$(./mandate-ledger.sh check-action "$AGENT_ID" external_api "https://api.github.com/repos")
# {"authorized": true, "mandate_id": "mandate_...", "action_type": "external_api"}

result=$(./mandate-ledger.sh check-action "$AGENT_ID" external_api "http://169.254.169.254/latest/meta-data")
# {"authorized": false, "action_type": "external_api", "target": "http://169.254.169.254/latest/meta-data", "reason": "SSRF Shield: Cloud metadata endpoint blocked: 169.254.169.254", "ssrf_blocked": true}

The SSRF check fires before the mandate lookup. Even if an attacker injected a mandate covering all external APIs, the SSRF shield would still block requests to private ranges and metadata endpoints.


What's new in v2.2.0

SSRF Shield

Any external_api action is validated before the mandate is checked. The shield rejects:

./mandate-ledger.sh check-ssrf "http://192.168.1.100/admin"
# {"ssrf_safe": false, "reason": "Private network IP blocked: 192.168.1.100", "target": "http://192.168.1.100/admin"}

./mandate-ledger.sh check-ssrf "https://api.stripe.com/v1/charges"
# {"ssrf_safe": true, "reason": "URL passed all SSRF checks", "target": "https://api.stripe.com/v1/charges"}

Path Traversal Guard

Any data action is path-validated before mandate lookup. The guard first checks for traversal sequences (including URL-encoded variants like %2e%2e, %252e, %2f), then canonicalizes with realpath -m and confirms the resolved path stays within the declared safe root.

./mandate-ledger.sh check-path "/home/user/projects/../../../etc/passwd" "/home/user/projects"
# {"path_safe": false, "canonical_path": "", "reason": "Path traversal sequence detected"}

./mandate-ledger.sh check-path "/home/user/projects/src/index.js" "/home/user/projects"
# {"path_safe": true, "canonical_path": "/home/user/projects/src/index.js", "reason": "Path is within safe root"}

Webhook Origin Verification

Validates that incoming webhook requests come from expected origins, with optional HMAC-SHA256 signature verification and constant-time comparison to prevent timing attacks.

./mandate-ledger.sh verify-webhook "https://api.github.com" "api.github.com,hooks.slack.com"
# {"webhook_valid": true, "origin_valid": true, "signature_valid": false, "reason": "Webhook verified"}

BODY='{"event":"call.initiated","call_id":"123"}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" -hex | awk '{print $NF}')
./mandate-ledger.sh verify-webhook "https://api.telnyx.com" "api.telnyx.com" "$WEBHOOK_SECRET" "$SIG" "$BODY"
# {"webhook_valid": true, "origin_valid": true, "signature_valid": true}

All three checks log to the audit trail automatically.


Install in three commands

# Via ClawHub (recommended)
clawhub install agent-passport

# Or clone directly
git clone https://github.com/agentpassportai/agent-passport
cd agent-passport/scripts

# Initialize your agent
./mandate-ledger.sh init agent:my-assistant "Your Name" "personal assistant" "openclaw"
./mandate-ledger.sh create-from-template dev-tools

No API keys. No network calls. Fully local. Works with any OpenClaw agent and most other agent frameworks that expose a tool-call interface.


What this does not cover

Agent Passport is a runtime enforcement layer, not a vulnerability scanner. It will not detect unpatched CVEs in your framework or flag vulnerable dependency versions. Update OpenClaw. Apply patches. Run npm audit.

What Agent Passport adds is defense in depth: even if the framework has a bug, the agent cannot do things it was not mandated to do.