您的位置首页 >人工智能 >

字节二面被问agent里的sandbox有啥用以及是如何构建的?我想都没想就说不就是一个docker吗?面试官说我只说对了一半

这是道技术面试题,需要把 “容器只是其中一层” 讲清楚。我先核实 2026 年主流 agent sandbox 方案的实现方式,以及它们各自公开的隔离机制。

材料够了:Vercel 的 Firecracker 架构、E2B 的隔离参数,还有一篇 arXiv 论文实测了五款沙箱的 seccomp 白名单和可达内核原语数量 —— 这正好能解释清楚面试官说的 “另一半”。

标题:Agent 的 sandbox 不是 “一个 Docker”:面试官要的另一半,是内核边界与出口治理

面试里那句 “不就是一个 Docker 吗”,对的一半是 “容器化、可丢弃、按任务起环境” 这套思路;错的一半是把 “运行时” 当成了 “隔离边界”。Docker 默认的 runc 容器共享宿主内核,它是打包边界和资源边界,不是安全边界;而 agent sandbox 要挡的是模型刚刚写出来、没人审过的代码,威胁模型完全反过来了。一份 2026 年的引擎级实测给出了很硬的一组对照:E2B 的沙箱进程只放行 55 个系统调用,gVisor 是 84 个,而 Daytona 默认的 runc 容器是 0 个 seccomp 过滤、内核字符串与宿主逐字节一致,/dev 下能看到 268 个设备节点。同样叫 “sandbox”,隔离强度差了一个数量级。

sandbox 在 agent 里承担四件事,缺一件都不算合格。

作用具体挡什么没有它会怎样
隔离爆炸半径模型生成的 shell 命令、装包、删文件一条 rm -rf 打到宿主或生产目录
约束能力文件、网络、凭证、系统调用读到云元数据里的临时凭证并外传
保证可复现固定镜像、固定依赖、快照“我这儿能跑” 变成排查噩梦
支撑并发与回收每任务一个环境、用完即毁、TTL长跑任务互相污染,成本失控

第一件事的分量,从一个真实案例就能看出来。安全研究员 Johann Rehberger 在 Claude Computer Use 公测后几天做了 “ZombAIs” 实验:让 agent 正常浏览一个网页,页面里藏着注入指令,agent 读完就把一个二进制下载下来、chmod +x、执行,然后连上了他的命令控制服务器。整条链路里没有任何一步是 “漏洞利用”,全是 agent 被授权做的正常操作 —— 这正是容器挡不住、必须靠沙箱挡的部分。

隔离不是二选一,是一条从 “策略” 到 “硬件” 的阶梯。

层级代表实现启动开销边界强度适合什么
OS 级策略Landlock + seccomp、nsjail、bubblewrap、macOS Seatbelt约 5–30 ms中本机 agent、只读任务、MCP 工具
容器(runc)Docker /containerd 默认约 300 ms低(共享宿主内核)已审过的可信代码
用户态内核gVisor(runsc / Sentry)约 200 ms中高无 KVM、想低成本升级
微虚机Firecracker、Kata Containers约 100–125 ms(快照恢复可到 5–30 ms)高(独立 guest 内核)跑不可信代码的默认选择
托管沙箱E2B、Vercel Sandbox、Modal、Northflank按厂商,49–200 ms 级高不想自己运维

这张表里最容易被忽略的是第一行。不是所有场景都值得上微虚机:如果 agent 只在开发者机器上跑几条只读命令,一个 5 毫秒启动的无特权进程沙箱就够了。arXiv 上那篇《Sandlock》做的就是这件事 —— 不用 root、不用镜像、不用命名空间,靠 Landlock + seccomp-bpf 编译静态策略,启动开销约 5 到 6 毫秒,跑 Redis 能到裸机吞吐。它把 “策略” 和 “隔离硬件” 分开了:策略决定能碰什么,硬件决定逃出去有多难。

微虚机为什么成了跑不可信代码的默认选择,关键在 “逃逸要付几道门”。Firecracker 是 AWS 为 Lambda 和 Fargate 写的 VMM,用 KVM 起一个只带 virtio-net、virtio-blk、virtio-vsock 的精简虚机,冷启动约 125 毫秒,每个实例内存开销不到 5 MiB,单机每秒能起 150 个milos-mitrovic.online。客体内的代码即使拿到 root,也只拿到 “自己的内核”;要碰宿主,还得再破 KVM 和 Firecracker 那层极小的设备模型。gVisor 走的是另一条路:Sentry 在用户态接管系统调用,不透传宿主,但它只实现了大约 70% 到 80% 的 Linux 系统调用,I/O 密集场景有 10% 到 30% 的额外开销 —— 省了硬件虚拟化,付出的是兼容性和性能。

真正的工程差距,在 “进程能被允许做什么” 这一层,而不是 “用了哪种虚机”。

实测项E2B(Firecracker)gVisorDaytona 默认(runc)
seccomp 过滤有,55 个 syscall 白名单,全部线程生效有,84 个无,全部线程 mode 0
客体内核独立,6.1.158合成内核 4.19.0-gvisor宿主内核原样(6.8.0-100-generic)
/dev 可见节点12815268
14 类内核提权原语可达数7511

这组数字比任何宣传语都说明问题:同样标 “隔离”,可达的攻击面差了近一倍。要补充一句公道话 —— 这是按 “默认部署路径” 测的,厂商另有 VM 档位;而且可达不等于可利用,还要看客体内核版本与补丁。但它足以支撑一个判断:选沙箱时先读隔离模型,别读标签。

构建一个能上生产的 agent sandbox,顺序是五层,跳过任何一层都会留下洞。

层要做的事具体参数 / 做法
1 策略先定义 “这个任务允许碰什么”可读路径白名单、可写路径、允许的端口与域名、禁止的 syscall
2 边界按代码可信度选隔离档不可信代码 → 微虚机;本机只读 → Landlock/seccomp;无 KVM → gVisor
3 出口默认拒绝出网,按需放行域名 + CIDR 规则,拒 deny 优先;阻断云元数据 169.254.169.254
4 凭证密钥不进沙箱代理注入(credential brokering),沙箱只拿短期、任务级 token
5 生命周期每任务一个环境,用完即毁TTL 兜底、硬超时(单次工具 30s / 单任务 20min)、全量审计

落到具体命令上,一个 “够用” 的本地版本大致长这样 —— 注意这里每一个 flag 都是在补 Docker 默认缺的那一块。

参数作用不写会怎样
--runtime=runsc用 gVisor 替掉共享内核内核漏洞直接等于容器逃逸
--network=none断网注入的 payload 可以直接外传数据
--read-only根文件系统只读代码可以改写镜像、留后门
--tmpfs /tmp:size=64m,noexec给小块可写空间且禁止执行下载的二进制能落地并运行
--cap-drop=ALL丢掉全部 capability挂载、改网络等能力仍在
--security-opt no-new-privileges禁止提权setuid 程序可提权
--memory 256m --cpus 0.5资源上限死循环或挖矿拖垮宿主
timeout=30硬超时卡住的 agent 无限计费

这套组合的启动成本会上升,所以生产上通常再加两个工程手段:预热池(把 “取容器” 从 300 毫秒降到 1 毫秒级)和快照恢复(PandaStack 公布的 create→ready 是 49 毫秒 p50,E2B 的托管沙箱在 200 毫秒内就绪)。省下来的不是钱,是 “每任务一个干净环境” 这件事能不能成为默认值。

买服务还是自己搭,取决于你要不要为 “运维” 付人。

选择适合代价
自建 Firecracker有 KVM 裸金属、有合规要求、量大快照管理、预热池、网络与磁盘全归你
买托管(E2B / Vercel / Modal / Northflank)想快速上线、按量计费隔离细节不透明,出口与凭证要自己配
只用加固容器代码可信、内网、非多租户内核逃逸仍在威胁模型里

买的时候别只看 “是不是微虚机”,还要看三个落地细节:出口规则谁优先(Vercel 是 deny 优先,E2B 是 allow 优先,语义不同)、凭证怎么进(代理注入还是环境变量,后者沙箱内代码能直接读)、以及能不能按任务维度限流与审计。

最后是一些被问到时最容易答错的点。

常见说法更准确的说法
“sandbox 就是一个 Docker 容器”容器是打包与资源边界,共享宿主内核;不可信代码要独立内核(微虚机)或用户态内核(gVisor)
“用了微虚机就安全了”KVM 与 VMM 本身也有 CVE;隔离只缩小逃逸面,出口、凭证、权限仍要单独管
“隔离做好了,就不用管权限”多数真实事故是 agent 用 “合法权限” 干了坏事,隔离管不住它被授权做的事
“gVisor 和微虚机差不多”gVisor 只覆盖约 70%–80% 系统调用,I/O 有 10%–30% 开销;微虚机兼容性完整但启动更贵
“厂商说独立内核就一定独立”第三方实测显示部分产品默认档是 runc、内核字符串与宿主一致,要按档位核对
“沙箱越多越安全”每任务一个、用完即毁才是关键;复用沙箱等于给下一个任务留了攻击面

【常见问题】

问题 1:agent 的 sandbox 到底有什么用,不加会怎么样?

回答 1:它把 agent 的动作关进一个 “可丢弃、可限制、可审计” 的环境里,作用有四层:限制爆炸半径(一条 rm -rf 打不到宿主)、约束能力(文件、网络、凭证、系统调用)、保证可复现(固定镜像与快照)、支撑并发与回收(每任务一个环境、TTL 兜底)。不加的后果不是 “可能出错”,而是 “必然出错只是时间问题”:ZombAIs 实验里 agent 被一个网页注入,下载并执行了二进制、连上 C2,全程没有一步是漏洞利用,全是它被允许做的正常操作。

问题 2:为什么说 agent sandbox 不只是一个 Docker?

回答 2:因为 Docker 默认的 runc 容器与宿主共享内核,它解决的是 “打包和资源配额”,不是 “不可信代码的隔离”。引擎级实测里,Daytona 默认档的 seccomp 过滤是 0、内核字符串与宿主逐字节一致、/dev 可见 268 个节点;E2B 的 Firecracker 沙箱是 55 个 syscall 白名单、独立内核、/dev 只看得到 128 个。同样叫 sandbox,14 类内核提权原语的可达数是 7 比 11。所以正确的说法是:Docker 是 sandbox 的一种低成本实现,只在代码可信时成立。

问题 3:构建 agent sandbox 时,微虚机和 gVisor 该怎么选?

回答 3:看两个约束 —— 有没有 KVM、代码有多不可信。有 KVM、跑模型生成的任意代码,选 Firecracker 一类微虚机:独立 guest 内核、冷启动约 125 毫秒、快照恢复可到 5–30 毫秒、内存开销不到 5 MiB。没有 KVM、或者想在现有 Docker 上快速加一层,选 gVisor:Sentry 在用户态接管 syscall,代价是只覆盖约 70%–80% 系统调用、I/O 密集有 10%–30% 开销。如果只是本机只读任务,两者都不必上,Landlock + seccomp 的无特权进程沙箱 5 毫秒就能起。

问题 4:agent sandbox 建好之后,还需要补哪些东西?

回答 4:补三样,缺一样隔离就白做。第一是出口:默认拒绝出网、按域名和 CIDR 放行、阻断云元数据地址,否则沙箱里的代码照样能把数据传出去。第二是凭证:密钥不要放进沙箱环境变量,用代理在边界外注入短期、任务级 token,沙箱内代码读不到明文。第三是生命周期与审计:每任务一个环境、TTL 兜底、单次工具 30 秒、单任务 20 分钟的硬超时,并把 agent 生成的代码和每次出站请求全量落日志。隔离解决 “跑得安全”,这三样解决 “跑得可控”。

【参考资料】

[2026-10-15](Best Code Execution Sandboxes for AI Agents in 2026)E2B Changelog

[2026-09-23](Code Execution Sandboxes for AI Agents (2026):八家平台的隔离、自托管与持久化对比)PandaStack

[2026-06-26](Docker MicroVM 沙箱:给 AI Agent 代码执行加上安全护栏)YOMXXX

[2026-06-30](AI Code Sandboxes: A Comparative Security Study, Part 1(arXiv 2606.08433))arXiv 预印本

[2026-03-23](Sandlock: Confining AI Agent Code with Unprivileged Linux Primitives(arXiv 2605.26298))arXiv 预印本

[2026-03-20](Vercel Sandbox vs E2B:计算生命周期、安全控制与计费对比)Vercel Knowledge Base

[2026-03-18](AI Agent Sandbox: How to Safely Run Autonomous Agents in 2026)Firecrawl

[2026-01-30](Run untrusted code with Vercel Sandbox, now generally available)Vercel

【免责声明】

本文依据各厂商公开文档、Vercel 与 E2B 的产品说明、Firecrawl 的行业综述,以及两篇 arXiv 预印本整理。隔离强度、启动耗时与系统调用数据存在明显的口径差异:厂商公布的 “独立内核 / 毫秒级启动” 多为自家基准或最佳档位,arXiv 2606.08433 的测量针对的是各产品默认部署路径,且 “原语可达” 不等于 “可利用”,实际风险还取决于客体内核版本与补丁节奏;该预印本的具体上传日期以 arXiv 页面为准,本文按编号 2606 归属 2026 年 6 月。启动耗时(Firecracker 约 125 毫秒、gVisor 约 200 毫秒、容器约 300 毫秒)取自公开资料与论文对比表,不同硬件与镜像下会有浮动。文中提到的 docker run 参数为最小加固示例,不构成生产级安全方案;涉及多租户、敏感数据或合规场景,应以专业安全评估与厂商最新文档为准。本文为技术原理解读,不构成对任何产品或服务的推荐。

今日大家都在搜的词: