Ran openclaw security audit? What Every Finding Means in Plain English

Published 2026-10-18 · Updated 2026-10-18 · By The Is My Agent Safe team

Short answer

openclaw security audit lists findings as critical, warn or info, each with a checkId such as gateway.bind_no_auth. Fix criticals first, starting with anything that lets strangers reach tools or your Gateway. Run it with --deep to add live Gateway and skill code checks. --fix only tightens permissions and group policy, so the rest is manual.

  • Critical: fix today. Usually open access plus tools, a reachable Gateway without auth, or readable secrets.
  • Warn: fix soon, or write down why you accept it. Often permissions, short tokens or risky tool settings.
  • Info: context, such as Tailscale Serve being on or suppressions being active.
  • --deep adds a live Gateway check and skill and plugin code scans. --fix doesn't rotate keys, change your bind or remove skills.

How do I run it?

Run these on the machine where your Gateway runs:

openclaw security audit
openclaw security audit --deep
openclaw security audit --deep --json

The plain audit reads your config, file permissions and install records. --deep also tries a live connection to the running Gateway and scans installed skill and plugin code. --json gives the same findings in a form tools can read. Use --deep whenever you can, because some findings only appear with it.

How do I read the output?

The text output starts with a Summary: line, then CRITICAL, WARN and INFO sections. Each finding has a checkId (a stable name such as fs.config.perms_world_readable), a title, some detail and often a Fix: line. The checkId is the part to search for. Its first word tells you which area of OpenClaw it's about.

Some checkIds are listed as warn/critical. That means the same check can come out at either level depending on your setup. For example, it may be a warning on a loopback-only Gateway and critical once the Gateway is reachable from a network.

What should I fix first?

OpenClaw's own docs give this order:

  1. Anything "open" with tools enabled. Lock down who can message the agent (pairing or allowlists) first, then tighten tools and sandboxing.
  2. Public network exposure: a LAN bind, Tailscale Funnel or missing auth. Fix it right away.
  3. Remote browser control. Treat it like admin access.
  4. Permissions. State, config, credentials and auth files must not be readable by other users.
  5. Plugins. Load only what you explicitly trust.

Within each step, do criticals before warnings. Change one thing at a time and re-run the audit after each change, so you know what fixed what.

What do the finding families mean?

fs.* (file permissions)

These are about who else on the machine can read or change OpenClaw's files. ~/.openclaw holds your config, channel credentials, model keys and session transcripts. A world-readable config (fs.config.perms_world_readable) or writable state directory is critical, because another user or process could read your tokens or change your settings. fs.synced_dir warns that your state sits in iCloud, Dropbox or Drive, which spreads copies of your keys and chats.

Fix: the docs want 700 on directories and 600 on files. openclaw security audit --fix and openclaw doctor can tighten these for you. Move state out of synced folders by hand.

gateway.* (who can reach your agent)

The Gateway is the part of OpenClaw that listens on a network port (18789 by default) and serves the Control UI. These findings are the most serious ones:

Fix: keep gateway.bind on loopback unless you have a reason not to, use token auth with a long random token (openclaw doctor --generate-gateway-token makes one), and reach the dashboard through an SSH tunnel or Tailscale Serve. Our exposure guide walks through checking this from outside.

To change a setting with the CLI, stop the Gateway first. The docs say config set needs the local Gateway stopped:

openclaw gateway stop
openclaw config set gateway.bind loopback
openclaw gateway start

If you run OpenClaw in Docker, the container image defaults to an exposed bind. Change the setting through your container's config and recreate the container instead.

security.exposure.* and channels.* (who can talk to it)

These combine two things: who can message your agent, and what it can do when they do. security.exposure.open_groups_with_elevated (critical) means an open DM or group can reach tools that run outside the sandbox. channels.<provider>.dm.open (critical) means anyone on that chat app can DM your bot. This is the first item in OpenClaw's fix order for a reason: one message from a stranger can steer the agent's tools.

Fix: use pairing or allowlist for DMs, require mentions in groups, and keep shell and file tools off for any agent that strangers can reach. --fix does switch open group policies to allowlists. It doesn't change DM policy or tools.

tools.exec.* and sandbox.* (what the agent can run)

tools.exec.security_full_configured means the agent can run any shell command on the host. sandbox.dangerous_bind_mount (critical) means the sandbox can see system folders, credential folders or the Docker socket, which defeats the point of a sandbox. tools.exec.auto_allow_skills_enabled means command approvals automatically trust programs that skills bring with them.

Fix: set exec to deny or ask, and turn on the sandbox for anything that reads outside content. The exact settings are in OpenClaw's hardened baseline, which our checklist links to.

skills.* and plugins.* (code you installed)

Plugins run inside the Gateway, and skill folders should be treated as trusted code. skills.code_safety and plugins.code_safety (warn or critical, --deep only) mean OpenClaw's own scan found suspicious patterns in installed code. *.scan_truncated means the scan hit its size limit and didn't read every file. That doesn't mean anything bad was found. It means some files weren't checked. plugins.installs_unpinned_npm_specs and _missing_integrity mean installs aren't pinned to an exact version.

Fix: remove anything you don't recognize, prefer pinned versions, and set an explicit plugins.allow list. A clean code scan is not proof a skill is harmless. The scan looks for patterns and has limits.

browser.*, hooks.* and config.*

browser.control_no_auth (critical) means remote browser control has no token or password. Treat browser control like admin access. hooks.token_reuse_gateway_token (critical) means your webhook token also unlocks the Gateway, so one leak gives away both. config.insecure_or_dangerous_flags means a debug setting starting with dangerously is on. Turn it off outside testing.

When should I worry?

Act today if any of these are true:

If you think someone else may already have had access, don't just fix the setting. Follow OpenClaw's incident steps: contain (stop the Gateway and set the bind to loopback), rotate (Gateway token, remote client secrets, model and channel keys), then review logs with openclaw logs and re-run openclaw security audit --deep.

A warning you understand and accept is fine. Write down why, so the next audit doesn't surprise you.

What does --fix do, and what doesn't it do?

openclaw security audit --fix

--fix is deliberately narrow. It does: switch open group policies to allowlists, and tighten state, config and include-file permissions (600 files, 700 directories).

It doesn't: rotate tokens or API keys, disable tools, change your bind, auth or network exposure, or remove plugins and skills. Those are the fixes that matter most for exposure and key theft, and you make them yourself.

What are suppressions?

If you've decided to accept a finding, you can suppress it under security.audit.suppressions in your config. Suppressed findings move out of the main list into suppressedFindings in the JSON output, and the audit always shows security.audit.suppressions.active as an info line. If you see that line on a setup you didn't configure, find out who added the suppressions and why.

Every finding we explain

checkIdWhat it meansWhat to do first
browser.control_no_authBrowser control is exposed without a passwordTurn on gateway auth.
config.secrets.gateway_password_in_configYour gateway password is saved in plain text in the config fileMove it to an environment variable or secret reference.
config.secrets.hooks_token_in_configYour webhook token is saved in plain text in the config fileMove it to a secret reference.
discovery.mdns_full_modeYour agent announces details about this machine on the local networkSwitch mDNS to a less revealing mode (check the docs for the values your version supports).
fs.auth_profiles.perms_readableYour stored model keys can be read by other usersTighten permissions, then rotate any key you think was exposed.
fs.config.perms_world_readableEvery user on this machine can read your agent's config (and keys)Let OpenClaw tighten the permissions (it uses chmod 600).
fs.config.perms_writableOther users can change your agent's configTighten permissions.
fs.credentials_dir.perms_readableYour channel credentials folder can be read by other usersTighten permissions.
fs.state_dir.perms_world_writableAnyone on this machine can change your agent's state folderTighten permissions.
fs.synced_dirYour agent's files live in a synced folder (iCloud/Dropbox/Drive)Move OpenClaw state and config out of the synced folder.
gateway.auth_no_rate_limitNo limit on password guessesAdd a rate limit (OpenClaw's own suggested values below).
gateway.bind_no_authYour agent's gateway is reachable from other machines without a passwordPut the gateway back on this machine only, or turn on token auth before exposing it.
gateway.control_ui.allowed_origins_requiredYour control panel accepts browser connections from any websiteList the exact address(es) you open the Control UI from.
gateway.control_ui.allowed_origins_wildcardYour control panel trusts every website ('*')Replace '*' with the exact address you use.
gateway.control_ui.host_header_origin_fallbackA 'dangerous' origin fallback is switched onTurn the fallback off.
gateway.http.no_authYour gateway's HTTP API accepts requests without a passwordSet an auth mode and generate a token.
gateway.loopback_no_authYour gateway has no password, and a proxy may be forwarding outside traffic to itTurn on token auth even on loopback when any proxy is involved.
gateway.probe_failedThe live gateway check couldn't finishMake sure the gateway is running, then run the audit again.
gateway.real_ip_fallback_enabledYour gateway trusts a header that can be fakedTurn the fallback off and list your real proxies.
gateway.tailscale_funnelTailscale Funnel puts your agent on the public internetSwitch from Funnel to Serve, which keeps access inside your tailnet.
gateway.token_placeholder_valueYour gateway 'password' is a placeholder like 'undefined'Generate a real token.
gateway.token_too_shortYour gateway token is shortGenerate a new, long token and update anything that uses the old one.
gateway.trusted_proxy_no_proxiesProxy login is on, but no proxy is trustedList your proxy's IPs in gateway.trustedProxies, or switch back to token auth.
hooks.path_rootWebhooks are served at '/'Move hooks to their own path and update senders.
hooks.token_reuse_gateway_tokenYour webhook token is the same as your gateway passwordLet OpenClaw rotate the hooks token, then update the services that send webhooks.
hooks.token_too_shortYour webhook token is shortRotate to a long random token.
models.small_paramsA small model has risky toolsSandbox those sessions or disable web tools for small models.
plugins.code_safetyA plugin contains suspicious codeDisable the plugin unless you've reviewed the flagged code.
plugins.extensions_no_allowlistPlugins load without an allowlistList only the plugins you trust in plugins.allow.
plugins.tools_reachable_permissive_policyPlugin tools are reachable under a permissive tool policySet an explicit plugin allowlist and tighten tools.profile.
sandbox.dangerous_bind_mountThe sandbox can see sensitive host foldersRemove that bind mount.
sandbox.dangerous_network_modeThe sandbox shares the host's networkUse a normal bridge network for the sandbox.
security.audit.suppressions.activeSome audit findings are hidden by your suppressionsReview your suppressions, or paste the --json output (it lists suppressed findings).
security.exposure.open_channels_with_execShared or public rooms can reach an agent that runs commandsRestrict the room policy or remove exec from that agent.
security.exposure.open_groups_with_control_plane_toolsOpen chats can change your agent's settings or schedulesLock down open policies and remove gateway/cron tools from those contexts.
security.exposure.open_groups_with_elevatedOpen chats can reach powerful toolsLock down DMs/groups first (pairing/allowlists), then tighten tools.
security.exposure.open_groups_with_runtime_or_fsOpen chats can reach command or file toolsSwitch open policies to allowlist (OpenClaw can do this), and sandbox the agent.
skills.code_safetyA skill contains suspicious codeRemove the skill unless you've reviewed the flagged code.
summary.attack_surfaceAttack-surface summary (for information)Nothing to do; it's a summary.
tools.exec.agent_skill_mcp_boundary_driftSkills may reach MCP servers and their credentialsIsolate exec (sandbox/OS user) and scope MCP credentials.
tools.exec.auto_allow_skills_enabledSkills can run programs without asking youTurn off auto-allow for skills in your exec approvals.
tools.exec.security_full_configuredYour agent can run any command on this machineIf others can message your agent, require approvals or an allowlist for exec.

What should I do after fixing things?

Re-run openclaw security audit --deep and confirm the criticals are gone. Then work through the rest of our 12-point checklist, which covers what the audit can't see, such as spend limits and versions. For more on OpenClaw specifically, see the OpenClaw hub. To have your output read for you, paste it into the free check. Terms like gateway and loopback are in the glossary.

Frequently asked questions

What does "critical" mean in openclaw security audit?

OpenClaw marks a finding critical when it can directly let someone else control your agent or read its secrets, for example a Gateway reachable without auth or a config file other users can read. Fix these before anything else.

Which findings should I fix first?

OpenClaw's docs give an order: anything open to strangers with tools enabled, then public network exposure, then remote browser control, then file permissions, then plugins. Within that, criticals before warnings.

What does --deep add?

It adds a best-effort live check against your running Gateway and scans installed skill and plugin code. Findings such as skills.code_safety and gateway.probe_failed only appear with --deep.

Does --fix fix everything?

No. It switches open group policies to allowlists and tightens file permissions. It doesn't rotate tokens or API keys, disable tools, change your bind, auth or network exposure, or remove plugins and skills.

Is a clean audit enough?

It's a good sign, not a guarantee. The audit doesn't check your provider spend limits or what changes after it runs, and a code scan can't judge everything a skill does. Re-run it after every upgrade, new skill or config change.

Sources

  1. OpenClaw docs: openclaw security (CLI)
  2. OpenClaw docs: running the security audit
  3. OpenClaw docs: security audit checks (checkId catalog)
  4. OpenClaw docs: network exposure
  5. OpenClaw docs: secrets, storage and logs
  6. OpenClaw docs: openclaw config (CLI)
  7. OpenClaw docs: operator incident response