跳转到主要内容

Documentation Index

Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

个人助手信任模型。 本指南假设每个 Gateway 网关只有一个受信任的 操作者边界(单用户、个人助手模型)。 OpenClaw 不是 供多个对抗性用户共享同一个智能体或 Gateway 网关的敌对多租户安全边界。 如果你需要混合信任或对抗性用户操作,请拆分信任边界(独立 Gateway 网关 + 凭证,最好还有独立 OS 用户或主机)。

先确定范围:个人助手安全模型

OpenClaw 安全指南假设采用个人助手部署:一个受信任的操作者边界,可能有多个智能体。
  • 支持的安全态势:每个 Gateway 网关一个用户/信任边界(建议每个边界一个 OS 用户/主机/VPS)。
  • 不支持作为安全边界:由相互不信任或对抗性的用户共同使用一个共享 Gateway 网关/智能体。
  • 如果需要对抗性用户隔离,请按信任边界拆分(独立 Gateway 网关 + 凭证,并且最好使用独立 OS 用户/主机)。
  • 如果多个不受信任的用户可以向一个启用工具的智能体发消息,请将他们视为共享该智能体的同一组委派工具权限。
本页解释的是在该模型内进行加固。它不声称在一个共享 Gateway 网关上提供敌对多租户隔离。

快速检查:openclaw security audit

另见:形式化验证(安全模型) 定期运行此命令(尤其是在更改配置或暴露网络表面之后):
openclaw security audit
openclaw security audit --deep
openclaw security audit --fix
openclaw security audit --json
security audit --fix 会有意保持范围很窄:它将常见的开放群组 策略切换为 allowlist,恢复 logging.redactSensitive: "tools",收紧 状态/配置/include-file 权限,并在 Windows 上运行时使用 Windows ACL 重置, 而不是 POSIX chmod 它会标记常见隐患(Gateway 网关认证暴露、浏览器控制暴露、提权 allowlist、文件系统权限、宽松的 exec 审批,以及开放渠道工具暴露)。 OpenClaw 既是产品,也是实验:你正在把前沿模型行为接入真实消息界面和真实工具。不存在“绝对安全”的设置。 目标是有意识地明确:
  • 谁可以和你的机器人对话
  • 机器人被允许在哪里执行操作
  • 机器人可以接触什么
从仍然可用的最小访问权限开始,然后随着信心增加再扩大范围。

部署和主机信任

OpenClaw 假设主机和配置边界是受信任的:
  • 如果某人可以修改 Gateway 网关主机状态/配置(~/.openclaw,包括 openclaw.json),请将其视为受信任的操作者。
  • 为多个相互不信任/对抗性的操作者运行同一个 Gateway 网关不是推荐设置
  • 对于混合信任团队,请使用独立 Gateway 网关拆分信任边界(或至少使用独立 OS 用户/主机)。
  • 推荐默认方式:每台机器/主机(或 VPS)一个用户,该用户一个 Gateway 网关,并在该 Gateway 网关中运行一个或多个智能体。
  • 在一个 Gateway 网关实例内,已认证的操作者访问是受信任的控制平面角色,而不是按用户划分的租户角色。
  • 会话标识符(sessionKey、会话 ID、标签)是路由选择器,而不是授权令牌。
  • 如果几个人可以向一个启用工具的智能体发消息,他们每个人都可以操控同一套权限。按用户隔离会话/记忆有助于隐私,但不会把共享智能体转换为按用户划分的主机授权。

安全文件操作

OpenClaw 使用 @openclaw/fs-safe 处理根目录边界内的文件访问、原子写入、归档提取、临时工作区和密钥文件辅助能力。OpenClaw 默认将 fs-safe 的可选 POSIX Python 辅助程序设为关闭;仅在你需要额外的 fd 相对变更加固,并且可以支持 Python 运行时时,才设置 OPENCLAW_FS_SAFE_PYTHON_MODE=autorequire 详情:安全文件操作

共享 Slack 工作区:真实风险

如果“Slack 中的所有人都可以给机器人发消息”,核心风险就是委派工具权限:
  • 任何允许的发送者都可以在智能体策略内诱导工具调用(exec、浏览器、网络/文件工具);
  • 来自某个发送者的提示/内容注入可能导致影响共享状态、设备或输出的操作;
  • 如果一个共享智能体拥有敏感凭证/文件,任何允许的发送者都可能通过工具使用驱动数据外泄。
对于团队工作流,请使用最少工具的独立智能体/Gateway 网关;将包含个人数据的智能体保持私有。

公司共享智能体:可接受模式

当使用该智能体的所有人都处于同一信任边界内(例如一个公司团队),并且该智能体严格限定在业务范围内时,这是可以接受的。
  • 在专用机器/VM/容器上运行它;
  • 为该运行时使用专用 OS 用户 + 专用浏览器/配置文件/账号;
  • 不要让该运行时登录个人 Apple/Google 账号或个人密码管理器/浏览器配置文件。
如果你在同一个运行时混用个人身份和公司身份,就会削弱隔离并增加个人数据暴露风险。

Gateway 网关和节点信任概念

将 Gateway 网关和节点视为同一个操作者信任域,但角色不同:
  • Gateway 网关是控制平面和策略表面(gateway.auth、工具策略、路由)。
  • 节点是与该 Gateway 网关配对的远程执行表面(命令、设备操作、主机本地能力)。
  • 已通过 Gateway 网关认证的调用方在 Gateway 网关范围内受信任。配对后,节点操作就是该节点上的受信任操作者操作。
  • 操作者范围级别和审批时检查汇总在 操作者范围
  • 使用共享 Gateway 网关 令牌/密码认证的直接 local loopback 后端客户端可以发起内部控制平面 RPC,而无需提供用户 设备身份。这不是远程或浏览器配对绕过:网络 客户端、节点客户端、设备令牌客户端和显式设备身份 仍会经过配对和范围升级执行。
  • sessionKey 是路由/上下文选择,而不是按用户认证。
  • Exec 审批(allowlist + ask)是操作者意图的护栏,而不是敌对多租户隔离。
  • OpenClaw 面向受信任单操作者设置的产品默认值是,允许在 gateway/node 上进行主机 exec,且不显示审批提示(security="full"ask="off",除非你收紧它)。该默认值是有意的用户体验设计,本身不是漏洞。
  • Exec 审批绑定精确请求上下文和尽力而为的直接本地文件操作数;它们不会对每一种运行时/解释器加载器路径进行语义建模。需要强边界时,请使用沙箱隔离和主机隔离。
如果你需要敌对用户隔离,请按 OS 用户/主机拆分信任边界,并运行独立 Gateway 网关。

信任边界矩阵

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

按设计不属于漏洞

这些模式经常被报告,除非证明存在真实边界绕过, 否则通常会被关闭为无需处理:
  • 仅提示注入的链路,没有策略、认证或沙箱绕过。
  • 假设在一个共享主机或配置上进行敌对多租户操作的声明。
  • 将正常操作者读取路径访问(例如 sessions.list / sessions.preview / chat.history)归类为共享 Gateway 网关设置中的 IDOR 的声明。
  • 仅限 localhost 部署的发现(例如只在 local loopback Gateway 网关上的 HSTS)。
  • 针对此仓库中不存在的入站路径提出的 Discord 入站 webhook 签名发现。
  • 将节点配对元数据视为 system.run 的隐藏第二层逐命令 审批层的报告;真实执行边界仍然是 Gateway 网关的全局节点命令策略,以及节点自身的 exec 审批。
  • 将已配置的 gateway.nodes.pairing.autoApproveCidrs 本身视为 漏洞的报告。此设置默认禁用,需要 显式 CIDR/IP 条目,仅适用于第一次、无请求范围的 role: node 配对, 并且不会自动批准操作者/浏览器/Control UI、 WebChat、角色升级、范围升级、元数据更改、公钥更改, 或同主机 local loopback 受信任代理标头路径,除非已显式启用 loopback trusted-proxy auth。
  • sessionKey 视为 认证令牌的“缺少按用户授权”发现。

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 网关保持仅本地访问,隔离私信,并默认禁用控制平面/运行时工具。

共享收件箱快速规则

如果不止一个人可以私信你的机器人:
  • 设置 session.dmScope: "per-channel-peer"(或对多账号渠道使用 "per-account-channel-peer")。
  • 保持 dmPolicy: "pairing" 或严格 allowlist。
  • 绝不要将共享私信与宽泛工具访问结合使用。
  • 这会加固协作式/共享收件箱,但在用户共享主机/配置写入访问时,它并不是为敌对共同租户隔离而设计的。

上下文可见性模型

OpenClaw 区分两个概念:
  • 触发授权:谁可以触发智能体(dmPolicygroupPolicy、allowlist、提及门控)。
  • 上下文可见性:哪些补充上下文会被注入模型输入(回复正文、引用文本、线程历史、转发元数据)。
Allowlist 会控制触发和命令授权。contextVisibility 设置控制如何过滤补充上下文(引用回复、线程根、获取的历史):
  • contextVisibility: "all"(默认)会按接收时的样子保留补充上下文。
  • contextVisibility: "allowlist" 会将补充上下文过滤为仅发送已通过活动 allowlist 检查的发送者内容。
  • contextVisibility: "allowlist_quote" 的行为类似 allowlist,但仍会保留一条明确引用的回复。
按渠道或按房间/会话设置 contextVisibility。设置详情见群聊 安全建议分诊指南:
  • 如果声明只显示“模型可以看到来自非 allowlist 发送者的引用文本或历史文本”,这类属于可通过 contextVisibility 处理的加固发现,本身不是凭证或沙箱边界绕过。
  • 若要构成安全影响,报告仍需要证明存在信任边界绕过(凭证、策略、沙箱、批准或其他已记录边界)。

审计检查内容(高层级)

  • 入站访问(私信策略、群组策略、allowlist):陌生人能否触发机器人?
  • 工具爆炸半径(高权限工具 + 开放房间):提示注入是否可能变成 shell/文件/网络操作?
  • Exec 文件系统漂移:当 exec/process 仍然可用且没有沙箱文件系统约束时,是否已拒绝可修改文件系统的工具?
  • Exec 批准漂移security=fullautoAllowSkills、没有 strictInlineEval 的解释器 allowlist):主机执行护栏是否仍按你的预期工作?
    • security="full" 是一种宽泛姿态警告,不是 bug 证明。它是可信个人助手设置所选择的默认值;仅当你的威胁模型需要批准或 allowlist 护栏时才收紧它。
  • 网络暴露(Gateway 网关绑定/凭证、Tailscale Serve/Funnel、弱/短凭证令牌)。
  • 浏览器控制暴露(远程节点、中继端口、远程 CDP 端点)。
  • 本地磁盘卫生(权限、符号链接、配置 include、“同步文件夹”路径)。
  • 插件(插件在没有显式 allowlist 的情况下加载)。
  • 策略漂移/配置错误(已配置沙箱 Docker 设置但沙箱模式关闭;gateway.nodes.denyCommands 模式无效,因为匹配仅按精确命令名进行(例如 system.run),不会检查 shell 文本;危险的 gateway.nodes.allowCommands 条目;全局 tools.profile="minimal" 被按智能体配置文件覆盖;插件拥有的工具在宽松工具策略下可达)。
  • 运行时期望漂移(例如假设隐式 exec 仍意味着 sandbox,但 tools.exec.host 现在默认为 auto;或在沙箱模式关闭时显式设置 tools.exec.host="sandbox")。
  • 模型卫生(当配置的模型看起来过旧时发出警告;不是硬性阻断)。
如果运行 --deep,OpenClaw 还会尽力尝试一次实时 Gateway 网关探测。

凭据存储映射

审计访问或决定要备份哪些内容时使用此映射:
  • WhatsApp~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Telegram 机器人令牌:配置/环境变量或 channels.telegram.tokenFile(仅普通文件;拒绝符号链接)
  • Discord 机器人令牌:配置/环境变量或 SecretRef(环境变量/文件/exec 提供商)
  • Slack 令牌:配置/环境变量(channels.slack.*
  • 配对 allowlist
    • ~/.openclaw/credentials/<channel>-allowFrom.json(默认账号)
    • ~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json(非默认账号)
  • 模型凭证配置文件~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • Codex runtime 状态~/.openclaw/agents/<agentId>/agent/codex-home/
  • 文件后备 secrets 载荷(可选)~/.openclaw/secrets.json
  • 旧版 OAuth 导入~/.openclaw/credentials/oauth.json

安全审计清单

当审计打印发现时,按以下优先级处理:
  1. 任何“开放”+ 已启用工具的情况:先锁定私信/群组(配对/allowlist),再收紧工具策略/沙箱隔离。
  2. 公网暴露(LAN 绑定、Funnel、缺少凭证):立即修复。
  3. 浏览器控制远程暴露:像对待操作者访问一样处理(仅 tailnet、谨慎配对节点、避免公网暴露)。
  4. 权限:确保状态/配置/凭据/凭证不允许组/全世界读取。
  5. 插件:只加载你明确信任的内容。
  6. 模型选择:对于任何带工具的机器人,优先使用现代的、经过指令加固的模型。

安全审计术语表

每个审计发现都由结构化 checkId 标识(例如 gateway.bind_no_authtools.exec.security_full_configured)。常见的 严重级别类别包括:
  • fs.* - 状态、配置、凭据、凭证配置文件的文件系统权限。
  • gateway.* - 绑定模式、凭证、Tailscale、控制 UI、可信代理设置。
  • hooks.*browser.*sandbox.*tools.exec.* - 按表面的加固。
  • plugins.*skills.* - 插件/技能供应链和扫描发现。
  • security.exposure.* - 访问策略与工具爆炸半径交汇处的横切检查。
完整目录(含严重级别、修复键和自动修复支持)见 安全审计检查

通过 HTTP 使用控制 UI

控制 UI 需要安全上下文(HTTPS 或 localhost)来生成设备身份。 gateway.controlUi.allowInsecureAuth 是一个本地兼容性开关:
  • 在 localhost 上,当页面通过非安全 HTTP 加载时,它允许控制 UI 在没有设备身份的情况下进行凭证验证。
  • 它不会绕过配对检查。
  • 它不会放宽远程(非 localhost)设备身份要求。
优先使用 HTTPS(Tailscale Serve),或在 127.0.0.1 上打开 UI。 仅限应急场景,gateway.controlUi.dangerouslyDisableDeviceAuth 会完全禁用设备身份检查。这是严重的安全降级;除非你正在主动调试并且可以快速还原,否则保持关闭。 与这些危险标志分开,成功的 gateway.auth.mode: "trusted-proxy" 可以允许操作者控制 UI 会话在没有设备身份的情况下进入。这是有意的 凭证模式行为,不是 allowInsecureAuth 捷径,并且它仍然 不会扩展到节点角色控制 UI 会话。 启用此设置时,openclaw security audit 会发出警告。

不安全或危险标志摘要

当已知不安全/危险调试开关启用时,openclaw security audit 会提出 config.insecure_or_dangerous_flags。生产环境中请不要设置这些项。
  • gateway.controlUi.allowInsecureAuth=true
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true
  • gateway.controlUi.dangerouslyDisableDeviceAuth=true
  • hooks.gmail.allowUnsafeExternalContent=true
  • hooks.mappings[<index>].allowUnsafeExternalContent=true
  • tools.exec.applyPatch.workspaceOnly=false
  • plugins.entries.acpx.config.permissionMode=approve-all
控制 UI 和浏览器:
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback
  • gateway.controlUi.dangerouslyDisableDeviceAuth
  • browser.ssrfPolicy.dangerouslyAllowPrivateNetwork
渠道名称匹配(内置和插件渠道;适用时也可按 accounts.<accountId> 设置):
  • channels.discord.dangerouslyAllowNameMatching
  • channels.slack.dangerouslyAllowNameMatching
  • channels.googlechat.dangerouslyAllowNameMatching
  • channels.msteams.dangerouslyAllowNameMatching
  • channels.synology-chat.dangerouslyAllowNameMatching(插件渠道)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath(插件渠道)
  • channels.zalouser.dangerouslyAllowNameMatching(插件渠道)
  • channels.irc.dangerouslyAllowNameMatching(插件渠道)
  • channels.mattermost.dangerouslyAllowNameMatching(插件渠道)
网络暴露:
  • channels.telegram.network.dangerouslyAllowPrivateNetwork(也可按账号设置)
沙箱 Docker(默认值 + 按智能体):
  • agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin

反向代理配置

如果你在反向代理(nginx、Caddy、Traefik 等)后运行 Gateway 网关,请配置 gateway.trustedProxies,以正确处理转发的客户端 IP。 当 Gateway 网关检测到来自不在 trustedProxies 中的地址的代理标头时,它不会把连接视为本地客户端。如果 Gateway 网关凭证被禁用,这些连接会被拒绝。这可以防止代理连接原本看起来来自 localhost 并获得自动信任而导致的凭证绕过。 gateway.trustedProxies 也会提供给 gateway.auth.mode: "trusted-proxy",但该凭证模式更严格:
  • 默认情况下,可信代理凭证会对来自 loopback 源的代理失败关闭
  • 同主机 loopback 反向代理可以使用 gateway.trustedProxies 进行本地客户端检测和转发 IP 处理
  • 同主机 loopback 反向代理只有在 gateway.auth.trustedProxy.allowLoopback = true 时才能满足 gateway.auth.mode: "trusted-proxy";否则请使用令牌/密码凭证
gateway:
  trustedProxies:
    - "10.0.0.1" # reverse proxy IP
  # Optional. Default false.
  # Only enable if your proxy cannot provide X-Forwarded-For.
  allowRealIpFallback: false
  auth:
    mode: password
    password: ${OPENCLAW_GATEWAY_PASSWORD}
配置 trustedProxies 后,Gateway 网关会使用 X-Forwarded-For 确定客户端 IP。默认情况下会忽略 X-Real-IP,除非显式设置 gateway.allowRealIpFallback: true 可信代理标头不会让节点设备配对自动受信任。 gateway.nodes.pairing.autoApproveCidrs 是单独的、默认禁用的 操作者策略。即使启用,来自 loopback 源的可信代理标头路径 也会被排除在节点自动批准之外,因为本地调用者可以伪造这些 标头,包括显式启用 loopback 可信代理凭证时也是如此。 良好的反向代理行为(覆盖传入的转发标头):
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
不良的反向代理行为(追加/保留不可信的转发标头):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

HSTS 和源注意事项

  • OpenClaw Gateway 网关优先面向本地/loopback。如果你在反向代理处终止 TLS,请在那里对面向代理的 HTTPS 域名设置 HSTS。
  • 如果 Gateway 网关本身终止 HTTPS,你可以设置 gateway.http.securityHeaders.strictTransportSecurity,让 OpenClaw 响应发出 HSTS 标头。
  • 详细部署指南见可信代理凭证
  • 对于非 loopback 控制 UI 部署,默认需要 gateway.controlUi.allowedOrigins
  • gateway.controlUi.allowedOrigins: ["*"] 是显式允许所有浏览器源的策略,不是加固默认值。避免在严格受控的本地测试之外使用它。
  • 即使启用了通用 loopback 豁免,loopback 上的浏览器源凭证失败仍会受到速率限制,但锁定键会按 规范化的 Origin 值划分,而不是使用一个共享的 localhost 桶。
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true 会启用 Host 标头源回退模式;请将其视为由操作者选择的危险策略。
  • 将 DNS 重新绑定和代理 Host 标头行为视为部署加固问题;保持 trustedProxies 收紧,并避免将 Gateway 网关直接暴露到公网。

本地会话日志保存在磁盘上

OpenClaw 将会话转录记录存储在磁盘上的 ~/.openclaw/agents/<agentId>/sessions/*.jsonl 下。 这是会话连续性以及(可选的)会话记忆索引所必需的,但这也意味着 任何拥有文件系统访问权限的进程/用户都可以读取这些日志。请将磁盘访问视为信任 边界,并锁定 ~/.openclaw 的权限(请参阅下面的审计部分)。如果你需要 在智能体之间实现更强隔离,请让它们在独立的操作系统用户或独立主机下运行。

节点执行(system.run)

如果 macOS 节点已配对,Gateway 网关可以在该节点上调用 system.run。这是 Mac 上的远程代码执行
  • 需要节点配对(批准 + 令牌)。
  • Gateway 网关节点配对不是逐命令批准界面。它建立节点身份/信任并签发令牌。
  • Gateway 网关通过 gateway.nodes.allowCommands / denyCommands 应用粗粒度的全局节点命令策略。
  • 在 Mac 上通过 Settings → Exec approvals(安全 + 询问 + 允许列表)控制。
  • 每节点 system.run 策略是节点自己的执行批准文件(exec.approvals.node.*),它可以比 Gateway 网关的全局命令 ID 策略更严格或更宽松。
  • security="full"ask="off" 运行的节点遵循默认的受信任操作员模型。除非你的部署明确要求更严格的批准或允许列表立场,否则应将其视为预期行为。
  • 批准模式会绑定精确的请求上下文,并在可能时绑定一个具体的本地脚本/文件操作数。如果 OpenClaw 无法为解释器/运行时命令准确识别一个直接本地文件,基于批准的执行将被拒绝,而不是承诺完整的语义覆盖。
  • 对于 host=node,基于批准的运行还会存储一个规范化的已准备 systemRunPlan;后续已批准的转发会复用该已存储计划,并且 Gateway 网关 验证会拒绝调用方在批准请求创建后对命令/cwd/会话上下文的编辑。
  • 如果你不想要远程执行,请将安全性设置为 deny,并移除该 Mac 的节点配对。
这种区别对分诊很重要:
  • 重新连接的已配对节点宣告不同的命令列表,本身并不是漏洞,只要 Gateway 网关全局策略和节点的本地执行批准仍在强制执行实际执行边界。
  • 将节点配对元数据视为第二个隐藏的逐命令批准层的报告,通常是策略/用户体验混淆,而不是安全边界绕过。

动态 Skills(观察器 / 远程节点)

OpenClaw 可以在会话中途刷新 Skills 列表:
  • Skills 观察器:对 SKILL.md 的更改可以在下一个智能体轮次更新 Skills 快照。
  • 远程节点:连接 macOS 节点可以让仅限 macOS 的 Skills 符合条件(基于二进制探测)。
请将技能文件夹视为受信任代码,并限制谁可以修改它们。

威胁模型

你的 AI 助手可以:
  • 执行任意 shell 命令
  • 读取/写入文件
  • 访问网络服务
  • 向任何人发送消息(如果你给它 WhatsApp 访问权限)
给你发消息的人可以:
  • 试图诱导你的 AI 做坏事
  • 通过社交工程获取你的数据访问权限
  • 探测基础设施详情

核心概念:先访问控制,后智能能力

这里的大多数失败并不是复杂漏洞,而是“有人给机器人发了消息,机器人照做了”。 OpenClaw 的立场:
  • **身份优先:**决定谁可以与机器人对话(私信配对 / 允许列表 / 显式“open”)。
  • **接着限定范围:**决定机器人被允许在哪里操作(群组允许列表 + 提及门控、工具、沙箱隔离、设备权限)。
  • **最后考虑模型:**假设模型可能被操纵;按操纵影响范围受限的方式设计。

命令授权模型

斜杠命令和指令只会对已授权发送者生效。授权派生自 渠道允许列表/配对加上 commands.useAccessGroups(请参阅配置斜杠命令)。如果渠道允许列表为空或包含 "*", 该渠道的命令实际上就是开放的。 /exec 是面向已授权操作员的仅限会话便利功能。它不会写入配置或 更改其他会话。

控制平面工具风险

两个内置工具可以进行持久性的控制平面更改:
  • gateway 可以使用 config.schema.lookup / config.get 检查配置,并可以使用 config.applyconfig.patchupdate.run 进行持久更改。
  • cron 可以创建计划任务,这些任务会在原始聊天/任务结束后继续运行。
仅限所有者的 gateway 运行时工具仍会拒绝重写 tools.exec.asktools.exec.security;旧版 tools.bash.* 别名会在写入前 规范化到同一组受保护的执行路径。 智能体驱动的 gateway config.applygateway config.patch 编辑 默认失败关闭:只有一小组提示词、模型和提及门控路径可由智能体调优。 因此,新的敏感配置树会受到保护,除非它们被有意添加到允许列表。 对于任何处理不受信任内容的智能体/界面,默认拒绝这些工具:
{
  tools: {
    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
  },
}
commands.restart=false 只会阻止重启操作。它不会禁用 gateway 配置/更新操作。

插件

插件与 Gateway 网关在同一进程内运行。请将它们视为受信任代码:
  • 只安装来自你信任来源的插件。
  • 优先使用显式的 plugins.allow 允许列表。
  • 启用前审查插件配置。
  • 插件更改后重启 Gateway 网关。
  • 如果你安装或更新插件(openclaw plugins install <package>openclaw plugins update <id>),请像运行不受信任代码一样对待它:
    • 安装路径是活动插件安装根目录下的逐插件目录。
    • OpenClaw 会在安装/更新前运行内置危险代码扫描。默认情况下,critical 发现会阻止操作。
    • npm 和 git 插件安装只会在显式安装/更新流程期间运行包管理器依赖收敛。本地路径和归档会被视为自包含插件包;OpenClaw 会复制/引用它们,而不运行 npm install
    • 优先使用固定的精确版本(@scope/pkg@1.2.3),并在启用前检查磁盘上解包后的代码。
    • --dangerously-force-unsafe-install 仅用于插件安装/更新流程中内置扫描误报的破窗场景。它不会绕过插件 before_install 钩子策略阻止,也不会绕过扫描失败。
    • Gateway 网关支持的技能依赖安装遵循相同的危险/可疑拆分:内置 critical 发现会阻止操作,除非调用方显式设置 dangerouslyForceUnsafeInstall,而可疑发现仍只会警告。openclaw skills install 仍是独立的 ClawHub 技能下载/安装流程。
详情:插件

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

所有当前支持私信的渠道都支持一个私信策略(dmPolicy*.dm.policy),该策略会在消息被处理之前门控入站私信:
  • pairing(默认):未知发送者会收到一个简短配对码,机器人会忽略他们的消息,直到批准为止。代码在 1 小时后过期;重复私信不会重新发送代码,除非创建新请求。默认情况下,每个渠道的待处理请求上限为 3 个。
  • allowlist:未知发送者会被阻止(没有配对握手)。
  • open:允许任何人私信(公开)。要求渠道允许列表包含 "*"(显式选择加入)。
  • disabled:完全忽略入站私信。
通过 CLI 批准:
openclaw pairing list <channel>
openclaw pairing approve <channel> <code>
详情 + 磁盘上的文件:配对

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

默认情况下,OpenClaw 会将所有私信路由到主会话,因此你的助手可以跨设备和渠道保持连续性。如果多个人可以私信机器人(开放私信或多人允许列表),请考虑隔离私信会话:
{
  session: { dmScope: "per-channel-peer" },
}
这可以防止跨用户上下文泄漏,同时保持群聊隔离。 这是消息上下文边界,不是主机管理员边界。如果用户彼此对抗,并且共享同一 Gateway 网关主机/配置,请改为按信任边界运行独立网关。

安全私信模式(推荐)

将上面的片段视为安全私信模式
  • 默认:session.dmScope: "main"(所有私信共享一个会话以保持连续性)。
  • 本地 CLI 新手引导默认值:未设置时写入 session.dmScope: "per-channel-peer"(保留现有显式值)。
  • 安全私信模式:session.dmScope: "per-channel-peer"(每个渠道+发送者组合获得一个隔离的私信上下文)。
  • 跨渠道对等方隔离:session.dmScope: "per-peer"(每个发送者在同一类型的所有渠道中获得一个会话)。
如果你在同一渠道上运行多个账号,请改用 per-account-channel-peer。如果同一个人通过多个渠道联系你,请使用 session.identityLinks 将这些私信会话合并为一个规范身份。请参阅会话管理配置

私信和群组的允许列表

OpenClaw 有两个独立的“谁可以触发我?”层:
  • 私信允许列表allowFrom / channels.discord.allowFrom / channels.slack.allowFrom;旧版:channels.discord.dm.allowFromchannels.slack.dm.allowFrom):谁被允许在直接消息中与机器人对话。
    • dmPolicy="pairing" 时,批准会写入 ~/.openclaw/credentials/ 下的账号范围配对允许列表存储(默认账号为 <channel>-allowFrom.json,非默认账号为 <channel>-<accountId>-allowFrom.json),并与配置允许列表合并。
  • 群组允许列表(特定于渠道):机器人究竟会接受哪些群组/渠道/服务器的消息。
    • 常见模式:
      • channels.whatsapp.groupschannels.telegram.groupschannels.imessage.groups:逐群组默认值,例如 requireMention;设置后,它也会充当群组允许列表(包含 "*" 以保留全部允许行为)。
      • groupPolicy="allowlist" + groupAllowFrom:限制谁可以在群组会话_内部_触发机器人(WhatsApp/Telegram/Signal/iMessage/Microsoft Teams)。
      • channels.discord.guilds / channels.slack.channels:逐界面允许列表 + 提及默认值。
    • 群组检查按此顺序运行:先运行 groupPolicy/群组允许列表,再运行提及/回复激活。
    • 回复机器人消息(隐式提及)不会绕过 groupAllowFrom 等发送者允许列表。
    • **安全注意事项:**请将 dmPolicy="open"groupPolicy="open" 视为最后手段设置。它们应极少使用;除非你完全信任房间里的每个成员,否则请优先使用配对 + 允许列表。
详情:配置群组

提示词注入(它是什么,为什么重要)

提示词注入是指攻击者精心构造一条消息,操纵模型去做不安全的事情(“忽略你的指令”、“转储你的文件系统”、“打开此链接并运行命令”等)。 即使有强系统提示词,提示词注入也没有被解决。系统提示词护栏只是软性指导;硬性强制来自工具策略、执行批准、沙箱隔离和渠道允许列表(并且操作员按设计可以禁用这些)。实践中有帮助的是:
  • 保持入站私信受限(配对/允许列表)。
  • 在群组中优先使用提及门控;避免在公共房间中使用“始终在线”的机器人。
  • 默认将链接、附件和粘贴的指令视为恶意内容。
  • 在沙箱中运行敏感工具执行;不要把密钥放在智能体可访问的文件系统中。
  • 注意:沙箱隔离是选择性启用的。如果沙箱模式关闭,隐式 host=auto 会解析为 Gateway 网关主机。显式 host=sandbox 仍会失败关闭,因为没有可用的沙箱运行时。如果你希望在配置中明确这种行为,请设置 host=gateway
  • 将高风险工具(execbrowserweb_fetchweb_search)限制给受信任智能体或显式允许列表。
  • 如果你将解释器(pythonnoderubyperlphpluaosascript)加入允许列表,请启用 tools.exec.strictInlineEval,这样内联 eval 形式仍需要显式批准。
  • Shell 批准分析也会拒绝 未加引号的 heredoc 中的 POSIX 参数展开形式($VAR$?$$$1$@${…}),因此已加入允许列表的 heredoc 正文不能把 shell 展开伪装成纯文本绕过允许列表审查。给 heredoc 终止符加引号(例如 <<'EOF')以选择字面正文语义;会展开变量的未加引号 heredoc 会被拒绝。
  • 模型选择很重要: 较旧/较小/遗留模型在抵御提示注入和工具误用方面明显不够稳健。对于启用工具的智能体,请使用可用的最新一代、最强、经过指令加固的模型。
应视为不可信的危险信号:
  • “读取此文件/URL,并严格按其中内容执行。”
  • “忽略你的系统提示或安全规则。”
  • “泄露你的隐藏指令或工具输出。”
  • “粘贴 ~/.openclaw 或你的日志的完整内容。”

外部内容特殊令牌清理

OpenClaw 会在包装后的外部内容和元数据到达模型之前,剥离常见的自托管 LLM 聊天模板特殊令牌字面量。覆盖的标记系列包括 Qwen/ChatML、Llama、Gemma、Mistral、Phi 以及 GPT-OSS 角色/轮次令牌。 原因:
  • 前接自托管模型的 OpenAI 兼容后端有时会保留用户文本中出现的特殊令牌,而不是屏蔽它们。否则,能够写入入站外部内容(获取的页面、电子邮件正文、文件内容工具输出)的攻击者可能注入合成的 assistantsystem 角色边界,并逃逸包装内容的防护边界。
  • 清理发生在外部内容包装层,因此会统一应用于获取/读取工具和入站渠道内容,而不是按提供商分别处理。
  • 出站模型响应已经有单独的清理器,会在最终渠道交付边界,从用户可见回复中剥离泄露的 <tool_call><function_calls><system-reminder><previous_response> 和类似的内部运行时脚手架。外部内容清理器是对应的入站处理。
这不会替代本页其他加固措施:dmPolicy、允许列表、exec 批准、沙箱隔离和 contextVisibility 仍然承担主要工作。它关闭的是针对自托管栈的一个特定分词器层绕过问题,这类栈会原样转发带特殊令牌的用户文本。

不安全外部内容绕过标志

OpenClaw 包含显式绕过标志,会禁用外部内容安全包装:
  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Cron 负载字段 allowUnsafeExternalContent
指导:
  • 在生产环境中保持这些项未设置/为 false。
  • 仅为范围严格限定的调试临时启用。
  • 如果启用,请隔离该智能体(沙箱 + 最少工具 + 专用会话命名空间)。
钩子风险说明:
  • 钩子负载是不可信内容,即使交付来自你控制的系统(邮件/文档/Web 内容可能携带提示注入)。
  • 较弱的模型层级会增加这种风险。对于钩子驱动的自动化,优先使用强大的现代模型层级,并保持严格的工具策略(tools.profile: "messaging" 或更严格),同时在可行时启用沙箱隔离。

提示注入不需要公共私信

即使只有你可以给机器人发消息,提示注入仍然可能通过机器人读取的任何不可信内容发生(Web 搜索/获取结果、浏览器页面、电子邮件、文档、附件、粘贴的日志/代码)。换句话说:发送者并不是唯一的威胁面;内容本身也可能携带对抗性指令。 启用工具时,典型风险是外泄上下文或触发工具调用。通过以下方式降低影响范围:
  • 使用只读或禁用工具的读取器智能体来总结不可信内容,然后将摘要传递给你的主智能体。
  • 除非需要,否则为启用工具的智能体关闭 web_search / web_fetch / browser
  • 对于 OpenResponses URL 输入(input_file / input_image),设置严格的 gateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlist,并保持较低的 maxUrlParts。空允许列表会被视为未设置;如果你想完全禁用 URL 获取,请使用 files.allowUrl: false / images.allowUrl: false
  • 对于 OpenResponses 文件输入,解码后的 input_file 文本仍会作为不可信外部内容注入。不要因为 Gateway 网关在本地解码了文件文本,就认为它是可信的。注入的块仍会携带显式的 <<<EXTERNAL_UNTRUSTED_CONTENT ...>>> 边界标记和 Source: External 元数据,尽管此路径省略了较长的 SECURITY NOTICE: 横幅。
  • 当媒体理解在把文本追加到媒体提示之前从附加文档中提取文本时,也会应用相同的基于标记的包装。
  • 为任何接触不可信输入的智能体启用沙箱隔离和严格工具允许列表。
  • 不要把密钥放进提示;改为通过 Gateway 网关主机上的环境变量/配置传递。

自托管 LLM 后端

与托管提供商相比,OpenAI 兼容的自托管后端(如 vLLM、SGLang、TGI、LM Studio 或自定义 Hugging Face 分词器栈)在处理聊天模板特殊令牌的方式上可能不同。如果后端把用户内容中的 <|im_start|><|start_header_id|><start_of_turn> 等字面字符串分词为结构性聊天模板令牌,不可信文本就可能尝试在分词器层伪造角色边界。 OpenClaw 会在将包装后的外部内容分发给模型之前,剥离常见模型系列的特殊令牌字面量。请保持外部内容包装启用,并在可用时优先使用会拆分或转义用户提供内容中特殊令牌的后端设置。OpenAI 和 Anthropic 等托管提供商已经应用自己的请求侧清理。

模型强度(安全说明)

提示注入抵抗能力在不同模型层级之间并不一致。较小/更便宜的模型通常更容易受到工具误用和指令劫持的影响,尤其是在对抗性提示下。
对于启用工具的智能体或会读取不可信内容的智能体,使用较旧/较小模型时的提示注入风险通常过高。不要在较弱的模型层级上运行这些工作负载。
建议:
  • 对任何可以运行工具或接触文件/网络的机器人,使用最新一代、最佳层级的模型
  • 不要为启用工具的智能体或不可信收件箱使用较旧/较弱/较小的层级;提示注入风险太高。
  • 如果必须使用较小模型,请降低影响范围(只读工具、强沙箱隔离、最小文件系统访问、严格允许列表)。
  • 运行小模型时,除非输入受到严格控制,否则请为所有会话启用沙箱隔离禁用 web_search/web_fetch/browser
  • 对于输入可信且没有工具的纯聊天个人助手,较小模型通常没问题。

群组中的推理和详细输出

/reasoning/verbose/trace 可能暴露内部推理、工具输出或插件诊断,而这些内容并不应出现在公共渠道中。在群组设置中,请将它们视为仅用于调试,并保持关闭,除非你明确需要它们。 指导:
  • 在公共房间中保持 /reasoning/verbose/trace 禁用。
  • 如果启用它们,只应在受信任私信或严格受控的房间中启用。
  • 请记住:详细输出和跟踪输出可能包含工具参数、URL、插件诊断以及模型看到的数据。

配置加固示例

文件权限

在 Gateway 网关主机上保持配置 + 状态私有:
  • ~/.openclaw/openclaw.json: 600(仅用户可读/写)
  • ~/.openclaw: 700(仅用户)
openclaw doctor 可以发出警告,并主动收紧这些权限。

网络暴露(绑定、端口、防火墙)

Gateway 网关在单个端口上复用 WebSocket + HTTP
  • 默认:18789
  • 配置/标志/环境变量:gateway.port--portOPENCLAW_GATEWAY_PORT
此 HTTP 表面包括控制 UI 和画布主机:
  • 控制 UI(SPA 资源)(默认基础路径 /
  • 画布主机:/__openclaw__/canvas//__openclaw__/a2ui/(任意 HTML/JS;视为不可信内容)
如果你在普通浏览器中加载画布内容,请像对待任何其他不可信网页一样对待它:
  • 不要将画布主机暴露给不可信网络/用户。
  • 除非你完全理解其影响,否则不要让画布内容与特权 Web 表面共享同源。
绑定模式控制 Gateway 网关监听的位置:
  • gateway.bind: "loopback"(默认):只有本地客户端可以连接。
  • 非 loopback 绑定("lan""tailnet""custom")会扩大攻击面。仅在有 Gateway 网关认证(共享令牌/密码或正确配置的受信任代理)和真实防火墙时使用它们。
经验法则:
  • 优先使用 Tailscale Serve,而不是 LAN 绑定(Serve 会让 Gateway 网关保持在 loopback 上,由 Tailscale 处理访问)。
  • 如果必须绑定到 LAN,请用防火墙将端口限制为严格的源 IP 允许列表;不要广泛做端口转发。
  • 切勿在 0.0.0.0 上以未认证方式暴露 Gateway 网关。

使用 UFW 发布 Docker 端口

如果你在 VPS 上使用 Docker 运行 OpenClaw,请记住,已发布的容器端口(-p HOST:CONTAINER 或 Compose ports:)会通过 Docker 的转发链路路由,而不只是主机 INPUT 规则。 为了让 Docker 流量与你的防火墙策略保持一致,请在 DOCKER-USER 中强制执行规则(此链会在 Docker 自己的接受规则之前评估)。在许多现代发行版上,iptables/ip6tables 使用 iptables-nft 前端,并且仍会将这些规则应用到 nftables 后端。 最小允许列表示例(IPv4):
# /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(端口 5353 上的 _openclaw-gw._tcp)广播其存在,用于本地设备发现。在完整模式下,这包括可能暴露运行细节的 TXT 记录:
  • cliPath:CLI 二进制文件的完整文件系统路径(会暴露用户名和安装位置)
  • sshPort:公布主机上的 SSH 可用性
  • displayNamelanHost:主机名信息
操作安全注意事项: 广播基础设施细节会让本地网络中的任何人更容易进行侦察。即使是文件系统路径和 SSH 可用性这类“无害”信息,也会帮助攻击者绘制你的环境图。 建议:
  1. 除非需要 LAN 设备发现,否则保持 Bonjour 禁用。 Bonjour 会在 macOS 主机上自动启动,在其他地方则需要选择启用;直接 Gateway 网关 URL、Tailnet、SSH 或广域 DNS-SD 可以避免本地组播。
  2. 最小模式(启用 Bonjour 时的默认模式,建议用于暴露的网关):从 mDNS 广播中省略敏感字段:
    {
      discovery: {
        mdns: { mode: "minimal" },
      },
    }
    
  3. 如果你想保持插件启用但禁止本地设备发现,请使用 禁用 mDNS 模式
    {
      discovery: {
        mdns: { mode: "off" },
      },
    }
    
  4. 完整模式(选择启用):在 TXT 记录中包含 cliPath + sshPort
    {
      discovery: {
        mdns: { mode: "full" },
      },
    }
    
  5. 环境变量(替代方式):设置 OPENCLAW_DISABLE_BONJOUR=1,无需修改配置即可禁用 mDNS。
当 Bonjour 在最小模式下启用时,Gateway 网关会广播足够用于设备发现的信息(rolegatewayPorttransport),但会省略 cliPathsshPort。需要 CLI 路径信息的应用可以改为通过经过身份验证的 WebSocket 连接获取。

锁定 Gateway 网关 WebSocket(本地认证)

默认情况下 必须启用 Gateway 网关认证。如果未配置有效的网关认证路径, Gateway 网关会拒绝 WebSocket 连接(失败关闭)。 新手引导默认会生成令牌(即使是 loopback),因此 本地客户端必须进行身份验证。 设置令牌,使 所有 WS 客户端都必须进行身份验证:
{
  gateway: {
    auth: { mode: "token", token: "your-token" },
  },
}
Doctor 可以为你生成一个: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。对于受信任的私有网络 路径,请在客户端进程上设置 OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 作为应急开关。这有意仅作为进程环境变量,而不是 openclaw.json 配置键。 移动端配对以及 Android 手动或扫码网关路由更严格: loopback 可接受明文,但私有 LAN、链路本地、.local 和 无点主机名必须使用 TLS,除非你显式选择启用受信任的 私有网络明文路径。 本地设备配对:
  • 直接本地 local loopback 连接会自动批准设备配对,以保持同主机客户端顺畅。
  • OpenClaw 还有一条较窄的后端/容器本地自连接路径,用于受信任的共享密钥辅助流程。
  • Tailnet 和 LAN 连接,包括同主机 Tailnet 绑定,都会被视为远程配对,仍然需要批准。
  • loopback 请求上的转发头证据会使 loopback 本地性失效。元数据升级自动批准的范围很窄。两项规则请参阅 Gateway 网关配对
认证模式:
  • gateway.auth.mode: "token":共享不记名令牌(推荐用于大多数设置)。
  • gateway.auth.mode: "password":密码认证(建议通过环境变量设置:OPENCLAW_GATEWAY_PASSWORD)。
  • gateway.auth.mode: "trusted-proxy":信任具备身份感知能力的反向代理,由其认证用户并通过标头传递身份(参见 受信任代理认证)。
轮换检查清单(令牌/密码):
  1. 生成/设置新的密钥(gateway.auth.tokenOPENCLAW_GATEWAY_PASSWORD)。
  2. 重启 Gateway 网关(如果 macOS 应用负责监管 Gateway 网关,则重启 macOS 应用)。
  3. 更新所有远程客户端(调用 Gateway 网关的机器上的 gateway.remote.token / .password)。
  4. 验证旧凭证无法再连接。

Tailscale Serve 身份标头

gateway.auth.allowTailscaletrue(Serve 的默认值)时,OpenClaw 会接受 Tailscale Serve 身份标头(tailscale-user-login)用于 Control UI/WebSocket 认证。OpenClaw 通过本地 Tailscale 守护进程解析 x-forwarded-for 地址(tailscale whois)并将其与标头匹配来验证身份。 这只会在请求命中 loopback,并且包含由 Tailscale 注入的 x-forwarded-forx-forwarded-protox-forwarded-host 时触发。 对于这条异步身份检查路径,同一 {scope, ip} 的失败尝试会在限流器记录失败之前串行化。 因此,来自同一个 Serve 客户端的并发错误重试可能会立即锁定第二次尝试, 而不是以两次普通不匹配的形式竞争通过。 HTTP API 端点(例如 /v1/*/tools/invoke/api/channels/*不会使用 Tailscale 身份标头认证。它们仍会遵循网关配置的 HTTP 认证模式。 重要边界说明:
  • Gateway 网关 HTTP 不记名认证实际上是全有或全无的操作员访问。
  • 将可以调用 /v1/chat/completions/v1/responses/api/channels/* 的凭证视为该网关的完全访问操作员密钥。
  • 在 OpenAI 兼容 HTTP 表面上,共享密钥不记名认证会恢复完整的默认操作员作用域(operator.adminoperator.approvalsoperator.pairingoperator.readoperator.talk.secretsoperator.write)以及 Agent 轮次的所有者语义;更窄的 x-openclaw-scopes 值不会降低这条共享密钥路径的权限。
  • HTTP 上的按请求作用域语义仅在请求来自带身份的模式时适用,例如受信任代理认证,或私有入口上的 gateway.auth.mode="none"
  • 在这些带身份的模式中,省略 x-openclaw-scopes 会回退到正常的操作员默认作用域集合;当你需要更窄的作用域集合时,请显式发送该标头。
  • /tools/invoke 遵循相同的共享密钥规则:令牌/密码不记名认证在那里也被视为完整操作员访问,而带身份的模式仍会遵守声明的作用域。
  • 不要与不受信任的调用方共享这些凭证;建议为每个信任边界使用单独的网关。
信任假设: 无令牌 Serve 认证假设网关主机是受信任的。 不要把它当作针对恶意同主机进程的保护。如果不受信任的 本地代码可能在网关主机上运行,请禁用 gateway.auth.allowTailscale, 并通过 gateway.auth.mode: "token""password" 要求显式共享密钥认证。 安全规则: 不要从你自己的反向代理转发这些标头。如果 你在网关前终止 TLS 或代理,请禁用 gateway.auth.allowTailscale,并改用共享密钥认证(gateway.auth.mode: "token""password")或 受信任代理认证 受信任代理:
  • 如果你在 Gateway 网关前终止 TLS,请将 gateway.trustedProxies 设置为你的代理 IP。
  • OpenClaw 将信任来自这些 IP 的 x-forwarded-for(或 x-real-ip),以确定用于本地配对检查和 HTTP 认证/本地检查的客户端 IP。
  • 确保你的代理会覆盖 x-forwarded-for,并阻止直接访问 Gateway 网关端口。
参见 TailscaleWeb 概览

通过节点主机进行浏览器控制(推荐)

如果你的 Gateway 网关在远端,但浏览器运行在另一台机器上,请在浏览器机器上运行一个节点主机, 并让 Gateway 网关代理浏览器操作(参见 浏览器工具)。 将节点配对视为管理员访问。 推荐模式:
  • 将 Gateway 网关和节点主机保持在同一个 Tailnet(Tailscale)上。
  • 有意配对该节点;如果不需要浏览器代理路由,请将其禁用。
避免:
  • 通过 LAN 或公共互联网暴露中继/控制端口。
  • 对浏览器控制端点使用 Tailscale Funnel(公开暴露)。

磁盘上的密钥

假设 ~/.openclaw/(或 $OPENCLAW_STATE_DIR/)下的任何内容都可能包含密钥或私有数据:
  • openclaw.json:配置可能包含令牌(Gateway 网关、远程 Gateway 网关)、提供商设置和允许列表。
  • credentials/**:渠道凭证(示例:WhatsApp 凭证)、配对允许列表、旧版 OAuth 导入。
  • agents/<agentId>/agent/auth-profiles.json:API 密钥、令牌配置、OAuth 令牌,以及可选的 keyRef/tokenRef
  • agents/<agentId>/agent/codex-home/**:每 Agent Codex 应用服务器账号、配置、Skills、插件、原生线程状态和诊断。
  • secrets.json(可选):由 file SecretRef 提供商(secrets.providers)使用的文件后端密钥载荷。
  • agents/<agentId>/agent/auth.json:旧版兼容文件。发现静态 api_key 条目时会清理。
  • agents/<agentId>/sessions/**:会话转录(*.jsonl)+ 路由元数据(sessions.json),可能包含私密消息和工具输出。
  • 内置插件包:已安装插件(以及它们的 node_modules/)。
  • sandboxes/**:工具沙箱工作区;可能会累积你在沙箱内读写文件的副本。
加固建议:
  • 保持严格权限(目录 700,文件 600)。
  • 在网关主机上使用全盘加密。
  • 如果主机是共享的,建议为 Gateway 网关使用专用 OS 用户账号。

工作区 .env 文件

OpenClaw 会为 Agent 和工具加载工作区本地 .env 文件,但绝不会让这些文件静默覆盖网关运行时控制项。
  • 任何以 OPENCLAW_* 开头的键都会被阻止从不受信任的工作区 .env 文件加载。
  • Matrix、Mattermost、IRC 和 Synology Chat 的渠道端点设置也会被阻止从工作区 .env 覆盖,因此克隆的工作区无法通过本地端点配置重定向内置连接器流量。端点环境变量键(例如 MATRIX_HOMESERVERMATTERMOST_URLIRC_HOSTSYNOLOGY_CHAT_INCOMING_URL)必须来自网关进程环境或 env.shellEnv,而不是来自工作区加载的 .env
  • 阻止策略是失败关闭:未来版本新增的运行时控制变量不能从已签入或攻击者提供的 .env 继承;该键会被忽略,网关会保持自己的值。
  • 受信任的进程/OS 环境变量(网关自己的 shell、launchd/systemd 单元、应用包)仍然适用 - 这只限制 .env 文件加载。
原因:工作区 .env 文件经常与 Agent 代码放在一起,可能被意外提交,或由工具写入。阻止整个 OPENCLAW_* 前缀意味着以后新增 OPENCLAW_* 标志时,绝不会退化为从工作区状态静默继承。

日志和转录(脱敏和保留)

即使访问控制正确,日志和转录也可能泄露敏感信息:
  • Gateway 网关日志可能包含工具摘要、错误和 URL。
  • 会话转录可能包含粘贴的密钥、文件内容、命令输出和链接。
建议:
  • 保持日志和转录脱敏开启(logging.redactSensitive: "tools";默认)。
  • 通过 logging.redactPatterns 为你的环境添加自定义模式(令牌、主机名、内部 URL)。
  • 共享诊断信息时,建议使用 openclaw status --all(可粘贴,密钥已脱敏),而不是原始日志。
  • 如果不需要长期保留,请清理旧会话转录和日志文件。
详情:日志记录

私信:默认配对

{
  channels: { whatsapp: { dmPolicy: "pairing" } },
}

群组:处处要求提及

{
  "channels": {
    "whatsapp": {
      "groups": {
        "*": { "requireMention": true }
      }
    }
  },
  "agents": {
    "list": [
      {
        "id": "main",
        "groupChat": { "mentionPatterns": ["@openclaw", "@mybot"] }
      }
    ]
  }
}
在群聊中,仅在被明确提及时才响应。

单独号码(WhatsApp、Signal、Telegram)

对于基于电话号码的渠道,考虑让你的 AI 使用与你个人号码不同的单独电话号码运行:
  • 个人号码:你的对话保持私密
  • 机器人号码:AI 处理这些对话,并设置适当边界

只读模式(通过沙箱和工具)

你可以通过组合以下配置构建只读配置文件:
  • 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 路径和原生提示图片自动加载路径限制在工作区目录内(如果你当前允许绝对路径,并希望有一个统一的防护栏,这会很有用)。
  • 保持文件系统根目录范围较窄:避免为智能体工作区/沙箱工作区使用像主目录这样的宽泛根目录。宽泛根目录可能会让文件系统工具访问到敏感的本地文件(例如 ~/.openclaw 下的状态/配置)。

安全基线(复制/粘贴)

一个“安全默认”配置:让 Gateway 网关保持私有、要求私信配对,并避免始终在线的群组机器人:
{
  gateway: {
    mode: "local",
    bind: "loopback",
    port: 18789,
    auth: { mode: "token", token: "your-long-random-token" },
  },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
如果你还希望工具执行“默认更安全”,请为任何非所有者智能体添加沙箱,并拒绝危险工具(下面“按智能体的访问配置文件”中有示例)。 聊天驱动的智能体轮次内置基线:非所有者发送者不能使用 crongateway 工具。

沙箱隔离(推荐)

专用文档:沙箱隔离 两种互补方法:
  • 在 Docker 中运行完整的 Gateway 网关(容器边界):Docker
  • 工具沙箱agents.defaults.sandbox,主机 Gateway 网关 + 沙箱隔离工具;Docker 是默认后端):沙箱隔离
为防止跨智能体访问,请将 agents.defaults.sandbox.scope 保持为 "agent"(默认),或使用 "session" 获得更严格的按会话隔离。scope: "shared" 使用单个容器或工作区。
还需要考虑沙箱内的智能体工作区访问:
  • agents.defaults.sandbox.workspaceAccess: "none"(默认)让智能体工作区不可访问;工具针对 ~/.openclaw/sandboxes 下的沙箱工作区运行
  • agents.defaults.sandbox.workspaceAccess: "ro" 以只读方式将智能体工作区挂载到 /agent(禁用 write/edit/apply_patch
  • agents.defaults.sandbox.workspaceAccess: "rw" 以读写方式将智能体工作区挂载到 /workspace
  • 额外的 sandbox.docker.binds 会根据规范化和标准化后的源路径进行验证。如果父级符号链接技巧和标准主目录别名解析到被阻止的根目录,例如 /etc/var/run,或操作系统主目录下的凭据目录,仍会默认拒绝。
tools.elevated 是全局基线逃生口,会在沙箱之外运行 exec。有效主机默认是 gateway,或者当 exec 目标配置为 node 时是 node。请严格限制 tools.elevated.allowFrom,不要为陌生人启用它。你还可以通过 agents.list[].tools.elevated 按智能体进一步限制 elevated。参见 Elevated 模式

子智能体委派防护栏

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

浏览器控制风险

启用浏览器控制会让模型具备驱动真实浏览器的能力。 如果该浏览器配置文件已包含登录会话,模型可以访问这些账号和数据。 请将浏览器配置文件视为敏感状态
  • 优先为智能体使用专用配置文件(默认的 openclaw 配置文件)。
  • 避免将智能体指向你的个人日常使用配置文件。
  • 除非你信任沙箱隔离智能体,否则保持主机浏览器控制禁用。
  • 独立的 loopback 浏览器控制 API 仅接受共享密钥认证(Gateway 网关 token bearer auth 或 Gateway 网关密码)。它不会使用 trusted-proxy 或 Tailscale Serve 身份标头。
  • 将浏览器下载视为不可信输入;优先使用隔离的下载目录。
  • 如果可能,在智能体配置文件中禁用浏览器同步/密码管理器(降低影响范围)。
  • 对于远程 Gateway 网关,假设“浏览器控制”等同于对该配置文件可访问内容的“操作者访问”。
  • 将 Gateway 网关和 node 主机保持为仅 tailnet 可访问;避免将浏览器控制端口暴露给 LAN 或公共互联网。
  • 不需要浏览器代理路由时将其禁用(gateway.nodes.browser.mode="off")。
  • Chrome MCP 现有会话模式并不“更安全”;它可以以你的身份操作该主机 Chrome 配置文件可访问的任何内容。

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

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

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

通过多智能体路由,每个智能体都可以拥有自己的沙箱 + 工具策略: 用它为每个智能体提供完全访问只读无访问。 完整详情和优先级规则请参见 多 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",
        },
        // Session tools can reveal sensitive data from transcripts. By default OpenClaw limits these tools
        // to the current session + spawned subagent sessions, but you can clamp further if needed.
        // See `tools.sessions.visibility` in the configuration reference.
        tools: {
          sessions: { visibility: "tree" }, // self | tree | agent | all
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "whatsapp",
            "telegram",
            "slack",
            "discord",
          ],
          deny: [
            "read",
            "write",
            "edit",
            "apply_patch",
            "exec",
            "process",
            "browser",
            "canvas",
            "nodes",
            "cron",
            "gateway",
            "image",
          ],
        },
      },
    ],
  },
}

事件响应

如果你的 AI 做了不当操作:

遏制

  1. 停止它: 停止 macOS app(如果它监管 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 token、auth-profiles.json 中的模型/API 密钥,以及使用时的加密 secrets payload 值)。

审计

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

收集报告材料

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

密钥扫描

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

报告安全问题

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