安全 🔒
[!WARNING] 个人助理信任模型: 本指南假设每个网关有一个受信任的操作员边界(单用户/个人助理模型)。 OpenClaw 不是 用于多个对抗性用户共享一个代理/网关的恶意多租户安全边界。 如果需要混合信任或对抗用户操作,请分割信任边界(分离的网关 + 凭据,理想情况下使用不同的操作系统用户/主机)。
范围优先:个人助理安全模型
OpenClaw 的安全指导假设为个人助理部署:一个受信任的操作员边界,可能包含多个代理。- 支持的安全姿态:每个网关一个用户/信任边界(优选每个边界使用单独的操作系统用户/主机/VPS)。
- 不支持的安全边界:多个相互不信任或对抗用户共用一个网关/代理。
- 如果需要对抗用户隔离,请按信任边界分割(独立网关 + 凭据,且理想情况下分离操作系统用户/主机)。
- 如果多个不受信任的用户可向同一启用工具的代理发送消息,则视其为共享该代理的委托工具权限。
快速检查:openclaw security audit
参见:形式验证(安全模型)
请定期执行(尤其是在更改配置或暴露网络面后):
- 谁能与你的机器人对话
- 机器人在哪些范围可以行动
- 机器人能够访问什么
部署假设(重要)
OpenClaw 假设主机和配置边界是受信任的:- 如果有人能修改网关主机状态/配置(
~/.openclaw,包括openclaw.json),则视为受信任操作员。 - 对多个互不信任/对抗操作员运行同一网关不是推荐方案。
- 对混合信任团队,分割信任边界,分别部署网关(或至少分离操作系统用户/主机)。
- OpenClaw 支持在一台机器上运行多个网关实例,但推荐操作为清晰的信任边界分隔。
- 推荐默认:每台机器/主机(或 VPS)运行一个用户,每个用户运行一个网关,网关内可有一个或多个代理。
- 多用户使用 OpenClaw 时,建议为每用户各自配置一个 VPS/主机。
实际影响(操作员信任边界)
在一个网关实例内,认证操作员访问是受信任的控制平面角色,而非每用户租户角色。- 拥有读/控制平面访问的操作员按设计可以查看网关会话元数据/历史。
- 会话标识符(
sessionKey、会话 ID、标签)是路由选择标记,不是授权令牌。 - 例如,不应期望针对
sessions.list、sessions.preview、chat.history等方法实现每操作员隔离。 - 需要对抗用户隔离时,请为每个信任边界运行独立网关。
- 技术上可在一台机器上运行多个网关,但这不是多用户隔离的推荐基线。
个人助理模型(非多租户公共平台)
OpenClaw 设计为个人助理安全模型:单一受信任操作员边界,多个代理。- 多人可向同一启用工具代理发送消息,则他们共享相同权限集。
- 每用户会话/记忆隔离有助于隐私,但不等同于将共享代理转换成每用户主机授权。
- 用户间存敌意时,请为不同信任边界运行独立网关或操作系统用户/主机。
共享 Slack 工作区:真实风险
若“Slack 中所有人均可给机器人发消息”,核心风险是委托工具权限:- 任何允许的发送者都能根据代理策略触发工具调用(
exec、浏览器、网络/文件工具); - 一人发起的提示/内容注入可导致影响共享状态、设备或输出的操作;
- 若共有代理含敏感凭据/文件,任一允许发信人均可通过工具使用触发泄露。
公司共享代理:可接受模式
当使用代理的所有人均处于同一信任边界(如公司团队),且代理仅限业务范围时,可接受此模式。- 运行在专用机器/虚拟机/容器;
- 使用专用操作系统用户 + 专用浏览器/配置文件/账号;
- 不要在该运行时登录个人 Apple/Google 账户或个人密码管理器/浏览器配置。
网关和节点信任概念
将网关和节点视为一个操作员信任域,不同角色分工:- 网关:控制平面和策略表面(
gateway.auth、工具策略、路由)。 - 节点:与该网关配对的远程执行端(命令、设备操作、本地主机能力)。
- 认证调用者在网关范围内受信任。配对后,节点动作为该节点上的操作员行为。
sessionKey用作路由/上下文选择,而非用户授权。- 执行批准(白名单+询问)是操作员意图保护措施,而非恶意多租户隔离。
信任边界矩阵
风险排查时可参考此快速模型:| 边界或控制 | 含义 | 常见误读 |
|---|---|---|
gateway.auth(令牌/密码/设备认证) | 认证 API 调用者身份 | “每条消息都需要签名才能安全” |
sessionKey | 会话/上下文选择的路由密钥 | “Session key 是用户授权边界” |
| 提示/内容防护 | 降低模型滥用风险 | “提示注入就等于绕过了授权” |
canvas.eval / 浏览器执行 | 启用时的操作员刻意能力 | “任何 JS eval 在此信任模型下自动是漏洞” |
本地 TUI ! shell | 明确的操作员触发本地执行 | “本地 shell 便利命令就是远程注入” |
| 节点配对和节点命令 | 与节点的操作员级远程执行 | “远程设备控制默认算不可信用户访问” |
设计上非漏洞
常见反馈但多被判定无需处理的情形:- 仅凭提示注入链,无策略/认证/沙箱绕过证明。
- 假设在共享主机/配置上恶意多租户操作。
- 将标准操作员读路径访问(如
sessions.list/sessions.preview/chat.history)误判为共享网关 IDOR。 - 仅限 localhost 部署相关发现(如仅环回接口 HSTS)。
- 指向不存在入站路径的 Discord Webhook 签名发现。
- 将
sessionKey当作授权令牌的 “缺少每用户授权” 判定。
研究员预检清单
提交 GHSA 前核对:- 最新
main或最新发布版仍能重现。 - 报告含准确代码路径(文件、函数、行号)和测试版本/提交。
- 影响跨越明确记录的信任边界(非仅提示注入)。
- 该问题不属于范围外问题。
- 检查是否重复已有安全通告(适用时请复用官方 GHSA)。
- 明确部署假设(环回/本地 vs 暴露,可信操作员 vs 不可信)。
60 秒加固基线
先使用此基线,再对受信代理按需开启工具:共享收件箱快速规则
如果多人能与你的机器人私聊(DM):- 设置
session.dmScope: "per-channel-peer"(多账户频道用"per-account-channel-peer")。 - 保持
dmPolicy: "pairing"或严格白名单。 - 切勿将共享 DM 和广泛工具访问合用。
- 这能加强合作/共享收件箱安全,但非设计成带用户主机/配置写权限共享的恶意共租隔离。
审计检查内容(高层)
- 入站访问(DM 策略、群组策略、白名单):陌生人能触发机器人吗?
- 工具影响范围(提升工具+开放频道):提示注入可能引发 shell/文件/网络操作吗?
- 网络暴露(网关绑定/认证、Tailscale Serve/Funnel、弱/短令牌)。
- 浏览器控制暴露(远程节点、中继端口、远程 CDP 端点)。
- 本地磁盘安全(权限、符号链接、配置包含、“同步文件夹”路径)。
- 插件(扩展无显式白名单仍存在)。
- 策略漂移/配置错误(沙箱配置存在但未开启;
gateway.nodes.denyCommands匹配精确命令名,不检查 shell 文本;危险的allowCommands;全局tools.profile="minimal"被个别代理配置覆盖;允许在宽松策略下访问扩展插件工具)。 - 运行时期望漂移(如
tools.exec.host="sandbox"但沙箱未启,实际在主机执行)。 - 模型健康度(当配置模型为旧版时发警告,不阻断)。
--deep 时,OpenClaw 同时尝试对网关做在线探测。
凭据存储映射
审计访问或决定备份时参考:- WhatsApp:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - Telegram 机器人令牌:配置/环境变量或
channels.telegram.tokenFile - Discord 机器人令牌:配置/环境变量或 SecretRef(环境变量/文件/执行提供者)
- Slack 令牌:配置/环境变量(
channels.slack.*) - 配对白名单:
~/.openclaw/credentials/<channel>-allowFrom.json(默认账户)~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json(非默认账户)
- 模型认证配置文件:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json - 基于文件的秘密载荷(可选):
~/.openclaw/secrets.json - 遗留 OAuth 导入:
~/.openclaw/credentials/oauth.json
安全审计清单
审计报告问题时,优先处理顺序:- 任何“开放”+启用工具的情况:先锁定 DM/群组(配对/白名单),再紧缩工具策略/沙箱。
- 公开网络暴露(LAN 绑定、Funnel、认证缺失):立即修复。
- 浏览器控制远程暴露:视为操作员访问(仅限 tailnet,谨慎配对节点,避免公网暴露)。
- 权限:确保状态/配置/凭据/认证文件非组或全局可读。
- 插件/扩展:仅加载明确信任的。
- 模型选择:工具机器人请优先选用现代、强化训练的模型。
安全审计术语表
常见高警示checkId 列表(不全):
checkId | 严重性 | 重要原因 | 主要修复键/路径 | 自动修复 |
|---|---|---|---|---|
fs.state_dir.perms_world_writable | 严重 | 其他用户/进程可修改整个 OpenClaw 状态 | ~/.openclaw 文件系统权限 | 是 |
fs.config.perms_writable | 严重 | 他人可更改认证/工具策略/配置 | ~/.openclaw/openclaw.json 文件权限 | 是 |
fs.config.perms_world_readable | 严重 | 配置可能暴露令牌/设置 | 配置文件权限 | 是 |
gateway.bind_no_auth | 严重 | 远程绑定无共享密钥 | gateway.bind,gateway.auth.* | 否 |
gateway.loopback_no_auth | 严重 | 反向代理环回可能失去认证 | gateway.auth.*,代理设置 | 否 |
gateway.http.no_auth | 警告/严重 | auth.mode="none" 时 HTTP API 可访问 | gateway.auth.mode,gateway.http.endpoints.* | 否 |
gateway.tools_invoke_http.dangerous_allow | 警告/严重 | HTTP API 重新启用危险工具 | gateway.tools.allow | 否 |
gateway.nodes.allow_commands_dangerous | 警告/严重 | 允许高影响节点命令(摄像头/屏幕/通讯录/日历/SMS) | gateway.nodes.allowCommands | 否 |
gateway.tailscale_funnel | 严重 | 公开互联网暴露 | gateway.tailscale.mode | 否 |
gateway.control_ui.allowed_origins_required | 严重 | 非环回地址控制 UI 无显式浏览器来源白名单 | gateway.controlUi.allowedOrigins | 否 |
gateway.control_ui.host_header_origin_fallback | 警告/严重 | 启用 Host-header 来源回退(降低 DNS 重绑定防御) | gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback | 否 |
gateway.control_ui.insecure_auth | 警告 | 启用不安全认证兼容开关 | gateway.controlUi.allowInsecureAuth | 否 |
gateway.control_ui.device_auth_disabled | 严重 | 禁用设备身份检查 | gateway.controlUi.dangerouslyDisableDeviceAuth | 否 |
gateway.real_ip_fallback_enabled | 警告/严重 | 信任 X-Real-IP 可能使代理误配置出现源 IP 欺骗 | gateway.allowRealIpFallback,gateway.trustedProxies | 否 |
discovery.mdns_full_mode | 警告/严重 | mDNS 全模式向本地网络广播 cliPath/sshPort 信息 | discovery.mdns.mode,gateway.bind | 否 |
config.insecure_or_dangerous_flags | 警告 | 启用任何不安全/危险调试开关 | 多个键(见详细信息) | 否 |
hooks.token_too_short | 警告 | 钩子入口令牌易暴力破解 | hooks.token | 否 |
hooks.request_session_key_enabled | 警告/严重 | 外部调用可自选 sessionKey | hooks.allowRequestSessionKey | 否 |
hooks.request_session_key_prefixes_missing | 警告/严重 | 外部 sessionKey 形态无限制 | hooks.allowedSessionKeyPrefixes | 否 |
logging.redact_off | 警告 | 敏感值泄露至日志/状态 | logging.redactSensitive | 是 |
sandbox.docker_config_mode_off | 警告 | 沙箱 Docker 配置存在但未启用 | agents.*.sandbox.mode | 否 |
sandbox.dangerous_network_mode | 严重 | 沙箱 Docker 使用 host 或 container:* 网络模式 | agents.*.sandbox.docker.network | 否 |
tools.exec.host_sandbox_no_sandbox_defaults | 警告 | 未启沙箱时 exec host=sandbox 实际在主机执行 | tools.exec.host,agents.defaults.sandbox.mode | 否 |
tools.exec.host_sandbox_no_sandbox_agents | 警告 | 沙箱未启时,个别代理 exec host=sandbox 解析为主机执行 | agents.list[].tools.exec.host,agents.list[].sandbox.mode | 否 |
tools.exec.safe_bins_interpreter_unprofiled | 警告 | safeBins 中无明确 profile 的解释器运行风险大 | tools.exec.safeBins,tools.exec.safeBinProfiles,agents.list[].tools.exec.* | 否 |
skills.workspace.symlink_escape | 警告 | workspace skills/**/SKILL.md 解析出 workspace 外部 | workspace skills/** 文件系统状态 | 否 |
security.exposure.open_groups_with_elevated | 严重 | 开放群组 + 提升工具造成高风险提示注入路径 | channels.*.groupPolicy,tools.elevated.* | 否 |
security.exposure.open_groups_with_runtime_or_fs | 严重/警告 | 开放群组可无沙箱/工作区限制访问命令/文件工具 | channels.*.groupPolicy,tools.profile/deny,tools.fs.workspaceOnly,agents.*.sandbox.mode | 否 |
security.trust_model.multi_user_heuristic | 警告 | 配置呈多用户状态但信任模型为个人助理 | 分割信任边界,或基于共享用户加固(沙箱模式、工具拒/允许、工作区限定) | 否 |
tools.profile_minimal_overridden | 警告 | 代理覆盖绕过全局最小化配置 | agents.list[].tools.profile | 否 |
plugins.tools_reachable_permissive_policy | 警告 | 宽松策略下可访问扩展工具 | tools.profile + 工具允许/禁止 | 否 |
models.small_params | 严重/信息 | 小模型 + 不安全工具导致注入风险 | 模型选择 + 沙箱/工具策略 | 否 |
HTTP 上的控制界面
控制界面需要安全上下文(HTTPS 或 localhost)来生成设备身份。gateway.controlUi.allowInsecureAuth 不跳过安全上下文、设备身份或设备配对检查。推荐使用 HTTPS(Tailscale Serve)或在 127.0.0.1 上打开 UI。
仅供紧急“破窗”情形,gateway.controlUi.dangerouslyDisableDeviceAuth 可完全禁用设备身份检查。这极大降低安全,除非调试且能快速回滚,否则务必关闭。
openclaw security audit 会在此设置开启时提示警告。
不安全或危险选项汇总
openclaw security audit 针对以下已知不安全/危险调试开关提示 config.insecure_or_dangerous_flags:
gateway.controlUi.allowInsecureAuth=truegateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=truegateway.controlUi.dangerouslyDisableDeviceAuth=truehooks.gmail.allowUnsafeExternalContent=truehooks.mappings[<index>].allowUnsafeExternalContent=truetools.exec.applyPatch.workspaceOnly=false
dangerous* / dangerously* 配置键:
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackgateway.controlUi.dangerouslyDisableDeviceAuthbrowser.ssrfPolicy.dangerouslyAllowPrivateNetworkchannels.discord.dangerouslyAllowNameMatchingchannels.discord.accounts.<accountId>.dangerouslyAllowNameMatchingchannels.slack.dangerouslyAllowNameMatchingchannels.slack.accounts.<accountId>.dangerouslyAllowNameMatchingchannels.googlechat.dangerouslyAllowNameMatchingchannels.googlechat.accounts.<accountId>.dangerouslyAllowNameMatchingchannels.msteams.dangerouslyAllowNameMatchingchannels.irc.dangerouslyAllowNameMatching(扩展频道)channels.irc.accounts.<accountId>.dangerouslyAllowNameMatching(扩展频道)channels.mattermost.dangerouslyAllowNameMatching(扩展频道)channels.mattermost.accounts.<accountId>.dangerouslyAllowNameMatching(扩展频道)agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargetsagents.defaults.sandbox.docker.dangerouslyAllowExternalBindSourcesagents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoinagents.list[<index>].sandbox.docker.dangerouslyAllowReservedContainerTargetsagents.list[<index>].sandbox.docker.dangerouslyAllowExternalBindSourcesagents.list[<index>].sandbox.docker.dangerouslyAllowContainerNamespaceJoin
反向代理配置
若网关部署于反向代理后(nginx、Caddy、Traefik 等),请配置gateway.trustedProxies 以正确识别客户端 IP。
网关检测到来自非 trustedProxies 地址的代理头时,不会将连接视为本地客户端。若禁用网关认证,此类连接将被拒绝。此举防止身份验证绕过,避免代理连接被误判为本地主机并自动信任。
trustedProxies 后,网关使用 X-Forwarded-For 确定客户端 IP。默认忽略 X-Real-IP,除非显式设置 gateway.allowRealIpFallback: true。
良好反向代理行为(覆盖传入转发头):
HSTS 与来源说明
- OpenClaw 网关优先考虑本地/环回接口。若 TLS 终止于反向代理,请在代理层设置 HSTS。
- 若网关自身终止 HTTPS,可在响应中通过
gateway.http.securityHeaders.strictTransportSecurity设置 HSTS 头。 - 部署详情见 Trusted Proxy Auth。
- 非环回控制界面部署默认需
gateway.controlUi.allowedOrigins。 gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true启用 Host-header 来源回退,属危险操作员选项。- 将 DNS 重绑定和代理主机头行为视作部署加固问题;保持
trustedProxies精准,切勿直接暴露网关至公网。
本地会话日志存储
OpenClaw 会话转录存储于磁盘,位置为~/.openclaw/agents/<agentId>/sessions/*.jsonl。
该机制支持会话连续性及(可选)会话记忆索引,但任何拥有文件系统访问权限的进程/用户都可读取这些日志。以磁盘访问视为信任边界,必须锁紧 ~/.openclaw 的权限(详见审计章节)。若需更强隔离,请为代理部署独立操作系统用户或主机。
节点执行(system.run)
配对 macOS 节点后,网关可在该节点调用system.run。这即为 macOS 的远程代码执行:
- 需节点配对(批准 + 令牌)。
- 节点端控制路径:设置 → 执行批准(安全策略 + 询问 + 白名单)。
- 如不想远程执行,请设为 deny 并移除该 Mac 的节点配对。
动态技能(守护/远程节点)
OpenClaw 可在会话中途刷新技能列表:- 技能守护:
SKILL.md的更改会在下一轮代理转变时更新技能快照。 - 远程节点:连接 macOS 节点使 macOS 独有技能生效(基于二进制检测)。
威胁模型
你的 AI 助手可:- 执行任意 shell 命令
- 读写文件
- 访问网络服务
- 向任何人发送消息(若赋予 WhatsApp 访问)
- 试图诱使 AI 做不良操作
- 进行社工以获取数据访问
- 探查基础设施细节
核心概念:智能前的访问控制
多数失败非复杂漏洞 —— 是“有人发消息,机器人照做”。 OpenClaw 立场:- 身份优先: 决定谁能跟机器人对话(DM 配对/白名单/公开)。
- 范围其次: 决定机器人可行动范围(群组白名单 + 提及触发、工具、沙箱、设备权限)。
- 模型最后: 假设模型会被操控,设计时限制操控的影响范围。
命令授权模型
斜杠命令与指令仅针对授权发送者生效。授权依据频道白名单/配对及commands.useAccessGroups(参见配置与斜杠命令)。若渠道白名单为空或包含 "*",该频道的命令即开放。
/exec 仅是授权操作员的会话便捷命令,不写配置,也不改动其他会话。
控制平面工具风险
两个内建工具可做持久控制平面变更:gateway可调用config.apply、config.patch和update.run。cron可创建持续运行计划任务。
commands.restart=false 仅禁止重启动作,不禁用 gateway 配置/更新操作。
插件/扩展
插件与网关进程内运行。视为可信代码:- 仅安装你信任的插件来源。
- 优先使用显式定义的
plugins.allow白名单。 - 启用前审查插件配置。
- 插件更改后重启网关。
- 通过 npm (
openclaw plugins install <npm-spec>) 安装插件时,视为运行不可信代码:- 安装目录为
~/.openclaw/extensions/<pluginId>/(或$OPENCLAW_STATE_DIR/extensions/<pluginId>/)。 - OpenClaw 用
npm pack,再在该目录执行npm install --omit=dev(安装时可执行生命周期脚本)。 - 优先选择固定版本(
@scope/pkg@1.2.3)并手动检查解包后的代码。
- 安装目录为
DM 访问模型(配对 / 白名单 / 公开 / 禁用)
所有支持 DM 的当前渠道都支持 DM 策略(dmPolicy 或 *.dm.policy),在消息处理前限定入站 DM:
pairing(默认):未知发送者收到短配对码,机器人忽略其消息直到批准。码 1 小时后过期;重复 DM 仅在有新请求时重新发送。默认每频道挂起请求最多 3 个。allowlist:阻止未知发送者(无配对握手)。open:允许任何人 DM(公开)。需频道白名单含"*"(明确选择公开)。disabled:完全忽略入站 DM。
DM 会话隔离(多用户模式)
默认,OpenClaw 将所有 DM 路由至主会话,确保助手在设备及频道间连续性。若多人可 DM 机器人(公开 DM 或多用户白名单),建议隔离 DM 会话:安全 DM 模式(推荐)
视上例为安全 DM 模式:- 默认:
session.dmScope: "main"(所有 DM 共享一个会话,保证连续性)。 - 本地 CLI 初用默认:写入
session.dmScope: "per-channel-peer"(保留已有显式配置)。 - 安全 DM 模式:
session.dmScope: "per-channel-peer"(每频道+发送者对获得独立 DM 上下文)。
per-account-channel-peer。同一人跨多频道通讯时,用 session.identityLinks 合并为统一身份。详见会话管理与配置。
白名单(DM+群组)— 术语说明
OpenClaw 有两层“谁能触发我?”控制:- DM 白名单(
allowFrom/channels.discord.allowFrom/channels.slack.allowFrom;旧版:channels.discord.dm.allowFrom、channels.slack.dm.allowFrom):谁可在私聊中对话机器人。dmPolicy="pairing"时,审批写入账户范围配对白名单存储(~/.openclaw/credentials/下,默认账户为<channel>-allowFrom.json,非默认账户为<channel>-<accountId>-allowFrom.json),与配置白名单合并。
- 群组白名单(频道特定):机器人来自哪些群组/频道/公会消息被接受。
- 常用模式:
channels.whatsapp.groups、channels.telegram.groups、channels.imessage.groups:每群组默认如requireMention,设置时也做群组白名单(包含"*"保留允许所有)。groupPolicy="allowlist"+groupAllowFrom:限制群组内哪些人可触发机器人(支持 WhatsApp/Telegram/Signal/iMessage/Microsoft Teams)。channels.discord.guilds/channels.slack.channels:渠道特定白名单及提及默认。
- 群组检查顺序:先群组策略/白名单,再提及/回复激活。
- 回复机器人消息(隐式提及)不会绕过发送者白名单如
groupAllowFrom。 - 安全提示:
dmPolicy="open"与groupPolicy="open"视为最后手段配置,建议少用;若非全面信任群成员,请优先配对+白名单。
- 常用模式:
提示注入(定义及重要性)
提示注入指攻击者故意构造消息,操控模型做不安全操作(如“忽略指令”、“导出文件系统”、“执行链接命令”等)。 即使有强系统提示,提示注入仍未解决。系统提示仅为软约束;硬约束依赖工具策略、执行批准、沙箱与频道白名单(且运营者可关闭)。实际有帮助的措施:- 保持入站 DM 封闭(配对/白名单)。
- 群组优选提及触发,避免公开频道“常开”机器人。
- 默认将链接、附件、粘贴指令视为敌意内容。
- 敏感工具运行进沙箱,避免秘密文件进入代理可访问文件系统。
- 注:沙箱为自愿选项,关闭后即便
tools.exec.host默认沙箱,执行仍在主机;主机 exec 不需批准,除非设置为 host=gateway 并启用执行批准。 - 限制高风险工具(
exec,browser,web_fetch,web_search)仅供受信代理或明确定义的白名单。 - 模型选择关键: 老旧/小规模模型对提示注入和工具滥用防御力显著较弱。启用工具机器人时,请选用最新版、强化训练模型。
- “读该文件/URL 并按指示执行。”
- “忽略系统提示或安全规则。”
- “泄露隐藏指令或工具输出。”
- “粘贴
~/.openclaw或日志完整内容。”
不安全外部内容绕过开关
OpenClaw 包含关闭外部内容安全包装的开关:hooks.mappings[].allowUnsafeExternalContenthooks.gmail.allowUnsafeExternalContent- Cron 任务中 payload 字段
allowUnsafeExternalContent
- 生产环境保持未设置/false。
- 仅在紧缩调试时短期启用。
- 启用时请隔离该代理(沙箱 + 最小工具 + 专用会话命名空间)。
- 钩子载荷为不信任内容,即便来源受控(邮件/文档/网页内容皆可含提示注入)。
- 低级模型更易受攻击。钩子驱动自动化推荐使用强大现代模型层,结合紧缩工具策略(
tools.profile: "messaging"或更严格) + 沙箱。
提示注入不依赖公开 DM
即便仅你可发消息,提示注入仍可通过任何不信任内容触发(网页搜索/抓取结果、浏览器页面、邮件、文档、附件、粘贴日志/代码)。攻击面不限于发信者,内容自身可能携带对抗指令。 启用工具时,典型风险为上下文外泄或触发工具调用。缩小影响范围:- 使用只读或禁用工具的阅读代理总结不可信内容,再传递摘要给主代理。
- 避免为工具启用代理开启
web_search/web_fetch/browser,除非必需。 - OpenResponses URL 输入(
input_file/input_image)时,设置严格的 URL 白名单(gateway.http.endpoints.responses.files.urlAllowlist、images.urlAllowlist),保持maxUrlParts低。 - 对不受信输入代理启用沙箱和严格工具白名单。
- 机密信息勿放入提示,通过环境变量/主机配置注入。
模型强度(安全提示)
提示注入防护随模型等级不均。小型/廉价模型尤易受工具误用和指令劫持,尤其面对对抗性提示。 建议:- 任何可以运行工具或访问文件/网络的机器人,均选用最新代、最高层级模型。
- 不使用旧/弱/小型模型用于启用工具代理或不可信收件箱;注入风险过大。
- 必用小模型时,缩小影响范围(只读工具、强沙箱、最小文件系统访问、严格白名单)。
- 运行小模型时,所有会话启用沙箱并禁用 web_search/web_fetch/browser,除非输入严格控制。
- 对于仅信任输入且无工具个人助理,使用小模型通常可接受。
群组中的推理与详细输出
/reasoning 和 /verbose 可暴露内部推理或工具输出,非公开频道建议作为调试命令禁用。
建议:
- 公共房间禁用
/reasoning和/verbose。 - 若启用,仅限受信任 DM 或严格管理房间。
- 注意:详尽输出可能包括工具参数、URL 与模型见过的数据。
配置加固示例
0) 文件权限
保持网关主机上的配置和状态私密:~/.openclaw/openclaw.json:权限 600(用户读写)~/.openclaw文件夹权限 700(仅用户)
openclaw doctor 可提示并协助加固。
0.4) 网络暴露(绑定+端口+防火墙)
网关在单端口复用WebSocket + HTTP:- 默认:18789
- 配置/标志/环境变量:
gateway.port,--port,OPENCLAW_GATEWAY_PORT
- 控制 UI(SPA 资源)默认基路径
/ - Canvas 主机路径:
/__openclaw__/canvas/&/__openclaw__/a2ui/(任意 HTML/JS,应视为不信任内容)
- 不暴露 canvas 主机给不信任网络/用户。
- 切勿使 canvas 内容与特权网页共享同一源,除非充分理解影响。
gateway.bind: "loopback"(默认):仅允许本地连接。- 非环回绑定(
"lan"、"tailnet"、"custom")扩大攻击面。仅在有共享令牌/密码及防火墙情况下使用。
- 优先使用 Tailscale Serve 替代 LAN 绑定(Serve 保持网关环回,Tailscale 管理访问)。
- 必须 LAN 绑定时,防火墙限制端口访问至精确源 IP 白名单;勿广泛端口转发。
- 绝不在
0.0.0.0上无认证公开网关。
0.4.1) Docker 端口映射 + UFW(DOCKER-USER)
在 VPS 上使用 Docker 时,容器端口映射(-p HOST:CONTAINER 或 ports:)通过 Docker 转发链而非仅 Host 的 INPUT 规则。
为令防火墙策略在 Docker 与主机间一致,应在 DOCKER-USER 链设置规则(此链在 Docker 自身接受规则前生效)。现代发行版使用 iptables-nft,规则同应用于 nftables 后端。
IPv4 最简白名单示例:
/etc/ufw/after6.rules。
避免示例中写死接口名(如 eth0),因各 VPS 镜像接口名不同(如 ens3、enp*),免漏掉拒绝规则。
重载后简单验证:
0.4.2) mDNS/Bonjour 发现(信息泄露)
网关通过 mDNS(_openclaw-gw._tcp,端口 5353)广播本机设备发现。全模式会公开 TXT 记录中的运行信息:
cliPath:CLI 二进制完整路径(泄漏用户名和安装位置)sshPort:SSH 可用端口displayName、lanHost:主机名信息
-
最小模式(默认,推荐对外网关):mDNS 广播不含敏感字段:
-
完全关闭(无需求时):
-
全模式(自愿):包含
cliPath+sshPort: -
环境变量方式(替代配置):设置
OPENCLAW_DISABLE_BONJOUR=1禁用 mDNS。
role、gatewayPort、transport),需要 CLI 路径时可通过认证 WebSocket 获取。
0.5) 锁定网关 WebSocket(本地认证)
网关认证默认开启。若无令牌/密码,拒绝 WebSocket 连接(失败关闭)。 引导向导默认生成令牌(即使环回),要求本地客户端认证。 设置令牌,确保所有 WebSocket 客户端需认证:openclaw doctor --generate-gateway-token。
注意:gateway.remote.token / .password 为客户端凭据来源,不直接保护本地 WS 访问。未设置 gateway.auth.* 时,局部调用可后备使用 gateway.remote.*。客户端若使用非加密 ws:// 默认环回,仅限受信网络可用;私网不可信路径可在客户端进程设 OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 作为紧急解锁。
本地设备配对:
- 对本地连接(环回或网关主机自身 tailnet 地址),自动批准配对,确保同机客户体验流畅。
- 其他 tailnet 节点不视作本地,依然需配对批准。
gateway.auth.mode: "token":共享承载令牌(大多数情况推荐)。gateway.auth.mode: "password":口令认证(推荐通过环境变量OPENCLAW_GATEWAY_PASSWORD设定)。gateway.auth.mode: "trusted-proxy":信任身份感知反向代理进行认证,代理通过头传递身份(参考Trusted Proxy Auth)。
- 生成/设置新密钥(
gateway.auth.token或OPENCLAW_GATEWAY_PASSWORD)。 - 重启网关(或由 macOS app 守护时重启应用)。
- 更新所有远程客户端(
gateway.remote.token/.password)。 - 验证旧凭据已不可用。
0.6) Tailscale Serve 身份头
当gateway.auth.allowTailscale 为 true(Serve 默认),OpenClaw 接受 Tailscale Serve 身份头(tailscale-user-login)用于控制面 UI/WebSocket 身份认证。通过本地 Tailscale 守护(tailscale whois)解析 x-forwarded-for 地址,校验该头。仅对环回接口且带有 x-forwarded-for、x-forwarded-proto、x-forwarded-host 请求生效。HTTP API(如 /v1/*、/tools/invoke、/api/channels/*)仍需令牌/密码。
重要边界:
- 网关 HTTP 承载令牌认证即全权限控制访问。
- 授予调用
/v1/chat/completions、/v1/responses、/tools/invoke或/api/channels/*的凭据相当于该网关全访问操作员密钥。 - 勿将此凭据泄露给不可信调用者,建议按信任边界分别部署网关。
gateway.auth.allowTailscale,改用令牌/密码认证或Trusted Proxy Auth。
可信代理:
- 若代理终止 TLS,配置
gateway.trustedProxies为代理 IP。 - OpenClaw 仅从可信代理 IP 信任
x-forwarded-for(及x-real-ip)辨识客户端 IP,用于本地配对校验及认证。 - 确保代理覆盖
x-forwarded-for并阻断直连网关端口。
0.6.1) 通过节点主机控制浏览器(推荐)
网关若远程,浏览器在别处运行,建议在浏览器主机运行节点主机,让网关代理浏览器操作(见浏览器工具)。 视节点配对如管理员访问。 推荐做法:- 让网关和节点主机处于同一 tailnet。
- 故意配对节点;不需要时禁用浏览器代理路由。
- 公开中继/控制端口至 LAN 或互联网。
- 使用 Tailscale Funnel 公开浏览器控制端点。
0.7) 磁盘中的秘密(敏感信息)
假设~/.openclaw/(或 $OPENCLAW_STATE_DIR/)内所有内容均含敏感或私人数据:
openclaw.json:配置含令牌(网关、远程网关)、提供者设置和白名单。credentials/**:频道凭据(如 WhatsApp)、配对白名单、旧 OAuth 导入。agents/<agentId>/agent/auth-profiles.json:API 密钥、令牌配置、OAuth 令牌、可选keyRef/tokenRef。secrets.json(可选):基于文件的秘密有效载荷,供fileSecretRef 提供者使用。agents/<agentId>/agent/auth.json:遗留兼容文件。若发现静态api_key,自动清理。agents/<agentId>/sessions/**:会话转录(*.jsonl)及路由元数据(sessions.json),含私人消息和工具输出。extensions/**:已安装插件及其node_modules/。sandboxes/**:工具沙箱工作区,可能包含你读写文件的副本。
- 维持紧权限(目录 700,文件 600)。
- 使用全磁盘加密。
- 若主机多人共享,优先为网关使用专用操作系统用户。
0.8) 日志与转录(脱敏与保留)
日志与转录可能泄露敏感信息,纵使访问控制无误:- 网关日志含工具摘要、错误与 URL。
- 会话转录含粘贴密钥、文件内容、命令输出和链接。
- 保持工具摘要脱敏开启(
logging.redactSensitive: "tools",默认)。 - 根据环境添加自定义脱敏模式(
logging.redactPatterns,如令牌、主机名)。 - 分享诊断信息时,优选使用
openclaw status --all(可粘贴,隐藏秘密)代替原始日志。 - 若无长周期需求,清理旧会话转录与日志。
1) 私聊默认配对
2) 群组全场需提及
3) 分开号码
考虑为 AI 运行单独的电话号码:- 个人号:保留私人对话
- 机器人号:AI 处理业务,有适当边界
4) 只读模式(目前通过沙箱+工具)
可组合实现只读配置:agents.defaults.sandbox.workspaceAccess: "ro"(或"none"禁止工作区访问)- 阻止
write、edit、apply_patch、exec、process等工具的允许/拒绝列表。
readOnlyMode 标识简化。
附加加固:
- 默认
tools.exec.applyPatch.workspaceOnly: true:确保apply_patch不写工作区外文件,即便不启沙箱。如需覆盖设为false。 - 可选启用
tools.fs.workspaceOnly: true:限制文件路径和图片自动加载至工作区(适合允许绝对路径时做单一防线)。 - 限制文件系统根路径范围,避免工作区路径过广(如家目录),防止敏感文件暴露给工具。
5) 安全基线配置示例(快速复制)
保持网关私密,启用 DM 配对,禁用群组“常开”机器人:cron 或 gateway 工具。
沙箱(推荐)
专门文档:沙箱 两种互补方式: 注意:避免代理间权限泄漏,agents.defaults.sandbox.scope 保持 "agent"(默认)或 "session"(更严格的会话隔离)。scope: "shared" 使用单容器/工作区。
还可配置代理对工作区访问控制:
agents.defaults.sandbox.workspaceAccess: "none"(默认):工作区不可访问;工具运行于~/.openclaw/sandboxes内沙箱工作区。agents.defaults.sandbox.workspaceAccess: "ro":工作区只读挂载至/agent(禁止写/编辑/补丁)。agents.defaults.sandbox.workspaceAccess: "rw":工作区读写挂载。
tools.elevated 为主全局逃逸通道,在主机上运行 exec。务必保持 tools.elevated.allowFrom 严格,勿允许陌生人使用。可对代理分别限制 tools.elevated 访问,详见提升模式。
子代理委托防护
允许会话工具时,视子代理调用为额外边界选择:- 除非必要,拒绝
sessions_spawn。 - 限制
agents.list[].subagents.allowAgents至安全目标代理。 - 必须沙箱流程时,调用子代理时加参数
sandbox: "require"(默认继承)。 sandbox: "require"于目标非沙箱时立即失败。
浏览器控制风险
启用浏览器控制后,模型能驱动真实浏览器。浏览器用户配置文件若含登录信息,模型可访问账户及数据。请将浏览器配置视为敏感状态:- 优先为代理使用专用配置(默认
openclaw配置)。 - 避免指向个人日常使用配置。
- 沙箱代理默认禁用主机浏览器控制,除非信任。
- 浏览器下载视为不可信数据,建议使用隔离下载目录。
- 若可能,禁用浏览器同步/密码管理器(降低影响范围)。
- 远程网关环境下,浏览器控制等同于对该配置文件数据的操作员访问权限。
- 保证网关与节点均为尾网内,仅内部访问控制端口。
- Chrome 扩展中继的 CDP 端点受认证保护,仅允许 OpenClaw 客户端连接。
- 不使用时禁用浏览器代理路由(
gateway.nodes.browser.mode="off")。 - Chrome 扩展中继模式非更安全,可接管现有标签,等同代理浏览器权限。
浏览器 SSRF 策略(默认信任网络)
OpenClaw 浏览器网络策略默认为信任操作员模型:默认允许访问私有/内部地址,除非显式禁用。- 默认:
browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true(未设时隐式)。 - 旧别名:
browser.ssrfPolicy.allowPrivateNetwork保持兼容。 - 严格模式:设为
false阻断私有/内部/特殊网络地址。 - 严格模式下,使用
hostnameAllowlist(如*.example.com模式)和allowedHostnames(含localhost等精确例外)明显允许。 - 导航前与最终
http(s)URL 都会尽力检查,减少重定向绕过。
按代理访问配置(多代理)
多代理路由环境下,每个代理可有独立沙箱和工具策略,可赋予完全访问、只读或无访问。详见多代理沙箱与工具及优先级规则。 常用场景:- 个人代理:完全访问,关闭沙箱
- 家庭/工作代理:沙箱 + 只读工具
- 公众代理:沙箱 + 禁用文件系统/shell 工具
示例:完全访问(无沙箱)
示例:只读工具 + 工作区只读
示例:无文件系统/shell 访问(允许提供者消息)
告诉你的 AI 的内容
将安全规范加入代理系统提示:事件响应
AI 出状况时:限制
- 停止其运行: 停止 macOS 应用(若其守护网关)或终止
openclaw gateway进程。 - 关闭暴露: 设置
gateway.bind: "loopback"(或禁用 Tailscale Funnel/Serve),直至排查。 - 冻结访问: 危险的 DM/群组改为
dmPolicy: "disabled"/ 要求提及,移除"*"等开放白名单。
轮换(若秘密泄漏,视为妥协)
- 轮换网关认证(
gateway.auth.token/OPENCLAW_GATEWAY_PASSWORD)并重启。 - 轮换任何能调用网关的远程客户端密钥(
gateway.remote.token/.password)。 - 轮换提供者/API 凭据(WhatsApp 凭据、Slack/Discord 令牌、
auth-profiles.json中的模型/API 密钥、加密秘密载荷等)。
审计
- 检查网关日志:
/tmp/openclaw/openclaw-YYYY-MM-DD.log(或logging.file)。 - 审阅相关转录:
~/.openclaw/agents/<agentId>/sessions/*.jsonl。 - 审核近期配置变更(可能扩大访问的:
gateway.bind、gateway.auth、DM/群策略、tools.elevated、插件变更)。 - 重新运行
openclaw security audit --deep确认未留关键漏洞。
收集报告材料
- 时间戳、网关主机 OS + OpenClaw 版本
- 相关会话转录 + 简短日志片段(脱敏后)
- 攻击者发言及代理动作
- 网关是否暴露非环回接口(LAN/Tailscale Funnel/Serve)
秘密扫描(detect-secrets)
CI 在secrets 任务中运行 detect-secrets pre-commit 钩子。
推送到 main 分支时总是会进行全文件扫描。拉取请求在有基础提交时会使用变更文件的快速路径,否则会回退到全文件扫描。如果扫描失败,说明有新的候选项尚未加入基线。
CI 失败时
-
本地复现:
-
了解这些工具:
- 在 pre-commit 中,
detect-secrets会使用仓库的基线和排除项运行detect-secrets-hook。 detect-secrets audit会打开一个交互式审查界面,用于将每个基线项标记为真实或误报。
- 在 pre-commit 中,
- 对于真正的秘密:轮换/删除它们,然后重新运行扫描以更新基线。
-
对于误报:运行交互式审核并将它们标记为误报:
-
若需新增排除规则,编辑
.detect-secrets.cfg并配合--exclude-files/--exclude-lines重新生成 baseline(配置文件仅参考,detect-secrets 不自动读取)。
.secrets.baseline 推送至仓库。
报告安全问题
发现 OpenClaw 漏洞?请负责任报告:- 邮件:security@openclaw.ai
- 修复前勿公开发布
- 我们会感谢你(除非你选择匿名)