OpenClaw Security Audit Check IDs Reference Catalog

Reference catalog of checkIds emitted by the openclaw security audit command. Covers severity levels, deep scan requirements, and auto-fix capabilities for Gateway, plugin, and skill code checks.

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 outputs structured findings 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*) and 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 the same checkId can be emitted at either level depending on configuration (for instance, whether the Gateway is exposed remotely). High-signal values you will most likely encounter in real deployments (not exhaustive):

checkIdSeverityWhy it mattersPrimary fix key/pathAuto-fix
fs.state_dir.perms_world_writablecriticalOther users or processes can modify the entire OpenClaw statefilesystem perms on ~/.openclawyes
fs.state_dir.perms_group_writablewarnGroup members can modify the full OpenClaw statefilesystem perms on ~/.openclawyes
fs.state_dir.perms_readablewarnThe state directory is readable by othersfilesystem perms on ~/.openclawyes
fs.state_dir.symlinkwarnThe state directory target crosses into another trust boundarystate dir filesystem layoutno
fs.config.perms_writablecriticalOthers can alter auth, tool policy, or configfilesystem perms on ~/.openclaw/openclaw.jsonyes
fs.config.symlinkwarnSymlinked config files are not supported for writes and introduce an extra trust boundaryreplace with a regular config file or point OPENCLAW_CONFIG_PATH at the real fileno
fs.config.perms_group_readablewarnGroup users can read config tokens and settingsfilesystem perms on config fileyes
fs.config.perms_world_readablecriticalConfig can expose tokens and settingsfilesystem perms on config fileyes
fs.config_include.perms_writablecriticalOthers can modify the config include fileinclude-file perms referenced from openclaw.jsonyes
fs.config_include.perms_group_readablewarnGroup users can read included secrets and settingsinclude-file perms referenced from openclaw.jsonyes
fs.config_include.perms_world_readablecriticalIncluded secrets and settings are world-readableinclude-file perms referenced from openclaw.jsonyes
fs.auth_profiles.perms_writablecriticalOthers can inject or replace stored model credentialsagents/<agentId>/agent/auth-profiles.json permsyes
fs.auth_profiles.perms_readablewarnOthers can read API keys and OAuth tokensagents/<agentId>/agent/auth-profiles.json permsyes
fs.credentials_dir.perms_writablecriticalOthers can modify channel pairing or credential statefilesystem perms on ~/.openclaw/credentialsyes
fs.credentials_dir.perms_readablewarnOthers can read channel credential statefilesystem perms on ~/.openclaw/credentialsyes
fs.sessions_store.perms_readablewarnOthers can read session transcripts and metadatasession store permsyes
fs.log_file.perms_readablewarnOthers can read redacted but still sensitive logsgateway log file permsyes
fs.synced_dirwarnState or config in iCloud, Dropbox, or Drive broadens token and transcript exposuremove config/state off synced foldersno
gateway.bind_no_authcriticalRemote bind without a shared secretgateway.bind, gateway.auth.*no
gateway.loopback_no_authcriticalA reverse-proxied loopback may become unauthenticatedgateway.auth.*, proxy setupno
gateway.trusted_proxies_missingwarnReverse-proxy headers are present but not trustedgateway.trustedProxiesno
gateway.http.no_authwarn/criticalGateway HTTP APIs are reachable 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/criticalRe-enables dangerous tools over HTTP API for owner or admin callersgateway.tools.allowno
gateway.nodes.allow_commands_dangerouswarn/criticalEnables high-impact node commands (desktop input, camera, screen, contacts, calendar, SMS)gateway.nodes.commands.allowno
gateway.nodes.deny_commands_ineffectivewarnPattern-like deny entries do not match shell text or groupsgateway.nodes.commands.denyno
gateway.tailscale_funnelcriticalPublic internet exposuregateway.tailscale.modeno
gateway.tailscale_serveinfoTailnet exposure is enabled via 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/criticalallowedOrigins=["*"] disables browser-origin allowlistinggateway.controlUi.allowedOriginsno
gateway.control_ui.host_header_origin_fallbackwarn/criticalEnables Host-header origin fallback (downgrades DNS rebinding hardening)gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackno
gateway.control_ui.insecure_authwarnInsecure-auth compatibility toggle is enabledgateway.controlUi.allowInsecureAuthno
gateway.control_ui.device_auth_disabledcriticalRetired device-auth bypass migration still permits remediation accesscomplete Secure this browser pairing (gateway.controlUi.deviceAuthMigration state)no
gateway.real_ip_fallback_enabledwarn/criticalTrusting X-Real-IP fallback can enable source-IP spoofing via proxy misconfiggateway.allowRealIpFallback, gateway.trustedProxiesno
gateway.token_too_shortwarnA short shared token is easier to brute forcegateway.auth.tokenno
gateway.auth_no_rate_limitwarnExposed auth without rate limiting increases brute-force riskgateway.auth.rateLimitno
gateway.trusted_proxy_authcriticalProxy identity now becomes the auth boundarygateway.auth.mode="trusted-proxy"no
gateway.trusted_proxy_no_proxiescriticalTrusted-proxy auth without trusted proxy IPs is unsafegateway.trustedProxiesno
gateway.trusted_proxy_no_user_headercriticalTrusted-proxy auth cannot resolve user identity safelygateway.auth.trustedProxy.userHeaderno
gateway.trusted_proxy_no_allowlistwarnTrusted-proxy auth accepts any authenticated upstream usergateway.auth.trustedProxy.allowUsersno
gateway.trusted_proxy_allow_loopbackwarnTrusted-proxy auth accepts explicitly allowed loopback proxy sourcesgateway.auth.trustedProxy.allowLoopbackno
gateway.probe_auth_secretref_unavailablewarnDeep probe could not resolve auth SecretRefs in this command pathdeep-probe auth source / SecretRef availabilityno
gateway.probe_failedwarnLive Gateway probe failed (--deep only)gateway reachability/authno
discovery.mdns_full_modewarn/criticalmDNS full mode advertises cliPath/sshPort metadata on the local networkdiscovery.mdns.mode, gateway.bindno
config.insecure_or_dangerous_flagswarnOne insecure or dangerous debug flag is enabledkey named in finding detailno
security.audit.suppressions.activeinfoAudit output has configured suppressions and may be filteredsecurity.audit.suppressionsno
config.secrets.gateway_password_in_configwarnGateway password is stored directly in configgateway.auth.passwordno
config.secrets.hooks_token_in_configwarnHook bearer token is stored directly in confighooks.tokenno
hooks.token_reuse_gateway_tokencriticalHook ingress token also unlocks Gateway authhooks.token, gateway.auth.token, gateway.auth.passwordno
hooks.token_too_shortwarnEasier brute force on hook ingresshooks.tokenno
hooks.default_session_key_unsetwarnHook agent runs fan out into generated per-request sessionshooks.defaultSessionKeyno
hooks.allowed_agent_ids_unrestrictedwarn/criticalAuthenticated hook callers may route to any configured agenthooks.allowedAgentIdsno
hooks.request_session_key_enabledwarn/criticalExternal caller can choose sessionKeyhooks.allowRequestSessionKeyno
hooks.request_session_key_prefixes_missingwarn/criticalNo bound on external session key shapeshooks.allowedSessionKeyPrefixesno
hooks.path_rootcriticalHook path is /, making ingress easier to collide or misroutehooks.pathno
hooks.installs_unpinned_npm_specswarnHook install records are not pinned to immutable npm specshook install metadatano
hooks.installs_missing_integritywarnHook install records lack integrity metadatahook install metadatano
hooks.installs_version_driftwarnHook install records drift from installed packageshook install metadatano
logging.redact_offwarnSensitive values leak to logs or statuslogging.redactSensitiveyes
browser.control_invalid_configwarnBrowser control config is invalid before runtimebrowser.*no
browser.control_no_authcriticalBrowser control exposed without token or password authgateway.auth.*no
browser.remote_cdp_httpwarnRemote CDP over plain HTTP lacks transport encryptionbrowser profile cdpUrlno
browser.remote_cdp_private_hostwarnRemote CDP targets a private or internal hostbrowser profile cdpUrl, browser.ssrfPolicy.*no
sandbox.docker_config_mode_offwarnSandbox Docker config present but inactiveagents.*.sandbox.modeno
sandbox.bind_mount_non_absolutewarnRelative bind mounts can resolve unpredictablyagents.*.sandbox.docker.binds[]no
sandbox.dangerous_bind_mountcriticalSandbox bind mount targets blocked system, credential, or Docker socket pathsagents.*.sandbox.docker.binds[]no
sandbox.dangerous_network_modecriticalSandbox Docker network uses host or container:* namespace-join modeagents.*.sandbox.docker.networkno
sandbox.dangerous_seccomp_profilecriticalSandbox seccomp profile weakens container isolationagents.*.sandbox.docker.securityOptno
sandbox.dangerous_apparmor_profilecriticalSandbox AppArmor profile weakens container isolationagents.*.sandbox.docker.securityOptno
sandbox.browser_cdp_bridge_unrestrictedwarnSandbox browser bridge is exposed without source-range restrictionsandbox.browser.cdpSourceRangeno
sandbox.browser_container.non_loopback_publishcriticalExisting browser container publishes CDP on non-loopback interfacesbrowser sandbox container publish configno
sandbox.browser_container.hash_label_missingwarnExisting browser container predates current config-hash labelsopenclaw sandbox recreate --browser --allno
sandbox.browser_container.hash_epoch_stalewarnExisting browser container predates current browser config epochopenclaw sandbox recreate --browser --allno
sandbox.browser_container.docker_probe_timeoutwarnDocker label probe for the browser container timed outDocker daemon reachabilityno
tools.exec.host_sandbox_no_sandbox_defaultswarnexec host=sandbox fails closed when sandbox is offtools.exec.host, agents.defaults.sandbox.modeno
tools.exec.host_sandbox_no_sandbox_agentswarnPer-agent exec host=sandbox fails closed when sandbox is offagents.entries.*.tools.exec.host, agents.entries.*.sandbox.modeno
tools.exec.security_full_configuredwarn/criticalHost exec is running with security="full"tools.exec.security, agents.entries.*.tools.exec.securityno
tools.exec.agent_skill_mcp_boundary_driftwarnAgent skill allowlists are present while host exec can reach MCP clients or registriesagents.entries.*.tools.exec.*, sandbox/OS isolation, MCP server credentialsno
tools.exec.fs_tools_disabled_but_exec_enabledwarnFilesystem tool policy does not make shell execution read-onlytools.deny, agents.entries.*.tools.deny, agents.*.sandbox.workspaceAccessno
tools.exec.auto_allow_skills_enabledwarnExec approvals trust skill bins implicitlyhost approvals fileno
tools.exec.allowlist_interpreter_without_strict_inline_evalwarnInterpreter allowlists permit inline eval without forced reapprovaltools.exec.strictInlineEval, agents.entries.*.tools.exec.strictInlineEval, exec approvals allowlistno
tools.exec.safe_bins_interpreter_unprofiledwarnInterpreter or runtime bins in safeBins without explicit profiles broaden exec risktools.exec.safeBins, tools.exec.safeBinProfiles, agents.entries.*.tools.exec.*no
tools.exec.safe_bins_broad_behaviorwarnBroad-behavior tools in safeBins weaken the low-risk stdin-filter trust modeltools.exec.safeBins, agents.entries.*.tools.exec.safeBinsno
tools.exec.safe_bin_trusted_dirs_riskywarnsafeBinTrustedDirs includes mutable or risky directoriestools.exec.safeBinTrustedDirs, agents.entries.*.tools.exec.safeBinTrustedDirsno
tools.elevated.allowFrom.<provider>.wildcardcriticaltools.elevated.allowFrom.<provider> includes "*", approving every sendertools.elevated.allowFrom.<provider>no
tools.elevated.allowFrom.<provider>.largewarnElevated allowlist for <provider> has more than 25 entriestools.elevated.allowFrom.<provider>no
skills.workspace.symlink_escapewarnWorkspace skills/**/SKILL.md resolves outside workspace root (symlink-chain drift)workspace skills/** filesystem stateno
skills.workspace.scan_truncatedwarnWorkspace skill scan hit its directory-visit cap before finishingflatten or simplify the workspace skills/ directory treeno
plugins.extensions_no_allowlistwarnPlugins are installed without an explicit plugin allowlistplugins.allowlistno
plugins.allow_phantom_entrieswarnplugins.allow lists an ID with no matching installed pluginplugins.allowno
plugins.installs_unpinned_npm_specswarnPlugin index records are not pinned to immutable npm specsplugin install metadatano
plugins.installs_missing_integritywarnPlugin index records lack integrity metadataplugin install metadatano
plugins.installs_version_driftwarnPlugin index records drift from installed packagesplugin install metadatano
plugins.code_safetywarn/criticalPlugin code scan found suspicious or dangerous patterns (--deep only)plugin code / install sourceno
plugins.code_safety.entry_pathwarnPlugin entry path points into hidden or node_modules locationsplugin manifest entryno
plugins.code_safety.entry_escapecriticalPlugin entry escapes the plugin directoryplugin manifest entryno
plugins.code_safety.manifest_parse_errorwarnPlugin manifest could not be parsed during the code-safety scanplugin manifest fileno
plugins.code_safety.scan_failedwarnPlugin code scan could not complete (--deep only)plugin path / scan environmentno
plugins.<pluginId>.security_audit_failedwarnA plugin-owned security audit collector threw an errorthat plugin's security-audit collectorno
skills.code_safetywarn/criticalSkill installer metadata or code contains suspicious or dangerous patterns (--deep only)skill install sourceno
skills.code_safety.scan_failedwarnSkill code scan could not complete (--deep only)skill scan environmentno
channels.discord.allowlisted_groups.broad_memberswarnAllowlisted Discord guild or channel targets have no member or role restrictionchannels.discord.guilds.*.users/roles, per-channel users/rolesno
security.exposure.open_channels_with_execwarn/criticalShared or public rooms can reach exec-enabled agentschannels.*.dmPolicy, channels.*.groupPolicy, tools.exec.*, agents.entries.*.tools.exec.*no
security.exposure.open_groups_with_elevatedcriticalOpen DMs or groups plus elevated tools create high-impact prompt-injection pathstop-level or nested DM policy paths, account overrides, channels.*.groupPolicyno
security.exposure.open_groups_with_runtime_or_fscritical/warnOpen DMs or groups can reach command or file tools without sandbox or workspace guardsDM/group policy paths, tools.profile/deny, tools.fs.workspaceOnly, agents.*.sandbox.modeno
security.exposure.open_groups_with_control_plane_toolscriticalOpen DMs or groups can reach gateway or cron control-plane toolsDM/group policy paths, tools.allow, tools.alsoAllow, tools.profile, gateway, cronno
security.trust_model.multi_user_heuristicwarnConfig looks multi-user while gateway trust model is personal-assistantsplit trust boundaries, or shared-user hardening (sandbox.mode, tool deny/workspace scoping)no
tools.profile_minimal_overriddenwarnAgent overrides bypass global minimal profileagents.entries.*.tools.profileno
plugins.tools_reachable_permissive_policywarnExtension tools reachable in permissive contextstools.profile + tool allow/denyno
models.legacywarnLegacy model families are still configuredmodel selectionno
models.weak_tierwarnConfigured models are below current recommended tiersmodel selectionno
models.small_paramscritical/infoSmall models plus unsafe tool surfaces raise injection riskmodel choice + sandbox/tool policyno
channels.<provider>.dm.opencritical<provider> DM policy is "open"; anyone can DM the botchannels.<provider>.dmPolicy, .allowFromno
channels.<provider>.dm.open_invalidwarndmPolicy="open" without "*" in allowFrom is inconsistentchannels.<provider>.allowFromno
channels.<provider>.dm.scope_main_multiuserwarnMultiple DM senders currently share the main sessionsession.dmScopeno
channels.<provider>.allowFrom.dangerous_name_matching_enabledinfodangerouslyAllowNameMatching re-enables mutable name, email, or 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 or 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 created for each configured channel and provider. This means <provider> is an actual channel identifier, such as telegram or discord, in the real output, not a fixed text string.