如果你觉得给AI Agent套上一个Docker容器就万事大吉了,那我建议你先坐下。
这根本不是隔离,这只是一堵“透风的墙”。
现在的技术圈有一种危险的错觉:大家都在跑AI生成的代码,跑多租户脚本,跑RL训练管道,然后把它们往Docker里一扔,就觉得安全了。说实话,这种做法与其说是“隔离”,不如说是“掩耳盗铃”。
为什么?因为你的“墙”根本挡不住真正的攻击。
容器的谎言:那是“可见性”,不是“安全性”
先来打破一个神话:Docker容器并不安全。
我知道这听起来很反直觉。Docker不是号称隔离吗?是的,它隔离了进程ID、文件系统、网络接口。但这在安全专家眼里,这叫“可见性墙壁”。
什么意思?
想象一下,你把一个囚犯关在一个房间里,他看不见外面的世界,但这并不代表他不能在房间里挖地道,或者引爆一颗炸弹把整栋楼掀翻。
Linux内核就是那栋楼。
当你在容器里跑代码时,它依然要通过系统调用和宿主机内核打交道。Linux内核有多少行代码?几千万行C代码。暴露了多少系统调用?大约340个。
每一个系统调用,都是一次通往内核的入口。
每一个隔离技术都在试图回答同一个问题:如何减少不可信代码对那个巨大攻击面的访问。
Docker做了什么?它只是让进程“看不见”外面的资源。但如果内核本身有漏洞呢?
墙壁瞬间形同虚设。
看看最近的案例:2024年1月的CVE-2024-21626,runc的一个文件描述符泄露,让容器直接访问到了宿主机文件系统。哪怕你的命名空间再完美,只要内核有漏洞,一切归零。
更有意思的是,很多人为了“加强”隔离,会开启Docker的特权模式。
这简直是自杀。
为了获得某个特定功能(比如嵌套PID命名空间),你开启了--privileged。结果呢?你加了一层嵌套,却拆掉了Seccomp、设备隔离等好几道防线。
这就像为了给房间装个空调,你把整面墙拆了。
过滤器的尴尬:只是把门的小保安
有人会说:“我用了Seccomp-BPF,过滤了危险系统调用。”
这确实有点用。Docker默认会屏蔽掉40到50个危险的系统调用。但这依然是在同一个内核上“把门”。
你把340个系统调用砍到了300个。
攻击面确实小了,但边界没变。
如果那个允许写入的系统调用有漏洞呢?如果网络栈有漏洞呢?Seccomp管不了这些。它只是个小保安,检查你的通行证,但如果你伪造得够高明,或者拿着合法通行证干坏事,小保安是无能为力的。
真正的隔离:换个内核,或者换个硬件
如果你真的要跑不可信代码(比如用户上传的脚本,或者AI生成的乱七八糟的代码),你需要的是质的改变。
这里有两个真正的狠角色:gVisor 和 MicroVM。
gVisor:请个“替身”内核
gVisor的思路很绝。它不再让不可信代码直接和宿主机内核对话,而是在中间插了一个用Go语言写的“用户态内核”,叫Sentry。
这就像是给犯人配了一个假狱警。犯人以为自己在大杀四方,其实所有的指令都被这个假狱警接住了。
Sentry重新实现了大约200个Linux系统调用。它只向宿主机内核发起极少数(约70个)高度受限的调用。
这不仅仅是缩小攻击面,这是换了一个攻击面。
如果有人想攻击,他得先攻破Go语言写的Sentry,然后再想办法从Sentry逃逸到宿主机。这难度,比攻破一个庞大的Linux内核要大得多。
MicroVM:硬件级的“独立包厢”
如果你觉得gVisor还不够狠,那就上MicroVM(比如Firecracker)。
这直接就是虚拟机。
每个任务都有自己的内核,自己的虚拟硬件。它是靠CPU的硬件虚拟化扩展来隔离的。
这是真正的“铁壁铜墙”。
宿主机内核根本看不到虚拟机里面的内存。就算虚拟机里的内核被攻破了,硬件边界也会把它死死挡住。
唯一的缺点?慢。虽然现在快照技术能让启动快到毫秒级,但对于那种短频快的脚本任务,开销依然存在。
WASM:没有内核,就没有伤害
最有意思的其实是WebAssembly(WASM)。
它走了一条完全不同的路:根本不给它内核。
WASM代码运行在一个内存安全的虚拟机里,它没有系统调用。它想读写文件?除非宿主机显式给它导入一个函数,否则它连个文件路径都读不到。
这是一种“白名单”式的彻底隔离。
代码运行在严格的沙箱中,唯一允许的操作是调用宿主机提供的函数。
如果宿主不提供读文件的函数,WASM模块就真的无法读文件。简单,粗暴,有效。
虽然以前大家觉得WASM跑Python这种解释型语言很麻烦,但现在情况变了。Pyodide、Wasmer这些项目正在把Python解释器搬到WASM上。这可能是未来的一个大趋势。
真正的赢家:分层防御
说实话,没有银弹。
如果你跑的是自己写的、经过审计的代码,Docker加Seccomp可能就够了。
但如果你跑的是AI Agent生成的代码,或者是用户上传的任意代码,那就别省那点资源了。要么上gVisor,要么上MicroVM。
而且,千万别忘了网络隔离。
我看过太多案例:沙箱做得固若金汤,结果网络出口没管。代码是跑不出来,但它可以直接把你的AWS密钥通过HTTP发出去。
这就是所谓的“防住了越狱,没防住越狱电话”。
不管是用代理白名单,还是直接断网,网络策略是隔离故事的另一半。
本地开发的“潜规则”
这事儿还没完。
现在AI编程助手(比如Cursor、OpenAI Codex CLI)都在本地跑。它们在你的笔记本上执行命令,这又是一个完全不同的威胁模型。
这帮AI可能会误删你的~/.ssh密钥,或者把你的项目目录写烂。
现在的做法大多是用OS级的权限控制。比如Cursor在macOS上用的是Seatbelt,给它划个圈:只能读写当前工作区和/tmp,别的地方别乱动。
苹果在WWDC 2025上搞了个大动作:Containerization框架。
不同于Docker Desktop那种“套娃”模式(所有容器跑在一个Linux虚拟机里),苹果给每个容器都开了个轻量级VM。每个容器都有自己的内核、文件系统和IP地址。
这算是把MicroVM的理念带到了本地开发。
最后的一点思考
隔离从来不是二元的。
它不是“隔离了”或者“没隔离”,而是一个从“弱隔离”到“强隔离”的光谱。
很多人最大的误区,就是把Docker当成了保险箱。
Docker只是个纸箱子,而你需要的是保险柜。
在这个AI Agent遍地跑、不可信代码满天飞的时代,是时候重新审视一下你的“墙”到底有多厚了。毕竟,当你的代码在“裸奔”时,没人会提前通知你。
参考链接:
https://www.shayon.dev/post/2026/52/lets-discuss-sandbox-isolation/