Skip to content

feat(security/tools): P0-2 实现 Workspace Sandbox(含 symlink / traversal 防护) #114

Description

@Cai-Tang-www

背景

#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

目标

  1. WorkspaceSandbox 从 noop 替换为真实实现,并接入现有 Tool Manager 执行链
  2. 对带路径语义的工具调用统一做 workspace 内访问校验
  3. 阻止以下越界方式:
    • .. traversal
    • workspace 外绝对路径
    • symlink 指向 workspace 外的 escape
  4. 保持当前主链路可用,不在本任务中引入审批 UI、敏感文件策略扩展或重型 OS 沙箱

范围

In Scope

  • 实现第一版真实 WorkspaceSandbox
  • 为以下工具路径建立统一校验:
    • filesystem_read_file
    • filesystem_write_file
    • filesystem_edit
    • filesystem_grep
    • filesystem_glob
    • bashcwd / 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

建议拆分实现

  1. 新增路径规范化与边界判断 helper
    • 输入:workspace root、原始目标路径、操作类型
    • 输出:规范化后的目标路径、是否越界、错误上下文
  2. 实现真实 WorkspaceSandbox
    • read / write / bash 等 action 做分类处理
    • 非路径型 action 保持放行
  3. 更新 action/target 映射
    • 确保 file/bash 类 action 能携带足够的 target 信息供 sandbox 判定
  4. 将 sandbox 接入 Tool Manager 执行前置链路
  5. 对拒绝结果补充稳定 metadata / error message
  6. 补齐测试矩阵并验证主链路无回归

备注

这一步是 #98 的 P0-2,核心目标是先把“工作区边界”做实,为后续敏感路径保护、bash 安全执行器和 MCP 工具治理提供统一基础。

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions