跳转到主要内容
个人助手信任模型。 本指南假定每个 Gateway 网关只有一个受信任的 操作员边界(单用户、个人助手模型)。 OpenClaw 不是 一个用于多个 对抗性用户共享一个智能体或 Gateway 网关的敌对多租户安全边界。对于混合信任或 对抗性用户运行方式,请拆分信任边界:单独的 Gateway 网关 + 凭证,最好使用单独的 OS 用户或主机。

范围:个人助手安全模型

  • 支持:每个 Gateway 网关一个用户/信任边界(最好每个边界一个 OS 用户/主机/VPS)。
  • 不支持:由相互不信任或对抗性用户使用的共享 Gateway 网关/智能体。
  • 对抗性用户隔离需要单独的 Gateway 网关(最好还有单独的 OS 用户/主机)。
  • 如果几个不受信任的用户可以向一个启用了工具的智能体发送消息,他们就共享该智能体被委托的工具权限。
  • 如果某人可以修改 Gateway 网关主机状态/配置(~/.openclaw,包括 openclaw.json),请将他们视为受信任的操作员。
  • 在一个 Gateway 网关内部,经过身份验证的操作员访问是受信任的控制平面角色,而不是按用户划分的租户角色。
  • sessionKey(会话 ID、标签)是路由选择器,不是授权令牌。
在更改远程访问、私信策略、反向代理或公共暴露之前,请先按照 Gateway 暴露运行手册 完成预检/回滚检查清单。

openclaw security audit

在任何配置更改后或暴露网络表面之前运行:
openclaw security audit
openclaw security audit --deep    # attempts a live Gateway probe
openclaw security audit --fix     # apply safe remediations
openclaw security audit --json
--fix 的范围有意保持狭窄:它会将开放群组策略切换为允许列表,恢复 logging.redactSensitive: "tools",收紧状态/配置/包含文件权限(600 文件、700 目录),并且在 Windows 上使用 ACL 重置而不是 POSIX chmod

审计检查什么(高层)

  • 入站访问 - 私信/群组策略、允许列表:陌生人能否触发 bot?
  • 工具影响半径 - 提升权限的工具 + 开放房间:提示注入是否可能变成 shell/文件/网络操作?
  • Exec 文件系统漂移 - 在 exec/process 仍可用且没有沙箱约束时,拒绝可变更文件系统的工具。
  • Exec 审批漂移 - security="full"autoAllowSkills、没有 strictInlineEval 的解释器允许列表。单独的 security="full" 是宽泛态势警告,不是 bug 证明 - 它是受信任个人助手设置的默认选择;只有当你的威胁模型需要审批或允许列表护栏时才收紧它。
  • 网络暴露 - Gateway 网关绑定/认证、Tailscale Serve/Funnel、弱/短认证令牌。
  • 浏览器控制暴露 - 远程节点、中继端口、远程 CDP 端点。
  • 本地磁盘卫生 - 权限、符号链接、配置 include、同步文件夹路径。
  • 插件 - 未使用显式允许列表就加载。
  • 策略漂移 - 已配置沙箱 Docker 设置但沙箱模式关闭;看起来有效但只匹配精确命令 ID(例如 system.run)、不匹配载荷内部 shell 文本的 gateway.nodes.denyCommands 条目;危险的 gateway.nodes.allowCommands 条目;全局 tools.profile="minimal" 被按智能体覆盖;插件拥有的工具在宽松策略下可访问。
  • 运行时期望漂移 - 假设隐式 exec 仍然表示 sandbox,而 tools.exec.host 现在默认是 auto;或者在沙箱模式关闭时设置 tools.exec.host="sandbox"
  • 模型卫生 - 对配置的旧版模型发出警告(软警告,不是硬阻断)。
每个发现都有结构化的 checkId(例如 gateway.bind_no_authtools.exec.security_full_configured)。前缀:fs.*(权限)、gateway.*(绑定/认证/Tailscale/Control UI/可信代理)、hooks.*/browser.*/sandbox.*/tools.exec.*(按表面加固)、plugins.*/skills.*(供应链)、security.exposure.*(访问策略 x 工具影响半径)。包含严重级别和自动修复支持的完整目录:安全审计检查。另请参阅 形式化验证

分诊发现时的优先级顺序

  1. 任何“开放”+ 已启用工具:先锁定私信/群组(配对/允许列表),再收紧工具策略/沙箱隔离。
  2. 公共网络暴露(LAN 绑定、Funnel、缺少认证):立即修复。
  3. 浏览器控制远程暴露:像操作员访问一样处理(仅 tailnet、审慎配对节点、无公共暴露)。
  4. 权限:状态/配置/凭证/认证不得对组/全世界可读。
  5. 插件:只加载你明确信任的内容。
  6. 模型选择:对任何带工具的 bot,优先选择现代的、经过指令加固的模型。

60 秒加固基线

{
  gateway: {
    mode: "local",
    bind: "loopback",
    auth: { mode: "token", token: "replace-with-long-random-token" },
  },
  session: {
    dmScope: "per-channel-peer",
  },
  tools: {
    profile: "messaging",
    deny: ["group:automation", "group:runtime", "group:fs", "sessions_spawn", "sessions_send"],
    fs: { workspaceOnly: true },
    exec: { security: "deny", ask: "always" },
    elevated: { enabled: false },
  },
  channels: {
    whatsapp: { dmPolicy: "pairing", groups: { "*": { requireMention: true } } },
  },
}
保持 Gateway 网关仅限本地,隔离私信,并默认禁用控制平面/运行时工具。之后可按受信任的智能体有选择地重新启用工具。 聊天驱动的智能体轮次的内置基线:无论配置如何,非所有者发送者都不能使用 crongateway 工具。

信任边界矩阵

用于分诊风险报告的快速模型:
边界或控制含义常见误读
gateway.auth(令牌/密码/可信代理/设备认证)对 Gateway 网关 API 调用方进行身份验证“需要在每一帧上做逐消息签名才安全”
sessionKey用于上下文/会话选择的路由键“会话键是用户认证边界”
提示/内容护栏降低模型滥用风险“仅提示注入就证明认证绕过”
canvas.eval / 浏览器 evaluate启用时的有意操作员能力“任何 JS eval 原语在这个信任模型中都会自动成为漏洞”
本地 TUI ! shell操作员显式触发的本地执行“本地 shell 便利命令是远程注入”
节点配对和节点命令对已配对设备的操作员级远程执行“远程设备控制默认应被视为不受信任的用户访问”
gateway.nodes.pairing.autoApproveCidrs可选开启的可信网络节点注册策略“默认禁用的允许列表是自动配对漏洞”

按设计不是漏洞

  • 没有策略、认证或沙箱绕过的纯提示注入链。
  • 假定在一个共享主机或配置上进行敌对多租户运行的声明。
  • 普通操作员读取路径访问(例如 sessions.list / sessions.preview / chat.history)在共享 Gateway 网关设置中被归类为 IDOR。
  • 仅 localhost 部署的发现(例如仅 loopback Gateway 网关缺少 HSTS)。
  • 针对本仓库中不存在的入站路径的 Discord 入站 webhook 签名发现。
  • 节点配对元数据被视为 system.run 的隐藏第二层按命令审批;真实执行边界是 Gateway 网关的全局节点命令策略加上节点自身的 exec 审批。
  • gateway.nodes.pairing.autoApproveCidrs 本身被视为漏洞。它默认禁用,需要显式 CIDR/IP 条目,只适用于首次 role: node 配对且没有请求的权限范围,并且永远不会自动批准操作员/浏览器/Control UI、WebChat、角色/权限范围升级、元数据或公钥更改,或同主机 loopback 可信代理标头路径(即使启用了 loopback 可信代理认证)。
  • sessionKey 视为认证令牌的“缺少按用户授权”发现。

Gateway 网关和节点信任

将 Gateway 网关和节点视为一个具有不同角色的操作员信任域:
  • Gateway 网关:控制平面和策略表面(gateway.auth、工具策略、路由)。
  • 节点:配对到该 Gateway 网关的远程执行表面(命令、设备操作、主机本地能力)。
  • 经过 Gateway 网关身份验证的调用方在 Gateway 网关范围内受信任;配对后,节点操作是该节点上的受信任操作员操作。参见 操作员权限范围
  • 使用共享 Gateway 网关令牌/密码进行身份验证的直接 loopback 后端客户端,可以在不提供用户设备身份的情况下发起内部控制平面 RPC。这不是远程或浏览器配对绕过 - 网络客户端、节点客户端、设备令牌客户端和显式设备身份仍然会经过配对和权限范围升级强制执行。
  • Exec 审批(允许列表 + 询问)是操作员意图的护栏,不是敌对多租户隔离。它们绑定精确的请求上下文和尽力而为的直接本地文件操作数;它们不会从语义上建模每一个运行时/解释器加载路径。强边界请使用沙箱隔离和主机隔离。
  • 受信任单操作员默认值:gateway/node 上的主机 exec 无需审批提示即可允许(security="full"ask="off")。这是有意的 UX,本身不是漏洞。
对于敌对用户隔离,请按 OS 用户/主机拆分信任边界,并运行单独的 Gateway 网关。

威胁模型

你的 AI 助手可以执行任意 shell 命令、读写文件、访问网络服务,并向任何人发送消息(如果授予了频道访问权限)。向它发消息的人可能会试图诱导它做坏事、通过社会工程获取你的数据访问权限,或探测基础设施细节。 这里的大多数失败都不是奇特的漏洞利用 - 而是“有人给 bot 发了消息,bot 就按他们的要求做了”。OpenClaw 的立场依次是:
  1. 身份优先 - 决定谁可以和 bot 对话(私信配对 / 允许列表 / 显式“开放”)。
  2. 范围其次 - 决定 bot 可以在哪里行动(群组允许列表 + 提及门控、工具、沙箱隔离、设备权限)。
  3. 模型最后 - 假设模型可以被操纵;以有限影响半径为目标进行设计。

私信访问:配对、允许列表、开放、禁用

每个支持私信的渠道都支持 dmPolicy(或 *.dm.policy),它会在处理消息之前对入站私信进行门控:
策略行为
pairing默认。未知发送者会收到配对码;bot 会忽略他们,直到获批。代码 1 小时后过期;重复私信不会重新发送代码,直到创建新的请求。每个渠道的待处理请求上限为 3 个。
allowlist未知发送者会被阻止,不进行配对握手。
open任何人都可以私信(公开)。要求渠道 allowlist 包含 "*"(显式选择加入)。
disabled完全忽略入站私信。
openclaw pairing list <channel>
openclaw pairing approve <channel> <code>
磁盘上的详情 + 文件:配对 dmPolicy="open"groupPolicy="open" 视为最后手段设置;除非你完全信任房间中的每个成员,否则优先使用配对 + 允许列表。

允许列表(两层)

  • 私信允许列表allowFrom / channels.discord.allowFrom / channels.slack.allowFrom;旧版:channels.discord.dm.allowFromchannels.slack.dm.allowFrom):谁可以私信 bot。当 dmPolicy="pairing" 时,审批会写入 ~/.openclaw/credentials/<channel>-allowFrom.json(默认账号)或 <channel>-<accountId>-allowFrom.json(非默认账号),并与配置允许列表合并。
  • 群组允许列表(特定于渠道):bot 接受哪些群组/渠道/guild。
    • channels.whatsapp.groupschannels.telegram.groupschannels.imessage.groups:按群组设置默认值,例如 requireMention;设置后,也会充当群组允许列表(包含 "*" 可保留全部允许行为)。使用 agents.list[].groupChat.mentionPatterns 自定义提及触发词(例如 ["@openclaw", "@mybot"]),让 requireMention 基于你自己的 bot 名称生效。
    • groupPolicy="allowlist" + groupAllowFrom:限制谁可以在群组会话中触发 bot(WhatsApp/Telegram/Signal/iMessage/Microsoft Teams)。
    • channels.discord.guilds / channels.slack.channels:按表面的允许列表 + 提及默认值。
    • 检查顺序:先检查 groupPolicy/群组允许列表,再检查提及/回复激活。回复 bot 消息(隐式提及)不会绕过 groupAllowFrom
详情:配置群组

私信会话隔离(多用户模式)

默认情况下,OpenClaw 会将所有私信路由到主会话,以实现跨设备连续性。如果多人可以私信 bot(开放私信或多人允许列表),请隔离私信会话:
{ session: { dmScope: "per-channel-peer" } }
session.dmScope 值:
范围
main(配置默认值)所有私信共享一个会话。
per-channel-peer每个渠道+发送者组合获得一个隔离的私信上下文(安全私信模式)。
per-account-channel-peer同上,但进一步按账号拆分(多账号渠道)。
per-peer每个发送者在同类型的所有渠道中获得一个会话。
本地 CLI 新手引导会在未设置时写入 session.dmScope: "per-channel-peer",并保留任何显式的现有值。 这是消息上下文边界,不是主机管理员边界。如果用户彼此对抗,并共享同一个 Gateway 网关主机/配置,请改为按信任边界运行单独的 Gateway 网关。 如果同一个人通过多个渠道联系你,请使用 session.identityLinks 将这些私信会话合并为一个规范身份。参见 会话管理配置

上下文可见性与触发授权

两个独立概念:
  • 触发授权:谁可以触发智能体(dmPolicygroupPolicy、允许列表、提及门控)。
  • 上下文可见性:哪些补充上下文会到达模型(回复正文、引用文本、线程历史、转发元数据)。
contextVisibility 控制第二项:
  • "all"(默认):补充上下文按接收内容保留。
  • "allowlist":补充上下文会过滤为通过活动允许列表检查的发送者。
  • "allowlist_quote":类似 allowlist,但仍保留一个显式引用回复。
可按渠道或按房间/对话设置 - 参见 群组。仅显示“模型可以看到来自非允许列表发送者的引用/历史文本”的报告,是可通过 contextVisibility 处理的加固发现,本身不是身份验证或沙箱绕过;具有安全影响的报告仍需要证明存在信任边界绕过。

提示注入

攻击者会构造一条消息,诱导模型执行不安全操作(“忽略你的指令”、“转储你的文件系统”、“打开这个链接并运行命令”)。提示注入不能仅靠系统提示词护栏解决 - 那些只是软性指导;硬性执行来自工具策略、Exec 审批、沙箱隔离和渠道允许列表(操作员仍可按设计禁用它们)。 提示注入不要求公开私信:即使只有你能给 bot 发消息,它读取的任何不受信任内容(Web 搜索/获取结果、浏览器页面、电子邮件、文档、附件、粘贴的日志/代码)都可能携带对抗性指令。内容本身就是威胁面,而不仅仅是发送者。 需要视为不受信任的危险信号:
  • “读取此文件/URL,并完全按它说的做。”
  • “忽略你的系统提示词或安全规则。”
  • “透露你的隐藏指令或工具输出。”
  • “粘贴 ~/.openclaw 或你的日志的完整内容。”
实践中有帮助的做法:
  • 锁定入站私信(配对/允许列表);在群组中优先使用提及门控;避免在公共房间中使用始终在线的 bot。
  • 默认将链接、附件和粘贴的指令视为敌对内容。
  • 在沙箱中运行敏感工具执行;让密钥远离智能体可访问的文件系统。沙箱隔离是选择加入的:如果沙箱模式关闭,隐式 host=auto 会解析到 Gateway 网关主机,而显式 host=sandbox 仍会失败关闭(无可用沙箱运行时)。设置 host=gateway 可在配置中明确该行为。
  • 将高风险工具(execbrowserweb_fetchweb_search)限制为可信智能体或显式允许列表。
  • 如果你允许解释器进入允许列表(pythonnoderubyperlphpluaosascript),请启用 tools.exec.strictInlineEval,这样内联求值形式(-c-e 以及类似形式)仍需要显式审批。在允许列表模式下,任何 heredoc 片段(<<)始终需要审阅者或显式审批,无论引用方式如何 - 允许列表中的命令不能使用 heredoc 正文绕过允许列表审查。
  • 使用只读或禁用工具的阅读智能体来总结不受信任内容,然后将摘要传递给你的主智能体,以降低影响范围。
  • 除非需要,否则为启用工具的智能体关闭 web_search / web_fetch / browser
  • 对于 OpenResponses URL 输入(input_file / input_image),设置严格的 gateway.http.endpoints.responses.files.urlAllowlist / images.urlAllowlist,并保持 maxUrlParts 较低(空允许列表视为未设置)。使用 files.allowUrl: false / images.allowUrl: false 完全禁用 URL 获取。
  • 不要将密钥放入提示词;改为通过 Gateway 网关主机上的环境变量/配置传递。
模型选择很重要。 不同模型层级的提示注入抗性并不一致 - 更小/更便宜的模型在对抗性提示下更容易出现工具误用和指令劫持。
对于启用工具的智能体或读取不受信任内容的智能体,旧模型/小模型的提示注入风险通常过高。不要在弱模型层级上运行这些工作负载。
  • 对任何可以运行工具或接触文件/网络的 bot,使用最新一代、最高层级的模型。
  • 不要将旧/弱/小层级模型用于启用工具的智能体或不受信任的收件箱。
  • 如果必须使用较小模型,请降低影响范围:只读工具、强沙箱隔离、最小文件系统访问、严格允许列表。为所有会话启用沙箱隔离,并禁用 web_search/web_fetch/browser,除非输入受到严格控制。
  • 对于输入可信且无工具的纯聊天个人助理,较小模型通常可以。

外部内容和不受信任输入包装

OpenResponses input_file 文本仍会作为不受信任的外部内容注入,即使 Gateway 网关会在本地解码它 - 该块携带 <<<EXTERNAL_UNTRUSTED_CONTENT ...>>> 边界标记以及 Source: External 元数据(此路径会省略其他位置使用的较长 SECURITY NOTICE: 横幅)。当媒体理解从附加文档中提取文本并将其追加到媒体提示词之前,也会应用相同的基于标记的包装。 OpenClaw 还会从已包装的外部内容和元数据中剥离常见的自托管 LLM 聊天模板特殊 token 字面量(Qwen/ChatML、Llama、Gemma、Mistral、Phi、GPT-OSS 角色/轮次 token),然后再让它们到达模型。自托管 OpenAI 兼容后端(vLLM、SGLang、TGI、LM Studio、自定义 Hugging Face tokenizer 栈)有时会将 <|im_start|><|start_header_id|> 之类的字面字符串 token 化为用户内容中的结构化聊天模板 token;如果没有这种清理,获取的页面、电子邮件正文或文件内容工具输出中的不受信任文本可能伪造合成的 assistant/system 角色边界。清理发生在外部内容包装层,因此会统一应用于获取/读取工具和入站渠道内容。托管提供商(OpenAI、Anthropic)已经应用自己的请求侧清理;保持启用外部内容包装,并在可用时优先使用会拆分/转义特殊 token 的后端设置。 出站模型响应有单独的清理器,会在最终渠道投递边界从用户可见回复中剥离泄漏的 <tool_call><function_calls><system-reminder><previous_response> 以及类似内部脚手架。 这不能取代 dmPolicy、允许列表、Exec 审批、沙箱隔离或 contextVisibility - 它只关闭一个特定的 tokenizer 层绕过。

绕过标志(生产环境保持关闭)

  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Cron payload 字段 allowUnsafeExternalContent
仅为范围严格的调试临时启用;如果启用,请隔离该智能体(沙箱 + 最少工具 + 专用会话命名空间)。 即使投递来自你控制的系统,Hook payload 也是不受信任内容(邮件/文档/Web 内容可能携带提示注入)。弱模型层级会增加此风险 - 对于 Hook 驱动的自动化,优先使用强大的现代模型层级,并保持严格的工具策略(tools.profile: "messaging" 或更严格),同时尽可能使用沙箱隔离。

群组中的推理和详细输出

/reasoning/verbose/trace 可能暴露内部推理、工具输出,或不适合公共渠道的插件诊断信息;它们可能包含工具参数、URL、插件诊断信息,以及模型看到的数据。在公共房间中保持禁用;仅在可信私信或严格受控的房间中启用。

命令授权

Slash 命令和指令仅对已授权发送者生效,授权来源于渠道 allowlist/配对以及 commands.useAccessGroups(见配置Slash commands)。如果某个渠道 allowlist 为空或包含 "*",则该渠道的命令实际上是开放的。 /exec 是仅限会话的便捷功能,供已授权操作员使用;它不会写入配置或更改其他会话。

控制平面工具

两个内置工具可以进行持久更改:
  • gateway 使用 config.schema.lookup / config.get 检查配置,并使用 config.applyconfig.patchupdate.run 修改配置。
  • cron 创建定时任务,这些任务会在原始聊天/任务结束后继续运行。
gateway config.apply/config.patch 默认是失败关闭的:只有一小段低风险智能体运行时调优 allowlist(agents.defaults.thinkingDefault、按智能体配置的模型/思考/reasoning/fast-mode 字段)、提及门控(多层嵌套深度下的 channels.*.requireMention),以及可见回复设置(messages.visibleRepliesmessages.groupChat.visibleRepliesmessages.groupChat.unmentionedInbound)可由智能体调优。任何其他变更的配置路径都会被拒绝。全局模型默认值和 prompt overlay 仍由操作员控制,新的敏感配置树除非被有意添加到该 allowlist,否则会受到保护。该工具仍会拒绝重写 tools.exec.asktools.exec.security;旧版 tools.bash.* 别名会在检查写入之前规范化为等效的 tools.exec.* 路径。 对于任何处理不可信内容的智能体/表面,默认拒绝这些工具:
{
  tools: {
    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
  },
}
commands.restart=false 只会阻止重启动作;它不会禁用 gateway 配置/更新动作。

Node 执行(system.run

如果已配对 macOS 节点,Gateway 网关可以在其上调用 system.run;这是在那台 Mac 上进行远程代码执行。
  • 需要节点配对(审批 + token)。配对会建立节点身份/信任并签发 token;它不是按命令审批的表面。
  • Gateway 网关通过 gateway.nodes.allowCommands / denyCommands 应用粗粒度的全局节点命令策略。denyCommands 只匹配精确的节点命令名称(例如 system.run),不匹配命令载荷中的 shell 文本;如果重新连接的节点公布了不同的命令列表,只要 Gateway 网关全局策略和节点自身的 Exec 审批仍然执行边界,这本身就不是漏洞。
  • 按节点的 system.run 策略是节点自己的 Exec 审批文件(exec.approvals.node.*),在 Mac 上通过 Settings -> Exec approvals(security + ask + allowlist)控制;它可以比 Gateway 网关的全局 command-ID 策略更严格或更宽松。
  • 运行 security="full"ask="off" 的节点遵循默认可信操作员模型;这是预期行为,不是 bug,除非你的部署需要更严格的姿态。
  • 审批模式会绑定精确的请求上下文,并在可能时绑定一个具体的本地脚本/文件操作数。如果 OpenClaw 无法为解释器/运行时命令准确识别一个直接本地文件,基于审批的执行会被拒绝,而不是承诺完整语义覆盖。
  • 对于 host=node,基于审批的运行还会存储一个规范化的已准备 systemRunPlan;后续已批准的转发会复用该已存储计划,并且 Gateway 网关验证会拒绝调用方在审批请求创建后编辑 command/cwd/session 上下文。
  • 要完全禁用远程执行:将 security 设为 deny,并移除该 Mac 的节点配对。

动态 Skills(watcher / 远程节点)

OpenClaw 可以在会话中刷新 Skills 列表:当 SKILL.md 变更时,Skills watcher 会在下一个智能体轮次更新快照,而连接 macOS 节点可以让仅限 macOS 的 Skills 符合条件(基于 bin 探测)。将 skill 文件夹视为可信代码,并限制可修改它们的人员。

插件

插件与 Gateway 网关在同一进程内运行;应将它们视为可信代码。
  • 只从你信任的来源安装;优先使用明确的 plugins.allow allowlist;启用前审查插件配置;插件变更后重启 Gateway 网关。
  • 安装/更新(openclaw plugins install <package>openclaw plugins update <id>)会运行不可信代码:
    • 安装路径是活动插件安装根目录下的按插件目录。
    • OpenClaw 在安装/更新期间不会运行内置的本地危险代码阻断。使用 security.installPolicy 进行操作员拥有的本地允许/阻止决策,并使用 openclaw security audit --deep 进行诊断扫描。
    • npm 和 git 插件安装只会在显式安装/更新流程期间运行包管理器依赖收敛。本地路径和归档会被视为自包含包;OpenClaw 会复制/引用它们,而不会运行 npm install
    • 优先使用固定的精确版本(@scope/pkg@1.2.3),并在启用前检查解包后的代码。
    • --dangerously-force-unsafe-install 已弃用,并且不再改变安装/更新行为。
    • security.installPolicy 允许操作员运行可信本地命令,为 Skills 和插件安装做出主机特定的允许/阻止决策。它会在源材料暂存后、安装继续前运行,也适用于 ClawHub Skills,并且不会被已弃用的不安全标志绕过。
详情:插件

沙箱隔离

专用文档:沙箱隔离 两种互补方法:
  • Docker 中的完整 Gateway 网关(容器边界):Docker
  • 工具沙箱agents.defaults.sandbox;主机 Gateway 网关 + 沙箱隔离工具;Docker 是默认后端):沙箱隔离
为防止跨智能体访问,请将 agents.defaults.sandbox.scope 保持为 "agent"(默认),或使用 "session" 实现更严格的按会话隔离。scope: "shared" 使用单个容器或工作区。
沙箱内的 Agent 工作区访问(agents.defaults.sandbox.workspaceAccess):
  • "none"(默认):工具会看到 ~/.openclaw/sandboxes 下的沙箱工作区;Agent 工作区不可访问。
  • "ro":将 Agent 工作区以只读方式挂载到 /agent(禁用 write/edit/apply_patch)。
  • "rw":将 Agent 工作区以读写方式挂载到 /workspace
额外的 sandbox.docker.binds 会基于规范化、canonicalized 的源路径进行验证。阻止路径 denylist 覆盖 /etc/private/etc/proc/sys/dev/root/boot,以及通常包含或别名到 Docker socket 的目录(/run/var/run,以及其下的 docker.sock),再加上 HOME 凭证子路径(.aws.cargo.config.docker.gnupg.netrc.npm.ssh)。父级 symlink 技巧和规范化 home 别名会通过现有祖先解析并重新检查,因此如果它们解析到被阻止的根路径,仍会失败关闭。
tools.elevated 是全局基线逃生口,会在沙箱外运行 Exec。有效主机默认是 gateway,当 Exec 目标配置为 node 时则是 node。保持 tools.elevated.allowFrom 收紧,不要为陌生人启用。通过 agents.list[].tools.elevated 按智能体进一步限制。见提升权限模式

子智能体委派防护栏

如果你允许会话工具,请将委派的子智能体运行视为另一项边界决策:
  • 除非智能体确实需要委派,否则拒绝 sessions_spawn
  • agents.defaults.subagents.allowAgents 以及任何按智能体配置的 agents.list[].subagents.allowAgents override 限制为已知安全的目标智能体。
  • 对于必须保持沙箱隔离的工作流,调用 sessions_spawn 时传入 sandbox: "require"(默认是 "inherit");当目标子运行时未被沙箱隔离时,"require" 会快速失败。

只读模式

通过组合 agents.defaults.sandbox.workspaceAccess: "ro"(或使用 "none" 禁止工作区访问)以及阻止 writeeditapply_patchexecprocess 等工具的允许/拒绝列表,构建只读配置文件。
  • tools.exec.applyPatch.workspaceOnly: true(默认):即使关闭沙箱隔离,也会阻止 apply_patch 在工作区目录外写入/删除。仅当你有意希望 apply_patch 触碰工作区外文件时,才设为 false
  • tools.fs.workspaceOnly: true(可选):将 read/write/edit/apply_patch 路径和原生 prompt 图片自动加载路径限制到工作区目录。
  • 保持文件系统根路径收窄;避免为智能体/沙箱工作区使用像 home 目录这样的宽泛根路径,因为这可能会向文件系统工具暴露敏感本地文件(例如 ~/.openclaw 下的 state/config)。

按智能体访问配置文件(多智能体)

每个智能体都可以有自己的沙箱 + 工具策略:完全访问、只读,或无访问。优先级规则见多 Agent 沙盒和工具 常见模式:个人智能体(完全访问,无沙箱)、家庭/工作智能体(沙箱隔离 + 只读工具)、公共智能体(沙箱隔离 + 无文件系统/shell 工具)。

完全访问(无沙箱)

{
  agents: {
    list: [
      { id: "personal", workspace: "~/.openclaw/workspace-personal", sandbox: { mode: "off" } },
    ],
  },
}

只读工具 + 只读工作区

{
  agents: {
    list: [
      {
        id: "family",
        workspace: "~/.openclaw/workspace-family",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },
        tools: {
          allow: ["read"],
          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
        },
      },
    ],
  },
}

无文件系统/shell 访问(允许提供商消息传递)

{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
        tools: {
          // Session tools can reveal transcript data. Default scope is current session +
          // spawned subagent sessions; clamp further with tools.sessions.visibility if needed.
          sessions: { visibility: "tree" }, // self | tree | agent | all
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "discord",
            "slack",
            "telegram",
            "whatsapp",
          ],
          deny: [
            "apply_patch",
            "browser",
            "canvas",
            "cron",
            "edit",
            "exec",
            "gateway",
            "image",
            "nodes",
            "process",
            "read",
            "write",
          ],
        },
      },
    ],
  },
}

浏览器控制风险

启用浏览器控制会给模型一个真实浏览器。如果该配置文件已经有已登录会话,模型就可以访问这些账号和数据;请将浏览器配置文件视为敏感状态。
  • 优先为智能体使用专用配置文件(默认 openclaw 配置文件);避免使用你的个人日常配置文件。
  • 除非你信任沙箱隔离的智能体,否则保持主机浏览器控制处于禁用状态。
  • 独立的 loopback 浏览器控制 API 只接受共享密钥认证(Gateway 网关令牌 bearer 认证或 Gateway 网关密码),不会使用可信代理或 Tailscale Serve 身份标头。
  • 将浏览器下载内容视为不可信输入;优先使用隔离的下载目录。
  • 如有可能,在智能体配置文件中禁用浏览器同步和密码管理器。
  • 对于远程 Gateway 网关,“浏览器控制”等同于对该配置文件可访问内容的“操作员访问”。
  • 保持 Gateway 网关和节点主机仅限 tailnet;避免将浏览器控制端口暴露到 LAN 或公网。
  • 不需要时禁用浏览器代理路由(gateway.nodes.browser.mode="off")。
  • Chrome MCP 现有会话模式并不“更安全”;它可以以你的身份访问该主机 Chrome 配置文件能够访问的任何内容。
  • 当 Gateway 网关与浏览器不在同一台机器上时,在浏览器机器上运行一个 节点主机,并让 Gateway 网关代理浏览器操作(参见 浏览器工具);将节点配对视为管理员访问,保持 Gateway 网关和节点主机在同一个 tailnet 上,并避免通过 LAN、公网或 Tailscale Funnel 暴露中继/控制端口。

浏览器 SSRF 策略(默认严格)

除非你显式选择加入,否则私有/内部目标会保持阻止状态。
  • 默认:browser.ssrfPolicy.dangerouslyAllowPrivateNetwork 未设置,因此私有/内部/特殊用途目标会保持阻止状态。旧别名 allowPrivateNetwork 仍然接受。
  • 选择加入:设置 dangerouslyAllowPrivateNetwork: true 以允许这些目标。
  • 在严格模式下,使用 hostnameAllowlist(类似 *.example.com 的模式)和 allowedHostnames(精确主机例外,包括原本会被阻止的名称,如 localhost)来设置显式例外。
  • 导航会在请求前检查,并在导航后的最终 http(s) URL 上尽力重新检查,以减少基于重定向的跳转。
{
  browser: {
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: false,
      hostnameAllowlist: ["*.example.com", "example.com"],
      allowedHostnames: ["localhost"],
    },
  },
}

网络暴露

绑定、端口、防火墙

Gateway 网关在一个端口上复用 WebSocket + HTTP(默认 18789;配置/标志/环境变量:gateway.port--portOPENCLAW_GATEWAY_PORT)。该 HTTP 表面包括 Control UI(SPA 资源,默认基础路径 /)和 canvas host(/__openclaw__/canvas/__openclaw__/a2ui - 任意 HTML/JS;在普通浏览器中加载时应视为不可信内容;不要将其暴露给不可信网络/用户,也不要与特权 Web 表面共享同源)。 gateway.bind 控制 Gateway 网关监听的位置:
  • "loopback"(默认):只有本地客户端可以连接。
  • "lan""tailnet""custom":扩大攻击面。仅在启用 Gateway 网关认证(共享令牌/密码,或正确配置的可信代理)并配合真实防火墙时使用。
经验规则:优先使用 Tailscale Serve,而不是 LAN 绑定(Serve 会让 Gateway 网关保持在 loopback 上,由 Tailscale 处理访问);如果必须绑定到 LAN,请用防火墙将端口限制到严格的源 IP 允许列表,而不是广泛端口转发;永远不要在 0.0.0.0 上暴露未认证的 Gateway 网关。

使用 UFW 发布 Docker 端口

已发布的容器端口(-p HOST:CONTAINER 或 Compose ports:)会通过 Docker 的转发链路由,而不只是主机 INPUT 规则。请在 DOCKER-USER 中强制执行规则(它在 Docker 自身的 accept 规则之前求值);大多数现代发行版使用 iptables-nft 前端,它仍会将这些规则应用到 nftables 后端。
# /etc/ufw/after.rules (append as its own *filter section)
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
-A DOCKER-USER -s 127.0.0.0/8 -j RETURN
-A DOCKER-USER -s 10.0.0.0/8 -j RETURN
-A DOCKER-USER -s 172.16.0.0/12 -j RETURN
-A DOCKER-USER -s 192.168.0.0/16 -j RETURN
-A DOCKER-USER -s 100.64.0.0/10 -j RETURN
-A DOCKER-USER -p tcp --dport 80 -j RETURN
-A DOCKER-USER -p tcp --dport 443 -j RETURN
-A DOCKER-USER -m conntrack --ctstate NEW -j DROP
-A DOCKER-USER -j RETURN
COMMIT
IPv6 有单独的表;如果启用了 Docker IPv6,请在 /etc/ufw/after6.rules 中添加匹配策略。避免硬编码接口名称(eth0),因为它们会因 VPS 镜像而异(ens3enp* 等),不匹配时可能会静默跳过你的拒绝规则。
ufw reload
iptables -S DOCKER-USER
ip6tables -S DOCKER-USER
nmap -sT -p 1-65535 <public-ip> --open
预期的外部端口应该只包含你有意暴露的端口(对大多数设置而言:SSH + 反向代理端口)。

mDNS/Bonjour 发现

启用内置 bonjour 插件时,Gateway 网关会通过 mDNS(_openclaw-gw._tcp,端口 5353)广播存在信息,用于本地设备发现。完整模式包含会暴露运维细节的 TXT 记录:cliPath(泄露用户名和安装位置的文件系统路径)、sshPort(宣告 SSH 可用性)、displayName/lanHost(主机名信息)。广播基础设施细节会让 LAN 侦察更容易。
  • 除非需要 LAN 发现,否则保持 Bonjour 禁用;它会在 macOS 主机上自动启动,在其他地方则需要选择加入;直接 Gateway 网关 URL、Tailnet、SSH 或广域 DNS-SD 可避免本地多播。
  • 最小模式(启用 Bonjour 时的默认值,推荐用于暴露的 Gateway 网关)会省略敏感字段:
    { discovery: { mdns: { mode: "minimal" } } }
    
  • 关闭 会在保持插件启用的同时抑制本地发现:
    { discovery: { mdns: { mode: "off" } } }
    
  • 完整模式(选择加入)包含 cliPath + sshPort
    { discovery: { mdns: { mode: "full" } } }
    
  • 或设置 OPENCLAW_DISABLE_BONJOUR=1,无需更改配置即可禁用 mDNS。
在最小模式下,Gateway 网关会广播 rolegatewayPorttransport,但省略 cliPath/sshPort;需要 CLI 路径的应用可以改为通过已认证的 WebSocket 连接获取它。

Gateway 网关 WebSocket 认证

Gateway 网关认证默认必需;如果没有配置有效的认证路径,Gateway 网关会拒绝 WebSocket 连接(失败关闭)。新手引导默认会生成令牌(即使是 loopback),因此本地客户端也必须认证。
{ gateway: { auth: { mode: "token", token: "your-token" } } }
openclaw doctor --generate-gateway-token 可以为你生成一个令牌。
gateway.remote.tokengateway.remote.password 是客户端凭证来源;它们本身不会保护本地 WS 访问。本地调用路径仅在 gateway.auth.* 未设置时,才将 gateway.remote.* 用作回退。如果 gateway.auth.tokengateway.auth.password 通过 SecretRef 显式配置但无法解析,解析会失败关闭(不会被远程回退掩盖)。
使用 wss:// 时,通过 gateway.remote.tlsFingerprint 固定远程 TLS。明文 ws:// 可用于 loopback、私有 IP 字面量、.local 和 Tailnet *.ts.net Gateway 网关 URL;对于其他可信的私有 DNS 名称,请在客户端进程上设置 OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 作为应急开关(仅限进程环境,不是 openclaw.json 键)。移动端配对和 Android 手动/扫描的 Gateway 网关路由更严格:明文只允许 loopback,而私有 LAN、链路本地、.local 和无点主机名必须使用 TLS,除非你显式选择加入可信私有网络明文路径。 设备配对会自动批准直接本地 loopback 连接(另有一条很窄的后端/容器本地自连接路径,用于可信共享密钥辅助流程);Tailnet 和 LAN 连接,包括同主机 tailnet 绑定,都被视为远程,仍需要批准。loopback 请求中的转发标头证据会取消 loopback 本地性资格;元数据升级自动批准的范围很窄。参见 Gateway 网关配对 认证模式:
  • "token":共享 bearer 令牌(推荐用于大多数设置)。
  • "password":优先通过 OPENCLAW_GATEWAY_PASSWORD 设置。
  • "trusted-proxy":信任具备身份感知能力的反向代理来认证用户,并通过标头传递身份。参见 可信代理认证
轮换检查清单(令牌/密码):生成/设置新密钥(gateway.auth.tokenOPENCLAW_GATEWAY_PASSWORD);重启 Gateway 网关(或重启监管 Gateway 网关的 macOS 应用);更新远程客户端(gateway.remote.token/.password);确认旧凭证不再可用。

Tailscale Serve 身份标头

gateway.auth.allowTailscaletrue(Serve 的默认值)时,OpenClaw 接受 Tailscale Serve 身份标头 tailscale-user-login,用于 Control UI/WebSocket 认证。它会通过本地 Tailscale 守护进程(tailscale whois)解析 x-forwarded-for 地址,并将其与标头匹配来验证身份;这只会在携带由 Tailscale 注入的 x-forwarded-forx-forwarded-protox-forwarded-host 的 loopback 请求上触发。对于这个异步检查,在限制器记录失败之前,同一 {scope, ip} 的失败尝试会被串行化,因此来自同一个 Serve 客户端的并发错误重试可能会立即锁定第二次尝试。 HTTP API 端点(/v1/*/tools/invoke/api/channels/*)不使用 Tailscale 身份标头认证;它们遵循 Gateway 网关配置的 HTTP 认证模式。 Gateway 网关 HTTP bearer 认证实际上是全有或全无的操作员访问。能够调用 /v1/chat/completions/v1/responses、插件路由(如 /api/v1/admin/rpc)或 /api/channels/* 的凭证,是该 Gateway 网关的完全访问操作员密钥:共享密钥 bearer 认证会恢复完整的默认操作员权限范围(operator.adminoperator.approvalsoperator.pairingoperator.readoperator.talk.secretsoperator.write)以及智能体轮次的所有者语义,并且更窄的 x-openclaw-scopes 值不会削弱该共享密钥路径。按请求的权限范围语义只适用于来自带身份模式(可信代理认证)或显式无认证私有入口的请求;在这些模式下,省略 x-openclaw-scopes 会回退到普通操作员默认权限范围集合,而在权限范围被收窄时,像 x-openclaw-model 这样的所有者级标头需要 operator.admin/tools/invoke 和 HTTP 会话历史端点遵循相同的共享密钥规则。不要与不可信调用方共享这些凭证;优先为每个信任边界使用单独的 Gateway 网关。 无令牌 Serve 认证假设 Gateway 网关主机本身可信;它无法防护恶意同主机进程。如果不可信本地代码可能在 Gateway 网关主机上运行,请禁用 allowTailscale 并要求显式共享密钥认证(tokenpassword)。 不要从你自己的反向代理转发这些标头。如果你在 Gateway 网关前终止 TLS 或代理,请禁用 allowTailscale,改用共享密钥认证或 可信代理认证 参见 TailscaleWeb 概览

反向代理配置

设置 gateway.trustedProxies,以便在 nginx/Caddy/Traefik 等后方正确处理转发的客户端 IP。当 Gateway 网关检测到来自 不在 trustedProxies 中地址的代理标头时,它不会将该连接视为本地连接;如果 Gateway 网关认证已禁用,该连接会被拒绝。这可以防止代理连接看起来像来自 localhost 并获得自动信任。 trustedProxies 也会提供给 gateway.auth.mode: "trusted-proxy",后者更严格:默认会对 loopback 来源代理失败关闭。同主机 loopback 反向代理可以使用 trustedProxies 进行本地客户端检测和转发 IP 处理,但只有在 gateway.auth.trustedProxy.allowLoopback = true 时才能满足 trusted-proxy 认证模式;否则请使用令牌/密码认证。
gateway:
  trustedProxies:
    - "10.0.0.1" # reverse proxy IP
  allowRealIpFallback: false # default false; only enable if your proxy cannot provide X-Forwarded-For
  auth:
    mode: password
    password: ${OPENCLAW_GATEWAY_PASSWORD}
设置 trustedProxies 后,Gateway 网关会使用 X-Forwarded-For 判断客户端 IP;除非显式设置 gateway.allowRealIpFallback: true,否则会忽略 X-Real-IP。请确保你的代理会覆盖 X-Forwarded-For/X-Real-IP,而不是追加到它们后面:
# good
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;

# bad: preserves/appends untrusted client-supplied values
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
受信代理标头不会让节点设备配对自动受信 - gateway.nodes.pairing.autoApproveCidrs 是一个单独的、默认禁用的操作员策略,并且即使启用了 loopback 受信代理认证,来自 loopback 源的受信代理标头路径仍会被排除在节点自动批准之外(因为本地调用方可以伪造这些标头)。

HSTS 和来源说明

  • OpenClaw 的 Gateway 网关优先面向本地/local loopback。如果你在反向代理处终止 TLS,请在那里设置 HSTS。
  • 如果 Gateway 网关本身终止 HTTPS,gateway.http.securityHeaders.strictTransportSecurity 会从 OpenClaw 响应中发出 HSTS 标头。
  • 非 loopback 的 Control UI 部署默认需要 gateway.controlUi.allowedOriginsallowedOrigins: ["*"] 是显式允许全部的策略,不是加固过的默认值 - 除非是在严格受控的本地测试中,否则应避免使用。
  • 即使启用了通用 loopback 豁免,loopback 上的浏览器来源认证失败仍会受到速率限制,但锁定键会按规范化后的 Origin 值分别作用域化,而不是共用一个 localhost 存储桶。
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true 会启用 Host 标头来源回退模式;应将其视为操作员选择的危险策略。
  • 将 DNS rebinding 和代理 Host 标头行为视为部署加固问题;保持 trustedProxies 严格,并避免将 Gateway 网关直接暴露到公共互联网。
  • 详细部署指南:受信代理认证

通过 HTTP 使用 Control UI

Control UI 需要安全上下文(HTTPS 或 localhost)来生成设备身份。
  • gateway.controlUi.allowInsecureAuth:本地兼容性开关。在 localhost 上,当页面通过非安全 HTTP 加载时,允许 Control UI 在没有设备身份的情况下认证。不会绕过配对检查,也不会放宽远程(非 localhost)设备身份要求。优先使用 HTTPS(Tailscale Serve)或在 127.0.0.1 打开 UI。
  • gateway.controlUi.dangerouslyDisableDeviceAuth:仅用于紧急破窗,会完全禁用设备身份检查。严重降低安全性;除非正在主动调试且能够快速恢复,否则保持关闭。
  • 与这些标志分开,成功的 gateway.auth.mode: "trusted-proxy" 可以在没有设备身份的情况下接纳操作员 Control UI 会话 - 这是有意设计的认证模式行为,不是 allowInsecureAuth 快捷方式,并且不会扩展到节点角色的 Control UI 会话。
启用 allowInsecureAuth 时,openclaw security audit 会发出警告。

不安全/危险标志

openclaw security audit 会为每个已启用的已知不安全/危险调试开关触发 config.insecure_or_dangerous_flags(每个标志一个发现项)。生产环境中应保持这些标志未设置。如果配置了审计抑制项,即使匹配的发现项移动到 suppressedFindingssecurity.audit.suppressions.active 仍会保留在 active 输出中。
  • gateway.controlUi.allowInsecureAuth=true
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true
  • gateway.controlUi.dangerouslyDisableDeviceAuth=true
  • security.audit.suppressions configured (<count>)
  • hooks.gmail.allowUnsafeExternalContent=true
  • hooks.mappings[<index>].allowUnsafeExternalContent=true
  • tools.exec.applyPatch.workspaceOnly=false
  • plugins.entries.acpx.config.permissionMode=approve-all
Control UI 和浏览器:
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback
  • gateway.controlUi.dangerouslyDisableDeviceAuth
  • browser.ssrfPolicy.dangerouslyAllowPrivateNetwork
渠道名称匹配(内置渠道和插件渠道;适用时也按 accounts.<accountId> 分别配置):
  • channels.discord.dangerouslyAllowNameMatching
  • channels.googlechat.dangerouslyAllowNameMatching
  • channels.msteams.dangerouslyAllowNameMatching
  • channels.slack.dangerouslyAllowNameMatching
  • channels.irc.dangerouslyAllowNameMatching(插件渠道)
  • channels.mattermost.dangerouslyAllowNameMatching(插件渠道)
  • channels.synology-chat.dangerouslyAllowNameMatching(插件渠道)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath(插件渠道)
  • channels.zalouser.dangerouslyAllowNameMatching(插件渠道)
网络暴露:
  • channels.telegram.network.dangerouslyAllowPrivateNetwork(也可按账户分别配置)
Docker 沙箱(默认值 + 按 Agent 配置):
  • agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin

部署和主机信任

  • Gateway 网关主机上启用全盘加密;如果主机为共享主机,建议为 Gateway 网关使用专用 OS 用户账户。
  • 已发布包的依赖锁定:源码 checkout 使用 pnpm-lock.yaml;已发布的 openclaw npm 包和 OpenClaw 自有的 npm 插件包包含 npm-shrinkwrap.json,因此安装会使用发布时已审查的传递依赖图,而不是在安装时解析新的依赖图。这是供应链加固和发布可复现性的边界,不是沙箱 - 请参阅 npm shrinkwrap
  • 安全文件操作:OpenClaw 使用 @openclaw/fs-safe 进行根目录边界内的文件访问、原子写入、归档提取、临时工作区和密钥文件辅助处理。可选的 POSIX Python 辅助程序默认关闭;仅当你需要额外的 fd-relative 变更加固并且可以支持 Python 运行时时,才设置 OPENCLAW_FS_SAFE_PYTHON_MODE=autorequire。详情:安全文件操作
  • 共享 Slack 工作区风险:如果 Slack 中的所有人都可以给机器人发消息,核心风险就是委托的工具权限 - 任何允许的发送者都可以在智能体策略范围内诱导工具调用(exec、浏览器、网络/文件工具),一个发送者的提示/内容注入可能影响共享状态/设备/输出,并且如果共享智能体具有敏感凭据/文件,任何允许的发送者都可能通过工具使用驱动数据外泄。团队工作流应使用带最少工具的独立智能体/Gateway 网关;让个人数据智能体保持私有。
  • 公司共享智能体(可接受模式):当使用该智能体的所有人都处于同一信任边界内(例如同一个公司团队),且智能体严格限定在业务范围内时,这是可行的。将其运行在专用机器/VM/容器上,使用专用 OS 用户 + 专用浏览器/profile/账户,并且不要让该运行时登录个人 Apple/Google 账户或个人密码管理器/浏览器 profile。将个人身份和公司身份混用在同一运行时上会破坏隔离,并增加个人数据暴露风险。

磁盘上的密钥

假定 ~/.openclaw/(或 $OPENCLAW_STATE_DIR/)下的任何内容都可能包含密钥或私有数据:
路径内容
openclaw.json配置可能包含令牌(Gateway 网关、远程 Gateway 网关)、提供商设置和允许列表。
credentials/**渠道凭证(例如 WhatsApp 凭据)、配对允许列表、旧版 OAuth 导入。
agents/<agentId>/agent/auth-profiles.jsonAPI 密钥、令牌配置文件、OAuth 令牌、可选的 keyRef/tokenRef
agents/<agentId>/agent/codex-home/**按智能体配置的 Codex 应用服务器账户、配置、Skills、插件、原生线程状态、诊断(默认)。
$CODEX_HOME/**~/.codex/**选择启用的共享 Codex 运行时状态,仅当 plugins.entries.codex.config.appServer.homeScope"user" 时使用。使用原生 Codex 账户、配置、插件和线程存储;仅为所有者控制的本地 Gateway 网关启用。请参阅 Codex harness
secrets.json(可选)file SecretRef 提供商(secrets.providers)使用的文件后端密钥载荷。
agents/<agentId>/agent/auth.json旧版兼容性文件;发现静态 api_key 条目时会将其清理。
agents/<agentId>/sessions/**会话转录(*.jsonl)+ 路由元数据(sessions.json),其中可能包含私密消息和工具输出。
内置插件包已安装的插件(以及它们的 node_modules/)。
sandboxes/**工具沙箱工作区;可能会积累在沙箱内读取/写入的文件副本。

凭证存储映射

也有助于备份决策:
  • WhatsApp:~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Telegram bot 令牌:配置/环境变量或 channels.telegram.tokenFile(仅常规文件;拒绝符号链接)
  • Discord bot 令牌:配置/环境变量或 SecretRef(env/file/exec 提供商)
  • Slack 令牌:配置/环境变量(channels.slack.*
  • 配对允许列表:~/.openclaw/credentials/<channel>-allowFrom.json(默认账户)/ <channel>-<accountId>-allowFrom.json(非默认账户)
  • 模型认证配置文件:~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • 旧版 OAuth 导入:~/.openclaw/credentials/oauth.json
加固:保持严格权限(目录为 700,文件为 600);在网关主机上使用全盘加密;如果主机是共享的,优先使用专用 OS 用户账户。

文件权限

  • ~/.openclaw/openclaw.json600(仅用户可读/写)
  • ~/.openclaw700(仅用户)
openclaw doctor 可以发出警告并提供收紧这些权限的选项。

工作区 .env 文件

OpenClaw 会为智能体和工具加载工作区本地 .env 文件,但绝不会让它们静默覆盖 Gateway 网关运行时控制项:
  • 提供商凭证环境变量会被阻止从不受信任的工作区 .env 文件加载,例如 GEMINI_API_KEYGOOGLE_API_KEYXAI_API_KEYMISTRAL_API_KEYGROQ_API_KEYDEEPSEEK_API_KEYPERPLEXITY_API_KEYBRAVE_API_KEYTAVILY_API_KEYEXA_API_KEYFIRECRAWL_API_KEY,以及已安装受信任插件声明的提供商认证键。请改为将提供商凭证放在 Gateway 网关进程环境、~/.openclaw/.env$OPENCLAW_STATE_DIR/.env)、配置 env 块,或可选的登录 shell 导入中。
  • 任何以 OPENCLAW_ 开头的键都会被阻止从不受信任的工作区 .env 文件加载,从而保留整个运行时命名空间,使未来的 OPENCLAW_* 控制项默认 fail-closed,而不是静默继承自已检入或攻击者提供的 .env 内容。
  • Matrix、Mattermost、IRC 和 Synology Chat 的渠道端点设置也会被阻止通过工作区 .env 覆盖(例如 MATRIX_HOMESERVERMATTERMOST_URLIRC_HOSTSYNOLOGY_CHAT_INCOMING_URL),因此克隆的工作区无法通过本地端点配置重定向内置连接器流量。这些设置必须来自网关进程环境或 env.shellEnv
  • 受信任的进程/OS 环境变量、全局运行时 dotenv、配置 env 和已启用的登录 shell 导入仍然适用;这只限制工作区 .env 文件加载。
工作区 .env 文件通常位于智能体代码旁边,可能被意外提交,或被工具写入;阻止提供商凭证可以防止克隆的工作区替换为攻击者控制的提供商账户。

日志和转录

OpenClaw 会将会话转录存储在 ~/.openclaw/agents/<agentId>/sessions/*.jsonl 下的磁盘上,用于会话连续性和可选的记忆索引;任何拥有文件系统访问权限的进程/用户都可以读取它们。将磁盘访问视为信任边界,并锁定 ~/.openclaw 权限;如果需要更强隔离,请在单独的 OS 用户或主机下运行智能体。 Gateway 网关日志可能包含工具摘要、错误和 URL;会话转录可能包含粘贴的密钥、文件内容、命令输出和链接。
  • 保持日志/转录脱敏开启(logging.redactSensitive: "tools",默认)。
  • 通过 logging.redactPatterns 为你的环境添加自定义模式(令牌、主机名、内部 URL)。
  • 共享诊断时,优先使用 openclaw status --all(可粘贴,密钥已脱敏),而不是原始日志。
  • 如果不需要长期保留,请清理旧会话转录和日志文件。
详情:日志

安全基线(复制/粘贴)

{
  gateway: {
    mode: "local",
    bind: "loopback",
    port: 18789,
    auth: { mode: "token", token: "your-long-random-token" },
  },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
保持 Gateway 网关私有、要求私信配对,并避免始终在线的群组 bot。若还想让工具执行更安全,请为任何非所有者智能体添加沙箱并拒绝危险工具(请参阅上文“按智能体配置的访问配置文件”)。

单独号码(WhatsApp、Signal、Telegram)

对于基于电话号码的渠道,可以考虑让助手运行在与你个人号码分开的号码上,这样个人对话保持私密,而 bot 号码用自己的边界处理自动化。

事件响应

遏制

  1. 停止它:停止 macOS 应用(如果它负责监管 Gateway 网关)或终止你的 openclaw gateway 进程。
  2. 关闭暴露:设置 gateway.bind: "loopback"(或禁用 Tailscale Funnel/Serve),直到你弄清发生了什么。
  3. 冻结访问:将高风险私信/群组切换为 dmPolicy: "disabled" / 要求提及,并移除任何 "*" 全部允许条目。

轮换(如果密钥泄露,按已被入侵处理)

  1. 轮换 Gateway 网关认证(gateway.auth.token / OPENCLAW_GATEWAY_PASSWORD)并重启。
  2. 在任何可以调用 Gateway 网关的机器上轮换远程客户端密钥(gateway.remote.token / .password)。
  3. 轮换提供商/API 凭证(WhatsApp 凭据、Slack/Discord 令牌、auth-profiles.json 中的模型/API 密钥,以及使用时的加密密钥载荷值)。

审计

  1. 检查 Gateway 网关日志:/tmp/openclaw/openclaw-YYYY-MM-DD.log(或 logging.file)。
  2. 查看相关转录:~/.openclaw/agents/<agentId>/sessions/*.jsonl
  3. 查看最近可能扩大访问范围的配置变更:gateway.bindgateway.auth、私信/群组策略、tools.elevated、插件变更。
  4. 重新运行 openclaw security audit --deep,并确认关键发现已解决。

收集报告材料

  • 时间戳、网关主机 OS + OpenClaw 版本。
  • 会话转录 + 简短日志尾部(脱敏后)。
  • 攻击者发送了什么,以及智能体做了什么。
  • Gateway 网关是否暴露到 loopback 之外(LAN/Tailscale Funnel/Serve)。

密钥扫描

CI 会在仓库上运行 pre-commit detect-private-key 钩子。如果失败,请移除或轮换已提交的密钥材料,然后在本地复现:
pre-commit run --all-files detect-private-key

报告安全问题

发现了 OpenClaw 中的漏洞?请负责任地报告:
  1. 邮箱:security@openclaw.ai
  2. 修复前不要公开发布。
  3. 我们会署名感谢你(除非你希望匿名)。