当 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 隔离)值得进一步研究。
评论