笔记

Agent Skill 的沙箱隔离机制

比较 Bubblewrap、sandbox-exec 和容器化方案在 Agent Skill 隔离重放中的适用场景。

当 Agent Skill 需要在本地重放时,隔离机制决定了“这次执行能访问什么”和“这次执行不能访问什么”。不同的隔离方案在安全性、性能和可移植性之间有不同的权衡。

为什么需要隔离

Agent Skill 的重放不是简单的脚本执行。它可能涉及:

  • 文件系统的读写操作。
  • 网络请求。
  • 系统命令的执行。
  • 环境变量的访问。

在没有隔离的情况下,重放一个恶意或有缺陷的 Skill 可能:

  • 删除或修改宿主系统的文件。
  • 泄露环境变量中的敏感信息。
  • 向外部服务发送数据。
  • 安装恶意软件。

隔离的目标是让 Skill 在一个“沙箱”中执行,限制它能访问的资源,同时不影响宿主系统的正常运行。

Bubblewrap(Linux)

Bubblewrap(bwrap)是一个轻量级的沙箱工具,利用 Linux 的 user namespace 实现隔离:

bwrap \
  --ro-bind /usr /usr \
  --bind ./workspace /workspace \
  --unshare-net \
  --die-with-parent \
  -- /bin/bash -c "cd /workspace && ./skill.sh"

能力

  • 文件系统隔离:通过 --ro-bind(只读绑定)和 --bind(读写绑定)控制目录访问。
  • 网络隔离:--unshare-net 禁止网络访问。
  • 进程隔离:--die-with-parent 确保沙箱进程在父进程退出时终止。
  • 轻量级:不需要完整的容器运行时,启动速度快。

限制

  • 需要 user namespace 支持(某些 Linux 发行版默认禁用)。
  • 不提供 CPU 和内存限制(需要配合 cgroups 使用)。
  • 不提供设备访问控制。

适用场景

适合 SkillTape 的本地重放:轻量、快速、不需要安装额外的运行时。Bubblewrap 是 SkillTape 在 Linux 上的默认沙箱方案。

sandbox-exec(macOS)

macOS 的 /usr/bin/sandbox-exec 使用 Seatbelt 机制实现沙箱:

sandbox-exec -f profile.sb /bin/bash -c "./skill.sh"

能力

  • 文件系统访问控制:通过 Seatbelt 配置文件定义允许和禁止的路径。
  • 网络访问控制:限制进程的网络连接能力。
  • 进程权限控制:限制 fork、exec 等系统调用。
  • 系统自带:不需要安装额外的工具。

限制

  • 配置文件语法复杂,调试困难。
  • 不提供 CPU 和内存限制。
  • 某些操作(如访问 Keychain)需要额外的权限声明。

适用场景

适合 SkillTape 在 macOS 上的本地重放:系统自带,不需要安装额外工具。sandbox-exec 是 SkillTape 在 macOS 上的默认沙箱方案。

Docker 容器

Docker 提供了更完整的隔离环境:

docker run --rm \
  --network none \
  --read-only \
  --volume ./workspace:/workspace \
  skill-image ./skill.sh

能力

  • 完整的文件系统隔离:容器有独立的文件系统层。
  • 网络隔离:--network none 禁止所有网络访问。
  • 资源限制:可以限制 CPU、内存、磁盘 I/O。
  • 镜像锁定:使用摘要锁定的镜像,确保执行环境的一致性。
  • 可移植性:相同的容器在任何支持 Docker 的平台上行为一致。

限制

  • 启动速度慢:需要拉取镜像和创建容器层。
  • 资源开销大:每个容器都有独立的进程空间和文件系统。
  • 依赖 Docker 运行时:宿主系统需要安装 Docker。

适用场景

适合 SkillSync 的 Docker 沙箱后端:需要更强的隔离保证和环境一致性时使用。SkillSync 的 Docker 后端使用摘要锁定的镜像和网络隔离,提供比 Bubblewrap 更强的保证。

方案对比

维度 Bubblewrap sandbox-exec Docker
平台 Linux macOS 跨平台
启动速度 快(毫秒) 快(毫秒) 慢(秒)
资源开销 低 低 高
隔离强度 中 中 高
配置复杂度 低 高 中
依赖 bwrap 系统自带 Docker
CPU/内存限制 需要 cgroups 不支持 支持
网络隔离 支持 支持 支持

失败关闭原则

一个重要的安全原则是失败关闭(fail closed):如果沙箱不可用,不应该在无隔离环境下执行。

SkillTape 在 Windows 上的设计体现了这个原则:Replay 和 Verify 故意失败关闭,直到等效的沙箱机制被集成。这比“在没有隔离的情况下执行”更安全。

同样,SkillSync 的 Docker 后端在 Docker 不可用时不会回退到无隔离模式,而是报告 Docker 不可用的状态。

本笔记的状态

这是一个 growing 状态的笔记。随着在更多平台上测试隔离机制,会补充实际遇到的限制和解决方案。特别是 Windows 上的沙箱支持(如 AppContainer 或 Hyper-V 隔离)值得进一步研究。

评论