Skip to main content

如何安全运行用户代码?

在网站上提供AI访问服务,并允许AI根据用户需求执行代码(例如数据分析、绘图、科学计算等),是一个非常强大但风险极高的功能。如果不做严格隔离,恶意用户可以通过AI向你的服务器注入命令,导致数据泄露、服务器被控(挖矿/肉鸡)或内网被渗透。

要安全可靠地实现这一功能,核心原则是:零信任、绝对隔离、限制资源、即用即弃。

以下是业界通用的主流安全架构和技术方案:


1. 核心隔离技术(沙箱环境)​

绝对不能让代码直接在你的Web主服务器或常规后端上运行。必须使用沙箱(Sandbox)环境。

方案 A:使用 MicroVMs(微型虚拟机)—— 最安全,推荐​

这是目前 AWS Lambda、Fly.io 等云厂商以及高级 AI 工具(如 ChatGPT Code Interpreter)主流使用的技术。

  • 代表技术:Firecracker (AWS 开源), Kata Containers。
  • 原理:它可以在几毫秒内启动一个具备独立 Linux 内核的微型虚拟机。隔离级别等同于传统虚拟机,但速度和资源消耗和容器一样快。
  • 优势:即使用户在里面执行了 rm -rf / 或者提权成了 root,损坏的也只是一个生存周期只有几秒钟的独立内核,绝对无法穿透到宿主机。

方案 B:使用 Docker 容器隔离 + 安全运行时 —— 性价比高,易实现​

普通的 Docker 容器默认共享宿主机内核,隔离级别不够(存在容器逃逸风险)。需要结合安全运行时使用。

  • 代表技术:gVisor (Google 开源), sysbox。
  • 原理:gVisor 会拦截容器内所有的系统调用(Syscalls),并在用户态进行多层过滤和虚拟化,从而防止恶意代码利用内核漏洞逃逸。
  • 实现策略:每次需要执行代码时,动态启动一个挂载了 gVisor 的 Docker 容器,执行完毕后直接销毁 (docker rm -f)。

2. 网络与资源访问控制(Minimal Privileges)​

把代码放进沙箱只是第一步,还需要关上所有的“门窗”。

  • 完全断网(Network Isolation):默认情况下,执行代码的沙箱绝对不允许访问互联网,更不允许访问你的内部局域网(VPC)。防止 AI 被利用来做分布式拒绝服务攻击(DDoS)或扫描你的内网数据库。如果用户确实需要下载某个第三方库,应当使用白名单机制或代理服务器,且限制访问速度。

  • 只读根文件系统(Read-Only FS):沙箱的系统目录(如 /bin, /usr)应当是只读的。只开放一个临时的 /tmp 或 /workspace 目录用于存放用户的数据文件和生成的代码。

  • 严格的资源限制(cgroups):

  • CPU 限制:防止用户写死循环(如 while True: pass)耗尽服务器 CPU。

  • 内存限制:限制每个沙箱最多使用 256MB 或 512MB 内存,防止 OOM(内存溢出)导致宿主机崩溃。

  • 磁盘 I/O 和大小限制:限制最大写入 100MB 数据,防止硬盘被垃圾数据填满。

  • 超时强制杀死(Timeout):任何代码执行超过 5~10 秒,必须由母进程强制杀掉(Kill)。


3. 架构设计与执行流程​

一个安全的 AI 代码执行架构通常分为三层:

[用户前端]
│
▼
[Web 后端业务服务] (处理鉴权、LLM 交互、生成代码)
│
▼ (通过内部安全 API / MQ)
[代码执行调度器 (Manager)]
│
▼ (动态创建/分配)
[受控沙箱 (Firecracker / gVisor Container)] (运行代码 -> 返回结果 -> 销毁)

标准执行流程:​

  1. 用户输入需求,AI (LLM) 生成代码。
  2. Web 后端获取到代码,将代码和用户上传的文件打包,发送给“代码执行调度器”。
  3. 调度器启动(或从连接池中取出一个)完全干净、无网络的沙箱。
  4. 将代码写入沙箱,以低权限用户(非 root)身份执行:sudo -u sandbox_user python main.py。
  5. 捕获 stdout(标准输出)和 stderr(错误输出),并设定 5 秒超时。
  6. 执行完毕,调度器收集输出结果(如果是图片,则将图片传回对象存储),然后彻底销毁该沙箱。
  7. Web 后端将结果组装,返回给用户。

4. 语言层面的防御(代码审计与过滤)​

在代码送入沙箱之前,可以通过静态代码分析进行第一轮过滤(作为辅助防御):

  • AST(抽象语法树)检查:如果是 Python,可以在执行前用 ast 模块解析代码,严禁代码中出现 os.system, subprocess, __import__, eval, exec 等危险函数或敏感词。
  • 静态扫描:虽然 AI 可能会通过变相字符串拼接绕过单纯的字符串黑名单(如 eval("im" + "port os")),但结合 AST 和沙箱隔离,能阻断 99% 的小白攻击。

5. 云厂商现成方案(不想自建时的选择)​

如果你不想自己维护复杂的虚拟机和 Docker 隔离集群,可以直接对接第三方的 Code Execution SaaS 或云函数:

  • E2B (e2b.dev):专门为 AI Agents 设计的开源安全沙箱(基于 Firecracker)。他们提供现成的 SDK,你只需要调用几行代码,就能在他们安全的云端沙箱里执行 AI 代码,极其方便。
  • Bearly SDK:另一个专注于 AI 代码执行环境的沙箱服务。
  • 云厂商 Serverless:利用 AWS Lambda 或 阿里云函数计算(FC)。每次执行代码都动态触发一个云函数,利用云厂商成熟的底层隔离机制来确保安全。

💡 总结建议​

如果是个人项目或快速验证(MVP),推荐直接接入 E2B 或使用 AWS Lambda,省时省力且绝对安全。 如果是商业化大规模部署,建议基于 AWS/阿里云 + Firecracker 或 Docker(gVisor) 自建沙箱连接池,以控制长期运行的成本。