Gateway
Running the security audit
openclaw security audit
Run this after any config change or before exposing network surfaces:
openclaw security auditopenclaw security audit --deep # attempts a live Gateway probeopenclaw security audit --fix # apply safe remediationsopenclaw security audit --json--fix is intentionally narrow: it flips open group policies to allowlists, tightens state/config/include-file permissions (600 files, 700 dirs), and on Windows uses ACL resets instead of POSIX chmod.
What the audit checks (high level)
- Inbound access - DM/group policies, allowlists: can strangers trigger the bot?
- Cross-agent session access - two or more agents with default Gateway-wide session visibility and unrestricted agent-to-agent access:
infofor one operator's personas,warnwhen sandboxing, agent-level tool restrictions, or shared-user ingress suggest different trust levels. Fully sandboxed rosters under the default spawn-tree clamp produce no finding; settingagents.defaults.sandbox.sessionToolsVisibilityto"all"disables that exemption. - Tool blast radius - elevated tools + open rooms: could prompt injection become shell/file/network actions?
- Exec filesystem drift - mutating filesystem tools denied while
exec/processstay available without sandbox constraints. - Exec approval drift -
security="full",autoAllowSkills, interpreter allowlists withoutstrictInlineEval.security="full"alone is a broad posture warning, not proof of a bug - it is the chosen default for trusted-operator setups; tighten it only when your threat model needs approval or allowlist guardrails. - Network exposure - Gateway bind/auth, Tailscale Serve/Funnel, weak/short auth tokens and passwords.
- Browser control exposure - remote nodes, relay ports, remote CDP endpoints.
- Local disk hygiene - permissions, symlinks, config includes, synced-folder paths.
- Plugins - loading without an explicit allowlist.
- Policy drift - sandbox Docker settings configured but sandbox mode off;
gateway.nodes.commands.denyentries that look effective but only match exact command IDs (for examplesystem.run), not shell text inside the payload; dangerousgateway.nodes.commands.allowentries; globaltools.profile="minimal"overridden per agent; plugin-owned tools reachable under a permissive policy. - Runtime expectation drift - assuming implicit exec still means
sandboxwhentools.exec.hostnow defaults toauto, or settingtools.exec.host="sandbox"while sandbox mode is off. - Model hygiene - warns on legacy configured models (soft warning, not a hard block).
Each finding has a structured checkId (for example gateway.bind_no_auth, tools.exec.security_full_configured). Prefixes: fs.* (permissions), gateway.* (bind/auth/Tailscale/Control UI/trusted-proxy), hooks.*/browser.*/sandbox.*/tools.exec.* (per-surface hardening), plugins.*/skills.* (supply chain), security.exposure.* (access policy x tool blast radius), security.trust_model.* (shared-context and cross-agent defaults). Full catalog with severity and auto-fix support: Security audit checks. See also Formal Verification.
Priority order when triaging findings
- Anything "open" + tools enabled: lock down DMs/groups first (pairing/allowlists), then tighten tool policy/sandboxing.
- Public network exposure (LAN bind, Funnel, missing auth): fix immediately.
- Browser control remote exposure: treat like operator access (tailnet-only, pair nodes deliberately, no public exposure).
- Permissions: state/config/credentials/auth must not be group/world-readable.
- Plugins: load only what you explicitly trust.
- Model choice: prefer modern, instruction-hardened models for any bot with tools.