

AI应用厂商通常有两种方式提供给用户执行代码。第一种方式为代码解释器,用户可以通过自然语言与AI应用交互,AI应用通过与LLM交互获取执行的代码并执行来完成用户任务;第二种方式允许用户编写自己的代码作为AI应用中的一个工具来完成用户的任务。本文将不区分这两种代码执行情形,对于任何用户能够编写代码并且执行的场景我们都认为其为AI应用中的代码执行功能。
OpenAI面世之初,大量安全研究人员通过和 ChatGPT进行简单对话,即可让它反弹shell 到攻击者指定服务器,并进行进一步内网渗透。随后,ChatGPT变成了“纯语言模型,不能运行代码”:

但随着ChatGPT 4的推出,OpenAI重新提供了代码解释器的功能,并且能够帮用户运行自定义代码。例如:

ChatGPT 4的代码解释器功能再次推出,OpenAI 充分吸取了此前的经验,不仅在语义层对代码意图进行了分析,会尝试拦截恶意代码运行,同时也提供了可靠隔离的沙箱运行环境,会将用户代码运行在一个独立隔离的沙箱环境中,杜绝恶意代码对OpenAI自身服务或其他用户造成影响。
经过我们的分析,ChatGPT 4的语义分析限制很容易绕过,但ChatGPT 4会将每个用户的任务运行在一个独立隔离的容器中,并且使用了谷歌开源的安全容器gVisor[1]作为容器runtime ,从而缓解Docker隔离性不足的问题。网络层面,每个容器有一个独立IP,彼此间无法互通,东西向访问内网和南北向访问互联网均进行了安全限制,只能有限通信。OpenAI的这套沙箱方案经过国内外安全研究人员的测试已经发展的较为可靠,但是业界其他提供code interpreter服务的AI应用依然存在较多问题。例如,我们在测试某些AI应用时,就发现其能够进行反弹shell,并且能够执行任意命令。
故此,我们对主流AI应用的代码执行沙箱方案进行了研究,发现各个应用的沙箱方案均不尽相同,下文阐述了我们的详细测试过程、总结出的沙箱发展趋势,以及同类应用的沙箱使用建议。
为了给出AI应用的代码执行沙箱选型建议,我们需要首先分析当前主流AI应用使用的沙箱解决方案和安全策略有哪些。在沙箱测试过程中,我们主要测试如下内容:
在测试对象的选择上,我们选择了如下几款 AI 应用。后文会介绍,这几款应用使用的沙箱方案代表了几类场景的沙箱实现,非常具有典型性。
我们以ChatGPT 4为例,来介绍如何完成上述的测试项目。





测试结果:ChatGPT 4不能访问任意互联网。

tcp 测试结果:通过上传的 ncat 进行测试,其无法链接到 kubernetes api server 的端口。






在“测试步骤”一节中已经详细进行了分析,这里再对测试结果进行总结。ChatGPT 4 测试结果如下:
· 是否能执行任意命令:是。
· 是否为特权用户执行:否。
· 是否支持访问外网:否。
· 是否做了东西向隔离:是。
· 是否泄露了敏感信息:是。
· 是否能够上传任意文件:是。
· 使用的沙箱方案:gVisor。
综上,通过分析,ChatGPT 4的代码执行是在gVisor安全容器中完成的。gVisor是Google开发的一款基于应用内核的安全容器,官网地址为https://gvisor.dev, 下一节将详细介绍其原理。
应用 A 测试结果如下:
· 是否能够执行任意命令:否。
· 是为特权用户执行:否。
· 是否支持访问外网:部分。能够发起 http/https 请求,但是无法使用底层网络能力。
· 是否做了东西向隔离:是。应用 A 的沙箱没有网卡,其网络请求是通过浏览器完成的。
· 是否泄露了敏感信息:部分。在 应用 A 的沙箱中能够看到其绑定的 Python 版本和相关库代码。
· 是否能够上传任意文件:是。
· 使用的沙箱方案:Pyodide。

应用 B 测试结果如下:
· 是否能够执行任意命令:是。
· 是否为特权用户执行:否。
· 是否支持访问外网:是。
· 是否做了东西向隔离:是。
· 是否泄露了敏感信息:否。
· 是否能够上传任意文件:是。
· 使用的沙箱方案:Omegajail。

其官网地址为:
https://github.com/omegaup/omegajail
应用 C 测试结果如下:
· 是否能够执行任意命令:否。
· 是否为特权用户执行:是。
· 是否支持访问外网:部分。
· 是否做了东西向隔离:是。
· 是否泄露了敏感信息:是。
· 是否能够上传任意文件:是。能够通过 Typescript 或者 JavaScript 下载任意文件到文件系统。
· 使用的沙箱方案:Deno。

应用 D 测试结果如下:
· 是否能够执行任意命令:是。
· 是否为特权用户执行:否。
· 是否支持访问外网:是。能够反弹shell出网。
· 是否做了东西向隔离:是。
· 是否泄露了敏感信息:是。能够读取部分业务源码。
· 是否能够上传任意文件:是。能够从外网下载任意文件到文件系统
· 使用的沙箱方案:Lambda(Firecracker)。

其官网地址为https://firecracker-microvm.github.io,详细原理将在下一节介绍。
应用 E 测试结果如下:
· 是否能够执行任意命令:是。
· 是否为特权用户执行:否。
· 是否支持访问外网:是。能够反弹shell出网。
· 是否做了东西向隔离:是。
· 是否泄露了敏感信息:否。
· 是否能够上传任意文件:是。能够从外网下载任意文件到文件系统。
· 使用的沙箱方案:e2b[3]。沙箱的根目录有.e2b文件,而e2b是专门为AI应用提供代码执行沙箱的SDK。

下面是对各个AI Agent的沙箱选型方案以及沙箱安全策略的总结。

从沙箱方案来看,Pyodide、Deno属于语言级别沙箱,omegaijail属于进程级别沙箱,Firecracker、gVisor属于系统级别沙箱,其中语言、进程、系统表明的是沙箱的隔离边界。从策略上看,大部分的沙箱都能够执行任意任意命令、能够访问外网、能够上传任意文件。大部分的沙箱都是非特权用户执行用户代码,并且做了东西向的隔离。

https://www.whitphx.info/static/d2bd1a3747d59735aeac180e7da602f9/f058b/stlite_archtecture.002.png

https://github.com/denoland/deno/blob/f96aaa802b245c8b3aeb5d57b031f8a55bb07de2/website/images/schematic_v0.2.png?raw=true


https://files.gotocon.com/uploads/slides/conference_14/835/original/Firecracker%20Presentation%20GOTO%20AMS.pdf

https://gvisor.dev/docs/Layers.png
测试的这几种沙箱包括了主流的沙箱类型。从测试结果可以看出,出于使用场景、业务兼容性、接入成本的考量,目前业界并没有一个占压倒性优势的沙箱解决方案。下面从几个关键维度对上述沙箱方案进行总结:

我们将Pyodide和Deno归类为语言级沙箱,但是需要注意的是,这里的语言级沙箱跟传统的语言级沙箱不太一样。传统的语言级沙箱比如nodejs中的vm2,以及Java中的groovy沙箱,它们接收代码片段,然后运行。
Pyodide和Deno本质上并不是为沙箱而生的方案,Pyodide是Python的发行版,Deno是JavaScript和TypeScript的运行时,他们都通过其底层运行时实现了沙箱的功能,Pyodide通过将Python或JavaScript代码运行在 JavaScript的解释引擎中达到了沙箱的目的,Deno同样是为JavaScript和TypeScript代码提供了一个运行环境,并且在与宿主机的交互中需要显示指定安全策略而实现了沙箱功能。
通过上表以及本文的测试以及我们的调研,对于 AI 应用的沙箱选型,大致可以得出如下结论。
1) 从以上对比可以看出,进程级沙箱在大模型时代已经逐渐式微,而语言级别和系统级别沙箱则得到了新的青睐。
6个应用中,2个使用了语言级沙箱,3个使用了基于gVisor/Firecracker的系统级沙箱,只有1个使用了进程级沙箱。传统上,大家对沙箱的认识大多停留在进程级沙箱,业务进程被运行在一个独立的沙箱进程中,来实现安全隔离保障。但是众多的AI应用没有选择此类沙箱,这是因为:
语言级沙箱和系统级沙箱逐渐在AI时代得到青睐。很多AI应用的代码执行任务都不复杂,通过简单的Python脚本或者JavaScript脚本就能够完成,而语言级的沙箱比如Pyodide或者Deno恰好都能满足条件,他们的接入简单,并且从安全性上来讲,有浏览器沙箱的保护,所以也成为一些不太复杂业务的选择。
另一方面,基于gVisor/Firecracker的系统级沙箱也逐渐得到AI应用厂商的青睐,这是因为:
2) 从对比可以看出,系统级的业务隔离性和业务兼容性都很高,但是他们的接入成本也相对较高。
这是因为gVisor/Firecracker的使用比较复杂,从部署到运行时都容易出问题。所以我们也观察到有一些创业型公司正在这个方向发力,比如e2b和Modal分别把Firecracker和gVisor作为底层代码执行环境提供给用户,让用户能够直接通过SDK的方式使用安全沙箱,大幅降低业务的使用成本。
3) 虽然 gVisor/Firecracker 能够明显提升隔离性,但是作为安全沙箱还需要更精细的安全策略配置。
从上述AI应用的测试结果可以看出,采用了gVisor/Firecracker系统级沙箱,其安全策略依然有很大的提升空间。比如目前的沙箱大部分能够允许任意代码执行,配合外网访问以及对文件系统的写和执行权限,恶意用户能够直接在运行环境中下载后门木马,进行进一步的攻击,一旦被攻击者找到漏洞即能够攻破到基础设施中。
所以使用gVisor/Firecracker等强隔离沙箱只是第一步,一个比较完善的代码执行安全沙箱还应该具有如下安全特性:
综上,AI应用的代码执行方案选型,对于业务场景比较简单、研发资源有限的公司,可以使用语言级的沙箱,比如Pyodide。对于业务场景比较复杂,研发资源充足并且对安全要求很高的公司可以选择基于gVisor/Firecracker 的系统级安全沙箱。如果需要使用系统级安全沙箱,但是又没有足够的研发运维资源,可以使用商业公司提供的产品化服务。在选择了系统级安全沙箱后,基于纵深防御的原则,还需要为其设计一个具备最小特权运行环境、严格安全策略、完善日志审计的安全配置。
安全沙箱是一个古老而现代的话题,说它古老是因为通过安全沙箱执行不可信任的代码始终是计算机系统中的刚需;说它现代是因为随着操作系统与计算机技术的不断发展进化,构建沙箱的技术也在不断发展,从最初的seccomp、ptrace方案,到如今的基于namespace、cgroup等技术的沙箱、基于虚拟化技术的安全容器沙箱、以及基于浏览器实现的各种沙箱,安全沙箱的技术随着计算机系统技术的发展而得到了现代化的进化。
Tong Liu等人在论文中《Demystifying RCE Vulnerabilities in LLM-Integrated Apps》[4] 中总结了AI应用中场景的RCE漏洞。Wiz 在最近的一篇文章[5]中也描述了其通过Python pickle反序列化漏洞攻破Hugging Face的基础设施架构,在其中执行任意代码。这些研究都说明目前AI发展中存在着代码执行相关的安全问题,而沙箱是解决这类安全问题的方式之一。
本文从分析ChatGPT 4的代码执行沙箱为起点,分析了多款AI应用代码执行沙箱的解决方案及安全策略,最后给出了安全沙箱的选型及策略建议,以期业界在LLM如火如荼的发展浪潮中能够重视AI代码执行环境的安全问题,各厂商也能够根据自己的业务需求灵活选择安全可靠的沙箱解决方案。
[2] ChatGPT. https://openai.com/gpt-4
[3] e2b. https://e2b.dev/
[4] Liu, Tong, et al. “Demystifying rce vulnerabilities in llm-integrated apps.” arXiv preprint arXiv:2309.02926 (2023).
[5] Wiz Security Research. https://www.wiz.io/blog/wiz-and-hugging-face-address-risks-to-ai-infrastructure

转载请注明:jinglingshu的博客 » 老树开新花:大模型时代的代码执行沙箱