沙箱(sandbox) 安全与工程

别名: 沙箱

把 Agent 的能力关进笼子的机制集合:工作目录路径约束(`resolveWithinRoot`)、命令白名单、无 shell 执行。与 ch18 权限层的分工是——权限层管意图(该不该做),沙箱管能力(能做多坏);即使人类批准了危险参数,沙箱仍然拒绝。

它是什么

沙箱(sandbox)是把 Agent 的能力关进笼子的机制集合。ch18 的权限层管「该不该做」(意图),沙箱管「能做多坏」(能力)——人类批准了 delete_file(../../etc/passwd) 也没用,沙箱仍然拒绝。本教程的沙箱由三件套组成:工作目录路径约束resolveWithinRoot,拦 .. 逃逸/绝对路径/前缀碰撞)、命令白名单(fail-closed,只放行只读命令)、无 shell 执行execFile 参数数组,没有 shell 元字符注入通道)。

能力与意图分开约束

审批门拦不住「运行哪条命令」——人类批准的是「运行命令」这个意图,run_shell({command}) 的参数是模型在执行瞬间才决定的。所以沙箱在工具层兜底:每个碰文件系统的工具执行前最后一刻调校验,拒绝 = 抛错 → 走 error-as-data,模型能看到「为什么被拒」。注意 read_fileauto 档(不需要审批)也照样受路径约束——沙箱不看风险档位auto 工具同样被约束。

诚实局限

白名单拦命令名、不拦参数cat /etc/passwd 能过白名单。彻底隔离需要容器/虚拟机级——smolagents 官方对本地白名单解释器的态度就是「不是安全边界」("this solution is not watertight"),生产级用 E2B/Docker 容器。我们做对的事是把「任意命令执行」降级为「有限只读命令」,把 RCE 面缩到最小;这也是「纵深防御」的意义:每一层都不完美,叠加后攻击者无处可绕。

在本教程的位置

第 19 章「手写实现:把沙箱装进产品」一节:lib/sandbox.mjs 三个纯函数族(零 import,浏览器判题可跑),工具层 createBaseTools({ rootDir }) 接入;loop 与协议一行没改——安全在工具层,这是设计而不是偷懒。相关词条:路径遍历Shell 隔离提示注入

相关词条

出现在这些章节