背景
#106 已完成 Tool Manager 骨架与 Permission Gateway 规则模型落地,当前执行链已经收口为:
Runtime -> Tool Manager -> Permission Gateway -> WorkspaceSandbox -> Executor
但目前 WorkspaceSandbox 仍是 noop,实现上还没有真正建立工作区路径边界。这意味着:
- 文件类工具仍可能通过
..、绝对路径等方式尝试访问 workspace 外路径
- symlink 指向工作区外时,现有边界判定可能被绕过
- 后续 bash/file/MCP 工具继续接入时,缺少统一且可复用的路径安全基座
因此需要把 #98 的下一步聚焦到“真实 workspace sandbox 落地”,优先解决目录边界、path traversal 和 symlink escape 三类高风险问题。
Refs #98
Refs #106
目标
- 将
WorkspaceSandbox 从 noop 替换为真实实现,并接入现有 Tool Manager 执行链
- 对带路径语义的工具调用统一做 workspace 内访问校验
- 阻止以下越界方式:
.. traversal
- workspace 外绝对路径
- symlink 指向 workspace 外的 escape
- 保持当前主链路可用,不在本任务中引入审批 UI、敏感文件策略扩展或重型 OS 沙箱
范围
In Scope
- 实现第一版真实
WorkspaceSandbox
- 为以下工具路径建立统一校验:
filesystem_read_file
filesystem_write_file
filesystem_edit
filesystem_grep
filesystem_glob
bash 的 cwd / workdir 约束
- 统一路径规范化流程:
filepath.Clean
filepath.Abs
- 对已存在路径使用
filepath.EvalSymlinks
- 对待创建文件路径,至少对其已存在父目录链执行 symlink 解析
- 对 workspace 外访问返回稳定错误,并保留足够上下文用于测试与后续 UI 展示
- 补齐 table-driven tests,覆盖 traversal / absolute path / symlink escape / normal in-workspace path
Out of Scope
.git / .env / *.pem 等敏感路径策略扩展
- session 级审批记忆
- PermissionRequest / PermissionResolved 事件
- bash 环境变量白名单 / 网络隔离
- MCP server / tool 级路径策略
- 容器级 / OS 级重沙箱
设计约束
- Runtime / TUI 不直接做路径判断,所有目录边界都必须收敛到 WorkspaceSandbox
- Registry 不负责路径安全逻辑,仍只承担注册与分发职责
- 路径判定必须确定性、可测试,不能依赖字符串前缀的粗糙比较
- 对不存在目标的写入路径,不能只校验最终字符串,必须校验父目录解析结果,防止通过 symlink 父目录逃逸
- 行为应尽量最小侵入:允许 workspace 内正常读写,拒绝越界路径,不顺带改动 tool schema 或 runtime loop
建议拆分实现
- 新增路径规范化与边界判断 helper
- 输入:workspace root、原始目标路径、操作类型
- 输出:规范化后的目标路径、是否越界、错误上下文
- 实现真实
WorkspaceSandbox
- 对
read / write / bash 等 action 做分类处理
- 非路径型 action 保持放行
- 更新 action/target 映射
- 确保 file/bash 类 action 能携带足够的 target 信息供 sandbox 判定
- 将 sandbox 接入 Tool Manager 执行前置链路
- 对拒绝结果补充稳定 metadata / error message
- 补齐测试矩阵并验证主链路无回归
备注
这一步是 #98 的 P0-2,核心目标是先把“工作区边界”做实,为后续敏感路径保护、bash 安全执行器和 MCP 工具治理提供统一基础。
背景
#106 已完成 Tool Manager 骨架与 Permission Gateway 规则模型落地,当前执行链已经收口为:
Runtime -> Tool Manager -> Permission Gateway -> WorkspaceSandbox -> Executor
但目前
WorkspaceSandbox仍是 noop,实现上还没有真正建立工作区路径边界。这意味着:..、绝对路径等方式尝试访问 workspace 外路径因此需要把 #98 的下一步聚焦到“真实 workspace sandbox 落地”,优先解决目录边界、path traversal 和 symlink escape 三类高风险问题。
Refs #98
Refs #106
目标
WorkspaceSandbox从 noop 替换为真实实现,并接入现有 Tool Manager 执行链..traversal范围
In Scope
WorkspaceSandboxfilesystem_read_filefilesystem_write_filefilesystem_editfilesystem_grepfilesystem_globbash的cwd/ workdir 约束filepath.Cleanfilepath.Absfilepath.EvalSymlinksOut of Scope
.git/.env/*.pem等敏感路径策略扩展设计约束
建议拆分实现
WorkspaceSandboxread / write / bash等 action 做分类处理备注
这一步是 #98 的 P0-2,核心目标是先把“工作区边界”做实,为后续敏感路径保护、bash 安全执行器和 MCP 工具治理提供统一基础。