OpenClaw Security Audit Check IDs Reference

Reference catalog of checkIds emitted by the openclaw security audit, including severity, impact, and fix paths. Essential for developers and operators interpreting audit findings and hardening gateway deployments.

Read this when

  • You saw a specific `checkId` in `openclaw security audit` output and want to know what it means
  • You need the fix key/path for a given finding
  • You are triaging severity across a security audit run

openclaw security audit produces structured findings that are identified by checkId. This page serves as the reference catalog for those IDs. For the high-level threat model and hardening guidance, see Security.

Certain checks require openclaw security audit --deep: plugin and skill code scans (plugins.code_safety*, skills.code_safety*) as well as live Gateway probe checks (gateway.probe_*). All other entries in this table operate on a standard openclaw security audit.

A severity such as warn/critical indicates that the same checkId can be issued at either level, depending on configuration (for instance, whether the Gateway is exposed remotely). High-signal values you are most likely to encounter in actual deployments (not exhaustive):

checkIdSeverityWhy it mattersPrimary fix key/pathAuto-fix
fs.state_dir.perms_world_writablecriticalFull OpenClaw state can be altered by other users or processesfilesystem perms on ~/.openclawyes
fs.state_dir.perms_group_writablewarnGroup members have write access to the entire OpenClaw statefilesystem perms on ~/.openclawyes
fs.state_dir.perms_readablewarnState directory is readable by anyone outside the ownerfilesystem perms on ~/.openclawyes
fs.state_dir.symlinkwarnState dir target shifts into a separate trust domainstate dir filesystem layoutno
fs.config.perms_writablecriticalAuth, tool policy, or config can be changed by outsidersfilesystem perms on ~/.openclaw/openclaw.jsonyes
fs.config.symlinkwarnSymlinked config files block writes and introduce a new trust boundaryuse a regular config file or set OPENCLAW_CONFIG_PATH to the actual fileno
fs.config.perms_group_readablewarnConfig tokens and settings are readable by group usersfilesystem perms on config fileyes
fs.config.perms_world_readablecriticalTokens and settings may be exposed through the configfilesystem perms on config fileyes
fs.config_include.perms_writablecriticalOthers can tamper with the config include fileinclude-file perms referenced from openclaw.jsonyes
fs.config_include.perms_group_readablewarnGroup users can view secrets and settings pulled in via includesinclude-file perms referenced from openclaw.jsonyes
fs.config_include.perms_world_readablecriticalIncluded secrets and settings are open to all usersinclude-file perms referenced from openclaw.jsonyes
fs.auth_profiles.perms_writablecriticalStored model credentials can be injected or swapped by othersagents/<agentId>/agent/auth-profiles.json permsyes
fs.auth_profiles.perms_readablewarnAPI keys and OAuth tokens are readable by othersagents/<agentId>/agent/auth-profiles.json permsyes
fs.credentials_dir.perms_writablecriticalChannel pairing and credential state can be changed by othersfilesystem perms on ~/.openclaw/credentialsyes
fs.credentials_dir.perms_readablewarnChannel credential state is readable by othersfilesystem perms on ~/.openclaw/credentialsyes
fs.sessions_store.perms_readablewarnSession transcripts and metadata can be read by otherssession store permsyes
fs.log_file.perms_readablewarnRedacted logs still hold sensitive data and are readable by othersgateway log file permsyes
fs.synced_dirwarniCloud/Dropbox/Drive storage of state/config widens token and transcript exposurerelocate config and state outside synced foldersno
gateway.bind_no_authcriticalRemote bind active without a shared secretgateway.bind, gateway.auth.*no
gateway.loopback_no_authcriticalLoopback behind a reverse proxy may lose authenticationgateway.auth.*, proxy setupno
gateway.trusted_proxies_missingwarnReverse-proxy headers exist but are not trustedgateway.trustedProxiesno
gateway.http.no_authwarn/criticalGateway HTTP APIs are exposed with auth.mode="none"gateway.auth.mode, gateway.http.endpoints.*, plugins.entries.admin-http-rpcno
gateway.http.session_key_override_enabledinfoHTTP API callers can override sessionKeygateway.http.allowSessionKeyOverrideno
gateway.tools_invoke_http.dangerous_allowwarn/criticalDangerous tools become available again over HTTP API for owner/admin callersgateway.tools.allowno
gateway.nodes.allow_commands_dangerouswarn/criticalHigh-impact node commands (desktop input/camera/screen/contacts/calendar/SMS) get enabledgateway.nodes.commands.allowno
gateway.nodes.deny_commands_ineffectivewarnPattern-like deny entries fail to match shell text or groupsgateway.nodes.commands.denyno
gateway.tailscale_funnelcriticalDirect exposure to the public internetgateway.tailscale.modeno
gateway.tailscale_serveinfoTailnet exposure is turned on through Servegateway.tailscale.modeno
gateway.control_ui.allowed_origins_requiredcriticalNon-loopback Control UI without an explicit browser-origin allowlistgateway.controlUi.allowedOriginsno
gateway.control_ui.allowed_origins_wildcardwarn/criticalBrowser-origin allowlisting gets switched off by allowedOrigins=["*"]gateway.controlUi.allowedOriginsno
gateway.control_ui.host_header_origin_fallbackwarn/criticalHost-header origin fallback becomes active, weakening DNS rebinding defensesgateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackno
gateway.real_ip_fallback_enabledwarn/criticalSource-IP spoofing becomes possible when X-Real-IP fallback is trusted due to proxy misconfiggateway.allowRealIpFallback, gateway.trustedProxiesno
gateway.token_too_shortwarnBrute forcing a short shared token is less difficultgateway.auth.tokenno
gateway.auth_no_rate_limitwarnBrute-force risk climbs when auth is exposed without rate limitinggateway.auth.rateLimitno
gateway.trusted_proxy_authcriticalThe auth boundary shifts to proxy identitygateway.auth.mode="trusted-proxy"no
gateway.trusted_proxy_no_proxiescriticalTrusted-proxy auth becomes unsafe without trusted proxy IPsgateway.trustedProxiesno
gateway.trusted_proxy_no_user_headercriticalUser identity cannot be safely determined through trusted-proxy authgateway.auth.trustedProxy.userHeaderno
gateway.trusted_proxy_no_allowlistwarnAny authenticated upstream user is accepted by trusted-proxy authgateway.auth.trustedProxy.allowUsersno
gateway.trusted_proxy_allow_loopbackwarnExplicitly allowed loopback proxy sources are accepted by trusted-proxy authgateway.auth.trustedProxy.allowLoopbackno
gateway.probe_auth_secretref_unavailablewarnAuth SecretRefs could not be resolved by the deep probe in this command pathdeep-probe auth source / SecretRef availabilityno
gateway.probe_failedwarnThe live Gateway probe did not succeed (--deep only)gateway reachability/authno
discovery.mdns_full_modewarn/criticalmDNS full mode puts cliPath/sshPort metadata on the local networkdiscovery.mdns.mode, gateway.bindno
config.insecure_or_dangerous_flagswarnOne insecure or dangerous debug flag is turned onkey named in finding detailno
security.audit.suppressions.activeinfoSuppressions configured in audit output can cause filteringsecurity.audit.suppressionsno
config.secrets.gateway_password_in_configwarnThe Gateway password sits in config as plain textgateway.auth.passwordno
config.secrets.hooks_token_in_configwarnThe hook bearer token sits in config as plain texthooks.tokenno
hooks.token_reuse_gateway_tokencriticalGateway auth is also opened by the hook ingress tokenhooks.token, gateway.auth.token, gateway.auth.passwordno
hooks.token_too_shortwarnBrute force on hook ingress becomes simplerhooks.tokenno
hooks.default_session_key_unsetwarnHook agent runs spread into generated per-request sessionshooks.defaultSessionKeyno
hooks.allowed_agent_ids_unrestrictedwarn/criticalAuthenticated hook callers can reach any configured agenthooks.allowedAgentIdsno
hooks.request_session_key_enabledwarn/criticalsessionKey selection is left to the external callerhooks.allowRequestSessionKeyno
hooks.request_session_key_prefixes_missingwarn/criticalExternal session key shapes have no boundhooks.allowedSessionKeyPrefixesno
hooks.path_rootcriticalIngress collisions or misroutes get easier because the hook path is /hooks.pathno
hooks.installs_unpinned_npm_specswarnHook install records lack pinning to immutable npm specshook install metadatano
hooks.installs_missing_integritywarnIntegrity metadata is missing from hook install recordshook install metadatano
hooks.installs_version_driftwarnInstalled packages and hook install records fall out of synchook install metadatano
browser.control_invalid_configwarnBrowser control config is invalid before runtimebrowser.*no
browser.control_no_authcriticalToken or password authentication is absent from exposed browser controlgateway.auth.*no
browser.remote_cdp_httpwarnTransport encryption is missing for remote CDP over plain HTTPbrowser profile cdpUrlno
browser.remote_cdp_private_hostwarnRemote CDP points at a private or internal hostbrowser profile cdpUrl, browser.ssrfPolicy.*no
browser.extension_relay_legacy_authwarnLegacy extension relay still has bearer, Basic, or token authentication activebrowser.extensionRelay.allowLegacyAuthno
sandbox.docker_config_mode_offwarnSandbox Docker configuration exists but is not in useagents.*.sandbox.modeno
sandbox.bind_mount_non_absolutewarnRelative bind mounts may resolve in unexpected waysagents.*.sandbox.docker.binds[]no
sandbox.dangerous_bind_mountcriticalBind mounts in the sandbox target blocked system, credential, or Docker socket pathsagents.*.sandbox.docker.binds[]no
sandbox.dangerous_network_modecriticalSandbox Docker network joins the host or container:* namespaceagents.*.sandbox.docker.networkno
sandbox.dangerous_seccomp_profilecriticalContainer isolation is weakened by the sandbox seccomp profileagents.*.sandbox.docker.securityOptno
sandbox.dangerous_apparmor_profilecriticalContainer isolation is weakened by the sandbox AppArmor profileagents.*.sandbox.docker.securityOptno
sandbox.browser_cdp_bridge_unrestrictedwarnSandbox browser bridge has no source-range restriction on its exposuresandbox.browser.cdpSourceRangeno
sandbox.browser_container.non_loopback_publishcriticalCDP is published on non-loopback interfaces by the existing browser containerbrowser sandbox container publish configno
sandbox.browser_container.hash_label_missingwarnCurrent config-hash labels are missing from the existing browser containeropenclaw sandbox recreate --browser --allno
sandbox.browser_container.hash_epoch_stalewarnThe existing browser container is older than the current browser config epochopenclaw sandbox recreate --browser --allno
sandbox.browser_container.docker_probe_timeoutwarnThe Docker label probe for the browser container did not respond in timeDocker daemon reachabilityno
tools.exec.host_sandbox_no_sandbox_defaultswarnexec host=sandbox closes off when sandbox is disabledtools.exec.host, agents.defaults.sandbox.modeno
tools.exec.host_sandbox_no_sandbox_agentswarnPer-agent exec host=sandbox closes off when sandbox is disabledagents.entries.*.tools.exec.host, agents.entries.*.sandbox.modeno
tools.exec.security_full_configuredwarn/criticalHost exec operates with security="full"tools.exec.security, agents.entries.*.tools.exec.securityno
tools.exec.agent_skill_mcp_boundary_driftwarnAgent skill allowlists exist while host exec can access MCP clients or registriesagents.entries.*.tools.exec.*, sandbox/OS isolation, MCP server credentialsno
tools.exec.fs_tools_disabled_but_exec_enabledwarnShell execution is not forced read-only by the filesystem tool policytools.deny, agents.entries.*.tools.deny, agents.*.sandbox.workspaceAccessno
tools.exec.auto_allow_skills_enabledwarnSkill bins are trusted without question by exec approvalshost approvals fileno
tools.exec.allowlist_interpreter_without_strict_inline_evalwarnInline eval is allowed by interpreter allowlists without mandatory reapprovaltools.exec.strictInlineEval, agents.entries.*.tools.exec.strictInlineEval, exec approvals allowlistno
tools.exec.safe_bins_interpreter_unprofiledwarnInterpreter and runtime bins in safeBins lack explicit profiles, raising exec risktools.exec.safeBins, tools.exec.safeBinProfiles, agents.entries.*.tools.exec.*no
tools.exec.safe_bins_broad_behaviorwarnThe low-risk stdin-filter trust model is undermined by broad-behavior tools in safeBinstools.exec.safeBins, agents.entries.*.tools.exec.safeBinsno
tools.exec.safe_bin_trusted_dirs_riskywarnMutable or risky directories are included by safeBinTrustedDirstools.exec.safeBinTrustedDirs, agents.entries.*.tools.exec.safeBinTrustedDirsno
tools.elevated.allowFrom.<provider>.wildcardcriticalEvery sender gets approval because tools.elevated.allowFrom.<provider> includes "*"tools.elevated.allowFrom.<provider>no
tools.elevated.allowFrom.<provider>.largewarnMore than 25 entries sit in the elevated allowlist for <provider>tools.elevated.allowFrom.<provider>no
skills.workspace.symlink_escapewarnWorkspace skills/**/SKILL.md lands outside the workspace root due to symlink-chain driftworkspace skills/** filesystem stateno
skills.workspace.scan_truncatedwarnThe workspace skill scan stopped early after hitting its directory-visit capflatten/simplify the workspace skills/ directory treeno
plugins.extensions_no_allowlistwarnPlugins get installed with no explicit plugin allowlist in placeplugins.allowlistno
plugins.allow_phantom_entrieswarnAn ID in plugins.allow has no installed plugin that matches itplugins.allowno
plugins.installs_unpinned_npm_specswarnPlugin index records are not pinned down to immutable npm specsplugin install metadatano
plugins.installs_missing_integritywarnIntegrity metadata is missing from plugin index recordsplugin install metadatano
plugins.installs_version_driftwarnInstalled packages drift from what plugin index records describeplugin install metadatano
plugins.code_safetywarn/criticalSuspicious or dangerous patterns turned up in the plugin code scan (--deep only)plugin code / install sourceno
plugins.code_safety.entry_pathwarnThe plugin entry path heads into hidden or node_modules spotsplugin manifest entryno
plugins.code_safety.entry_escapecriticalThe plugin entry breaks out of the plugin directoryplugin manifest entryno
plugins.code_safety.manifest_parse_errorwarnParsing the plugin manifest failed during the code-safety scanplugin manifest fileno
plugins.code_safety.scan_failedwarnThe plugin code scan never finished (--deep only)plugin path / scan environmentno
plugins.<pluginId>.security_audit_failedwarnA security audit collector owned by a plugin raised an errorthat plugin's security-audit collectorno
skills.code_safetywarn/criticalSuspicious or dangerous patterns appear in skill installer metadata/code (--deep only)skill install sourceno
skills.code_safety.scan_failedwarnThe skill code scan could not wrap up (--deep only)skill scan environmentno
channels.discord.allowlisted_groups.broad_memberswarnAllowlisted Discord guild/channel targets carry no member or role restrictionchannels.discord.guilds.*.users/roles, per-channel users/rolesno
security.exposure.open_channels_with_execwarn/criticalExec-enabled agents are reachable from shared/public roomschannels.*.dmPolicy, channels.*.groupPolicy, tools.exec.*, agents.entries.*.tools.exec.*no
security.exposure.open_groups_with_elevatedcriticalHigh-impact prompt-injection paths emerge from open DMs/groups plus elevated toolstop-level or nested DM policy paths, account overrides, channels.*.groupPolicyno
security.exposure.open_groups_with_runtime_or_fscritical/warnCommand/file tools are reachable from open DMs/groups without sandbox/workspace guardsDM/group policy paths, tools.profile/deny, tools.fs.workspaceOnly, agents.*.sandbox.modeno
security.exposure.open_groups_with_control_plane_toolscriticalGateway and cron control-plane tools are reachable through open DMs or groupsDM/group policy paths, tools.allow, tools.alsoAllow, tools.profile, gateway, cronno
security.trust_model.multi_user_heuristicwarnConfiguration suggests multi-user setup while gateway trust model assumes a personal assistantsplit trust boundaries, or shared-user hardening (sandbox.mode, tool deny/workspace scoping)no
tools.profile_minimal_overriddenwarnGlobal minimal profile is bypassed by agent overridesagents.entries.*.tools.profileno
plugins.tools_reachable_permissive_policywarnExtension tools are accessible in permissive contextstools.profile + tool allow/denyno
models.legacywarnLegacy model families remain in configurationmodel selectionno
models.weak_tierwarnConfigured models fall below current recommended tiersmodel selectionno
models.small_paramscritical/infoInjection risk rises with small models and unsafe tool surfaces raise injection riskmodel choice + sandbox/tool policyno
channels.<provider>.dm.opencritical<provider> DM policy is "open"; the bot can be DMed by anyonechannels.<provider>.dmPolicy, .allowFromno
channels.<provider>.dm.open_invalidwarndmPolicy="open" without "*" in allowFrom is inconsistentchannels.<provider>.allowFromno
channels.<provider>.dm.scope_main_multiuserwarnThe main session is currently shared by multiple DM senderssession.dmScopeno
channels.<provider>.allowFrom.dangerous_name_matching_enabledinfodangerouslyAllowNameMatching re-enables mutable name/email/tag sender matchingdisable dangerouslyAllowNameMatching, use stable sender IDsno
channels.<provider>.account.read_only_resolutionwarnA channel account could not be fully resolved for audit (missing secret/gateway)ensure referenced secrets are resolvable, or run against a live gateway snapshotno
channels.<provider>.warning.<n>info/warn/criticalProvider-specific security warning, classified from free-form plugin textsee finding detailno
summary.attack_surfaceinfoRoll-up summary of auth, channel, tool, and exposure posturemultiple keys (see finding detail)no

channels.<provider>.* and tools.elevated.allowFrom.<provider>.* checkIds are generated per configured channel/provider, so <provider> is a real channel id (for example telegram, discord) in actual output, not a literal string.

2,665 words · updated Aug 25, 2026