沙箱 vs 工具策略 vs 提升权限
OpenClaw 有三个相关但不同的控制项:
- 沙箱(
agents.defaults.sandbox.*、agents.entries.*.sandbox.*,或必需的创建者角色策略)决定工具在哪里运行(沙箱后端 vs 主机)。 - 工具策略(
tools.*、tools.sandbox.tools.*、agents.entries.*.tools.*)决定哪些工具可用/被允许。 - 提权(
tools.elevated.*、agents.entries.*.tools.elevated.*)是从常规沙箱中逃逸的仅限 exec 的逃生舱(默认是gateway,当执行目标配置为node时则是node)。它不能绕过创建者角色的强制沙箱。
快速调试¶
使用检查器查看 OpenClaw 实际 在做什么:
openclaw sandbox explain
openclaw sandbox explain --session agent:main:main
openclaw sandbox explain --agent work
openclaw sandbox explain --json
它会输出:
- 生效的沙箱模式/范围/工作区访问权限
- 会话当前是否处于沙箱中(main 与 non-main)
- 生效的沙箱工具允许/拒绝列表(以及它来自 agent/global/default 中的哪一层)
- 提权门控和 fix-it 关键路径
沙箱:工具在哪里运行¶
沙箱行为由 agents.defaults.sandbox.mode 控制:
"off":会话在主机上运行,除非其创建者的操作者角色要求沙箱。"non-main":只有 non-main 会话会被沙箱化(对群组/频道来说常见的“意外”)。"all":所有内容都被沙箱化。
agents.defaults.sandbox.workspaceAccess 控制沙箱可以看到什么:"none"、"ro" 或 "rw"。
带有 sandbox: "required" 的操作者角色会覆盖 agent 模式,无法通过提权执行或主机覆盖来绕过,并且当其沙箱无法配置时会失败关闭(fail closed)。参见 命名操作者角色。
完整的矩阵(范围、工作区挂载、镜像)请参见 沙箱。
绑定挂载(安全快速检查)¶
docker.binds会_穿透_沙箱文件系统:你挂载的任何内容都会以你设置的模式(:ro或:rw)在容器内可见。- 如果省略模式,默认为读写;对于源代码/机密信息,建议使用
:ro。 scope: "shared"会忽略每个 agent 的绑定(仅应用全局绑定)。- OpenClaw 会对绑定来源进行两次验证:先验证规范化后的来源路径,然后在通过最深已存在祖先目录解析后再次验证。符号链接父目录逃逸无法绕过 blocked-path 或 allowed-root 检查。
- 不存在的叶子路径仍会被安全检查。如果
/workspace/alias-out/new-file通过符号链接的父目录解析到被阻止的路径,或超出配置的 allowed roots,绑定将被拒绝。 - 绑定
/var/run/docker.sock实际上将主机控制权交给了沙箱;请仅在有意为之的情况下这样做。 - 工作区访问权限(
workspaceAccess)独立于绑定模式。
有关包含多个主机文件夹、访问模式以及外部来源安全选择启用(opt-in)的每个 agent 配置,请参见 单个 agent 的多个文件夹。
工具策略:哪些工具存在/可被调用¶
有五个层很重要:
- 工具配置文件:
tools.profile和agents.entries.*.tools.profile(基础允许列表) - 提供方工具配置文件:
tools.byProvider[provider].profile和agents.entries.*.tools.byProvider[provider].profile - 全局/每个 agent 的工具策略:
tools.allow/tools.deny和agents.entries.*.tools.allow/agents.entries.*.tools.deny - 提供方工具策略:
tools.byProvider[provider].allow/deny和agents.entries.*.tools.byProvider[provider].allow/deny - 沙箱工具策略(仅在沙箱化时生效):
tools.sandbox.tools.allow/tools.sandbox.tools.deny和agents.entries.*.tools.sandbox.tools.*
经验法则:
deny始终优先。- 如果
allow非空,则其他所有内容都被视为阻止。 - 工具策略是硬性停止:
/exec不能覆盖被拒绝的exec工具。 - 工具策略按名称过滤工具的可用性;它不检查
exec内部的副作用。如果exec被允许,拒绝write、edit或apply_patch并不会让 shell 命令变成只读。 /exec只会为经过授权的发送者更改会话默认值;它不会授予工具访问权限。- 提供方工具键接受
provider(例如anthropic)或provider/model(例如openai/gpt-5.4)。 - 当工具策略步骤移除工具或沙箱工具策略阻止调用时,Gateway 日志会包含
agents/tool-policy审计条目。使用openclaw logs查看规则标签、配置键和受影响的工具名称。
工具组(简写)¶
工具策略(全局、agent、沙箱)支持 group:* 条目,这些条目会展开为多个工具:
{
tools: {
sandbox: {
tools: {
allow: ["group:runtime", "group:fs", "group:sessions", "group:memory"],
},
},
},
}
可用的组:
group:runtime:exec、process、code_execution(bash可作为exec的别名)group:fs:read、write、edit、apply_patchgroup:sessions:sessions、sessions_list、sessions_history、sessions_search、conversations_list、conversations_send、conversations_turn、sessions_send、sessions_spawn、sessions_yield、subagents、session_status、suggest_task、dismiss_taskgroup:memory:memory_search、memory_getgroup:web:web_search、x_search、web_fetchgroup:ui:browser、screen、terminal、canvas、progress_card、show_widgetgroup:automation:heartbeat_respond、cron、gatewaygroup:messaging:messagegroup:nodes:nodes、computergroup:agents:agents_list、get_goal、create_goal、update_goal、progress_card、ask_user、skill_workshopgroup:media:view_image、image_generate、music_generate、video_generate、tts、pdfgroup:openclaw:大多数 OpenClaw 内置工具(不包括read/write/edit/apply_patch/exec/process这些 fs 和运行时原语、canvas,以及提供方插件)group:plugins:所有已加载的插件所属工具,包括通过bundle-mcp暴露的已配置 MCP 服务器
对于只读代理,除非沙箱文件系统策略或独立的主机边界强制执行只读约束,否则还应拒绝 group:runtime 以及会修改文件系统的工具。
对于沙箱化的 MCP 服务器,沙箱工具策略是第二道允许门。如果已配置 mcp.servers,但沙箱回合中只显示内置工具,请将 bundle-mcp、group:plugins,或带服务器前缀的 MCP 工具名称/通配符(例如 outlook__send_mail 或 outlook__*)添加到 tools.sandbox.tools.alsoAllow,然后重启/重新加载网关并重新获取工具列表。服务器通配符使用提供程序安全的 MCP 服务器前缀:非 [A-Za-z0-9_-] 字符会变为 -,不以字母开头的名称会添加 mcp- 前缀,过长或重复的前缀可能会被截断或添加后缀。
openclaw doctor 目前会检查 mcp.servers 中由 OpenClaw 管理的服务器是否符合此结构。从捆绑插件清单或 Claude .mcp.json 加载的 MCP 服务器使用相同的沙箱门,但该诊断功能尚未枚举这些来源;如果它们的工具在沙箱回合中消失,请使用相同的允许列表条目。
提权:仅限 exec 的“在主机上运行”¶
提权不会授予额外工具;它只影响 exec。
- 如果你通常处于沙箱中,
/elevated on(或带有elevated: true的exec)会在沙箱外运行(仍可能需要审批)。要求创建者角色的沙箱会拒绝提权执行。 - 使用
/elevated full可跳过该会话的 exec 审批。 - 如果你已经直接运行,提权实际上是无操作(仍受门控)。
- 提权不是技能作用域的,也不会覆盖工具允许/拒绝。
- 提权不会授予来自
host=auto的任意跨主机覆盖;它遵循正常的 exec 目标规则,并且仅当配置/会话目标已经是node时才保留node。 /exec与提权相互独立。它只为授权发送者调整每个会话的 exec 默认值。
门控:
- 启用:
tools.elevated.enabled(以及可选的agents.entries.*.tools.elevated.enabled) - 发送者允许列表:
tools.elevated.allowFrom.<provider>(以及可选的agents.entries.*.tools.elevated.allowFrom.<provider>)
参见 提权模式。
常见“沙箱隔离”修复¶
“工具 X 被沙箱工具策略阻止”¶
修复键(任选其一):
- 禁用普通沙箱:
agents.defaults.sandbox.mode=off(或按代理agents.entries.*.sandbox.mode=off);这不会覆盖创建者角色要求的沙箱。 - 在沙箱内允许该工具:
- 将其从
tools.sandbox.tools.deny(或按代理agents.entries.*.tools.sandbox.tools.deny)中移除 - 或将其添加到
tools.sandbox.tools.allow(或按代理允许列表) - 检查
openclaw logs中的agents/tool-policy条目。它会记录沙箱模式,以及是允许规则还是拒绝规则阻止了该工具。
“我以为这是主会话,为什么它被沙箱化了?”¶
在 "non-main" 模式下,群组/频道键_不是_主会话。请使用主会话键(由 sandbox explain 显示),或将模式切换为 "off"。
相关¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw