Running the security audit
What openclaw security audit inspects and the order to fix its findings in
openclaw security audit
Run this after any config change or before exposing network surfaces:
openclaw security audit
openclaw security audit --deep # attempts a live Gateway check
openclaw security audit --fix # apply safe remediations
openclaw 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.
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.