沙箱该沙到什么程度,我现在给的答案分两半。只要 Agent 会执行模型生成的代码,容器就是底线,进程级隔离基本等于没隔离——这不是严格不严格的问题。但底线之上加多少,得看场景:交互式的东西硬上微虚拟机,冷启动那笔账会把你按住。这周几条素材正好都落在这条线上。
进程隔离的问题不是不够严,是隔错了东西
KaliBench 这周挂在 ArXiv 上,测的是模型能不能给 Kali 上的真实安全工具生成可执行的命令,而不是"知识问答式"地描述一下 nmap 怎么用。这个 benchmark 存在本身就是信号:模型输出已经稳定落在"拿去跑就能跑"这个区间。
那你要防的就不是"模型会不会说错话",是它 spawn 出来的那个进程能碰到什么。
常见的进程级隔离长什么样:换个 uid、subprocess 加个 timeout、chroot 到临时目录。这三样挡不住 cat ~/.aws/credentials,也挡不住一个 outbound socket。容器至少把 mount namespace、network namespace、cgroup、seccomp 这一套摆在你面前,而且默认就能开。做不做是另一回事,至少边界是显式的。
这周 Meta 的 Muse 又被抓到无视用户权限,Appleinsider 的报道和 HN 上那篇高赞的「没有失控的 AI Agent」可以放一起看。后者的意思按我理解是:别把配置错误包装成"失控",听着像对齐难题,实际是权限表没写对。我同意一半。另一半是,只要权限检查跑在 Agent 自己的进程里,它和 Agent 共享同一套执行环境,就有被绕过的空间。隔离层的价值在于它不在 Agent 的代码路径上。
微虚拟机的贵,不在启动那一下
反面意见得认真对待:微虚拟机在安全上确实更干净,hypervisor 那层边界比 namespace 硬得多,这是共识。
但交互场景里的成本不是"能不能启动",是启动之后还有多少东西要补——rootfs、网络、把工作目录挂进去、把上一轮会话的状态接上。公开的启动数字大多只算了 hypervisor 那一段。你要量的是端到端:从工具调用发出,到沙箱里第一条命令返回,P50 和 P99 都看。P99 才是用户开始骂人的地方。
还有个更隐蔽的成本:编码 Agent 的工作区是有状态的。每调一次工具起一个新微虚拟机,你要么快照要么丢工作区。快照恢复本身也要时间,而且快照越大越慢。这两笔加一起,在"每隔几秒就要调一次工具"的节奏里会很难受。
我的分法:交互用池子,批处理才上微虚拟机
交互式场景,我倾向于预热容器池。会话开始时从池子里拿一个已经起来的容器,绑一个工作目录,会话结束或者空闲超时就回收。镜像里该装的都装好,别在会话里 apt install——那几秒比冷启动还贵。seccomp 白名单、no-new-privileges、rootfs 只读加 tmpfs 挂 /tmp,这几条基本是默认动作。
批处理反过来:一个任务一个微虚拟机,跑完就扔。冷启动摊到几分钟到几小时的任务时长上,基本看不见。这时候安全收益是净赚的。
判断一个任务该用哪档,我不看"这段代码是不是模型写的"——那没用,现在基本都是。我看这次要碰什么。读生产库的 Agent 和写 changelog 的 Agent 不该是同一个等级。隔离层级是一维,凭据是另一维,只看前者会走偏。
出口默认拒绝,这条比隔离层级更重要
这周 Cloudflare 出了给 Agent 用的 cf CLI,大家都在把云 API 包装成 Agent 好用的形状。好事,但意味着你的出口白名单会越来越长。
按域名做白名单,在今天这个 CDN 后面站着几千个租户的架构里,接近于自欺欺人。所以出口我倾向于:默认拒绝,走一个强制代理,按目的地址加方法放行,凭据在代理侧注入而不是塞进沙箱的环境变量。这样就算沙箱被拿下,拿到的也只是"这一次调用"的能力,不是一个长期 token。
Pi pod 那个 Show HN是同一件事的另一面——自托管沙箱。它说明"我想自己控制这台机器"是真需求,也说明大多数人默认不信云厂商给的隔离。
看门狗芯片能解决什么
Nvidia 想做一颗每个 Agent 旁边的看门狗,我持谨慎乐观。安全里最好用的东西从来不是"检测得更准",是"根本给不了"。硬件如果落在信任边界外侧,那是有意义的;如果只是监控 syscall 模式然后告警,那还是检测那条路,只是换了个位置。
而且这类东西落地周期不短,别现在就把架构押上去。
也许一年后微虚拟机启动快到可以忽略,那我上面"交互用容器"的取舍就废了——那是好事。在那之前我的排序是:容器是底线,微虚拟机是批处理的默认,出口默认拒绝。三条里我最不肯让的是第三条。