在 Python 中为 AI 代理的代码执行构建沙箱:容器、微虚拟机及更多方案

在 Python 中为 AI 代理的代码执行构建沙箱:容器、微虚拟机及更多方案

💡 原文英文,约4000词,阅读约需15分钟。
📝

内容提要

文章介绍如何为AI代理生成的代码构建三级沙箱:受限子进程、加固Docker容器和Firecracker微虚拟机,三者统一为run(code)接口,并用同一组六种恶意程序(死循环、内存占用、进程洪泛、写盘、读密钥、连内网)测试。子进程最快,但共享主机文件与内核,可读密钥;容器能阻断全部攻击;微虚拟机每次使用独立内核,隔离最强但启动更慢。建议按代码可信度选择最轻层级,并保留攻击测试套件。

🔎

延伸解读

子进程沙箱的信任边界:快但共享主机

文章实测显示,受限子进程能拦截死循环、内存占用、写盘和连内网,但无法阻止进程洪泛和读取主机密钥。原因是进程数限制仅对专用用户生效,普通笔记本上被跳过;代码仍以当前用户身份运行,可读你的文件。因此它只适合你基本信任的代码,如开发中的自有脚本。若必须用,应确保以非特权用户运行并接受文件暴露风险。

容器加固的关键:每个标志关闭一扇门

Docker 层通过一组启动参数实现隔离:--network none 断网、--read-only 加小容量 tmpfs 限制写盘、--cap-drop ALL 和 no-new-privileges 移除特权、--user 避免 root、内存/CPU/进程数限制资源。文章指出,容器仍共享主机内核,2025 年 11 月三个 runc 漏洞可导致逃逸,因此需保持 runc 补丁更新。它适合你控制主机且风险较低的场景。

微虚拟机的隔离强度与延迟代价

Firecracker 微虚拟机为每次运行创建独立内核,密钥文件和本地服务在其中不存在,内存、进程、磁盘攻击被限制在 VM 内。代价是启动更慢,基准测试中 E2B 每次运行都包含创建微虚拟机的时间。文章建议对多用户代码、涉及密钥或需要运行容器的代理使用微虚拟机,并强调文件访问、网络策略和密钥应由基础设施预先定义,而非由代理决定。

用同一套攻击测试守住沙箱回归

文章将三种后端统一为 run(code) 接口,并用六个恶意程序测试:死循环、512MB 内存占用、200 进程洪泛、50MB 写盘、读伪造密钥、连本地服务。每个攻击用输出中的标记词判断是否得逞。建议保留这套测试套件,在更换后端或调整参数后重新运行,以发现隔离能力退化。选择层级时,按代码可信度选最轻的一级,而非默认最强。

❓

Q&A

如何为AI代理生成的代码构建不同级别的沙箱?

文章介绍了三级沙箱:受限子进程、加固Docker容器和Firecracker微虚拟机。三者统一为run(code)接口,可用同一组六种恶意程序测试。子进程最快但共享主机文件与内核;容器能阻断全部攻击;微虚拟机每次使用独立内核,隔离最强但启动更慢。建议按代码可信度选择最轻层级,并保留攻击测试套件。

子进程沙箱和Docker容器沙箱在安全性上有什么区别?

子进程沙箱是最轻量的选项,通过资源限制(CPU、内存、文件大小)和网络命名空间隔离,但仍共享主机内核和文件系统,因此可能读取主机密钥或受到fork洪水攻击。Docker容器增加了命名空间和cgroups,通过--network none、--read-only、--cap-drop ALL等标志能阻断所有六种攻击,但容器仍共享主机内核,存在逃逸风险(如runc漏洞)。

Firecracker微虚拟机沙箱有什么优势和劣势?

优势:每个沙箱拥有独立内核,由hypervisor提供硬件级隔离,安全性最强,能防止密钥泄露和内部服务访问。劣势:启动较慢,每次运行需创建新VM,延迟高于子进程和容器。适合多用户、涉及敏感数据或需要更强隔离的场景。

如何测试沙箱的安全性?

文章使用同一组六种恶意程序测试每个沙箱后端:死循环、内存占用(512MB)、进程洪泛(200个)、写盘(50MB)、读密钥、连内网。通过检查输出中是否出现特定标记词或是否超时来判断攻击是否被阻断。建议保留此攻击测试套件用于持续验证。

如何测量不同沙箱后端的延迟?

使用bench.py脚本,对每个后端运行print(1)十次(一次预热不计入),输出中位数和最慢时间。子进程最快,微虚拟机因包含VM启动时间而较慢。实际延迟需在目标机器上测量,公开数据仅供参考。

在实际项目中应该如何选择沙箱层级?

根据代码可信度选择最轻层级:仅信任的代码(如自己的脚本)用受限子进程;控制主机且风险较低时用加固容器(保持runc更新);多用户、涉及敏感数据或需要非Python环境时用微虚拟机。基础设施应预先定义文件访问、网络策略和密钥,而非由代理决定。

🏷️

标签

➡️

继续阅读