腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案

关键词:AI 沙箱、微虚拟机、KVM 隔离、RustVMM、E2B 兼容

当你让大模型生成一段 Python 脚本并按下“执行”的那一刻,一个根本性的安全问题就已浮现——这段未经审计的代码,将在哪里运行?

Docker 容器是多数团队的第一直觉,但共享内核的 Namespace 隔离早已被证明存在风险:容器逃逸漏洞时有发生,一旦 AI Agent 被诱导执行恶意代码,整台宿主机都可能面临威胁。

腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案

  • CubeSandbox 是基于 RustVMM 与 KVM 构建的高性能、开箱即用的安全沙箱服务。它既支持单节点部署,也可轻松扩展至多节点集群。该服务兼容 E2B SDK,能够在 60 毫秒内创建具备完整服务能力的硬件隔离沙箱环境,同时将内存开销控制在 5MB 以下。
  • 项目地址:https://github.com/TencentCloud/CubeSandbox

传统虚拟机虽然能提供强隔离,但分钟级的启动速度和动辄数百兆的内存开销,使其在“每次对话创建一个新环境”的 AI 应用场景中难以胜任。

是否存在一种方案,能同时兼顾虚拟机的内核级安全隔离与容器的轻量敏捷?腾讯云开源的 CubeSandbox,正是对这道难题的工程化解答。

腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案 腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案

本文目录

  • 零、快速上手:从零运行你的第一个安全沙箱
    • 0.1 环境要求
    • 0.2 第一步:一键安装服务
    • 0.3 第二步:创建沙箱模板
    • 0.4 第三步:使用 E2B SDK 执行代码
  • 一、架构总览与设计哲学
    • 1.1 请求的完整生命周期
  • 二、CubeAPI:用 Rust 重写的 API 网关
    • 2.1 路由注册与中间件栈
    • 2.2 异步运行时的精细控制
  • 三、CubeShim:Rust 实现的 containerd Shim v2
    • 3.1 启动时的文件描述符预扩展技巧
    • 3.2 核心模块划分
  • 四、CubeProxy:基于 OpenResty 的智能路由
  • 五、Hypervisor 层:基于 Cloud Hypervisor 的深度定制
  • 六、CubeVS 与网络安全模型
  • 七、一键部署与生产实践
  • 总结与展望

零、快速上手:从零运行你的第一个安全沙箱

本节旨在让读者在 5 分钟内跑通完整链路。如需了解多节点集群部署、自定义模板、TLS 证书管理等进阶内容,请参阅完整的 Quick Start 指南。

腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案

0.1 环境要求

  • x86_64 架构的物理 Linux 服务器,需已开启 KVM(确认 /dev/kvm 设备存在)。
  • Docker 已安装并正在运行。
  • 服务器需具备外网访问能力(用于拉取镜像和安装包)。

💡 提示:虚拟机(嵌套虚拟化)环境理论上可用,但不建议用于生产;云服务器需确认实例类型支持 KVM 透传。详见多节点部署文档。

0.2 第一步:一键安装服务

bash
curl -sL https://github.com/tencentcloud/CubeSandbox/raw/master/cube-sandbox/deploy/one-click/online-install.sh | bash

安装脚本会自动完成以下工作:启动 CubeAPI(监听端口 3000)、CubeMaster、Cubelet、CubeShim、CubeProxy(含 mkcert TLS 证书)、CoreDNS,以及 MySQL / Redis 等依赖容器。

⚠️ 注意:如果服务器主网卡名称不是 eth0,需手动指定节点 IP 后再执行安装:
bash
CUBE_SANDBOX_NODE_IP=<your-ip> bash <(curl -sL https://github.com/tencentcloud/CubeSandbox/raw/master/cube-sandbox/deploy/one-click/online-install.sh)

安装完成后,将 CLI 工具加入系统 PATH:
bash
echo 'export PATH=/usr/local/services/cubetoolbox/CubeMaster/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

0.3 第二步:创建沙箱模板

bash
cubemastercli tpl create-from-image
--image ccr.ccs.tencentyun.com/ags-image/sandbox-code:latest
--writable-layer-size 1G
--expose-port 49999
--expose-port 49983
--probe 49999

等待模板构建完成(可通过 cubemastercli tpl watch --job-id <job_id> 命令跟踪进度),并记录输出中的 Template ID

关于自定义镜像构建模板的完整工作流,请参考 Template Concepts 文档。

0.4 第三步:使用 E2B SDK 执行代码

首先安装 E2B SDK:
bash
pip install e2b-code-interpreter

设置必要的环境变量:
bash
export E2B_API_URL="http://127.0.0.1:3000"
export E2B_API_KEY="dummy" # 本地部署时,任意非空字符串即可
export CUBE_TEMPLATE_ID="<第二步获得的模板ID>"
export SSL_CERT_FILE="$(mkcert -CAROOT)/rootCA.pem"

| 变量 | 说明 |
| :— | :— |
| E2B_API_URL | 将 E2B SDK 指向本地部署的 CubeAPI,而非其官方云服务。 |
| E2B_API_KEY | SDK 内部有非空校验,本地部署可填写任意值。 |
| CUBE_TEMPLATE_ID | 沙箱模板 ID,决定了虚拟机内运行的具体环境。 |
| SSL_CERT_FILE | mkcert 根证书路径,用于 SDK 访问沙箱的 HTTPS 连接。 |

运行你的第一段在硬件隔离环境中的代码:
“`python
import os
from e2b_code_interpreter import Sandbox # 直接使用 E2B 官方 SDK

with Sandbox.create(template=os.environ[“CUBE_TEMPLATE_ID”]) as sandbox:
# 以下代码运行在一个拥有独立内核的 KVM 微虚拟机中
result = sandbox.run_code(“print(‘Hello from Cube Sandbox!’)”)
print(result)

# 也可以执行 Shell 命令
cmd = sandbox.commands.run("uname -a")
print(cmd.stdout)  # 输出将显示这是一个独立的 Guest 内核

“`

更多使用场景(如 Shell 命令执行、文件读写、浏览器自动化、沙箱暂停/恢复、网络策略配置等)的详细示例,请参考项目 examples/ 目录及示例教程。

一、架构总览与设计哲学

CubeSandbox 的核心设计思想可概括为:分层解耦、极致裁剪

腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案

整个系统自上而下分为六大组件,构成一条从 HTTP 请求到 MicroVM 内进程执行的完整处理链路:

| 组件 | 语言 | 职责 |
| :— | :— | :— |
| CubeAPI | Rust (Axum) | 提供与 E2B 兼容的 REST API 网关 |
| CubeMaster | Go | 集群编排调度器,负责资源与状态管理 |
| CubeProxy | OpenResty/Lua | 反向代理,将请求路由至目标沙箱 |
| Cubelet | Go | 单节点沙箱生命周期管理器 |
| CubeVS | eBPF/C | 内核态虚拟交换机,实现网络隔离 |
| CubeRuntime | Rust | 集成 Shim、Hypervisor 与 Agent 的运行时 |

该架构有意借鉴了 Kubernetes 的 Master-Node 范式(CubeMaster 对应 kube-apiserver 与 scheduler,Cubelet 对应 kubelet),但其不依赖 Kubernetes,支持单机一键部署运行。

这是一个关键的产品决策:在 AI Agent 开发场景中,开发者通常不希望维护完整的 K8s 集群,而更倾向于获得一个开箱即用的安全沙箱环境。

1.1 请求的完整生命周期

一个典型的沙箱创建流程如下:

  1. 用户通过 E2B SDK 发送 POST /sandboxes 请求。
  2. CubeAPI 接收请求,并将其转发至 CubeMaster
  3. CubeMaster 将任务调度到合适的 Cubelet 节点。
  4. Cubelet 通过 containerd 调用 CubeShim(遵循 Shim v2 协议)。
  5. CubeShim 请求 Hypervisor 启动基于 KVM 的 MicroVM。
  6. MicroVM 内的 cube-agent 就绪,沙箱进入可用状态。

得益于资源池预置和快照克隆技术,整个链路端到端耗时可控制在 60 毫秒以内,跳过了传统虚拟机冗长的引导加载流程。

二、CubeAPI:基于 Rust 的 API 网关

CubeAPI 作为系统的入口,承担着一项特殊使命:使用户无需修改任何业务代码,即可从 E2B 云服务无缝迁移至自托管的沙箱环境。仅需更改环境变量 E2B_API_URL,所有通过 E2B 官方 Python SDK 发起的调用都将被 CubeAPI 透明接管。

2.1 路由注册与中间件栈

CubeAPI 基于 Axum 框架构建,其路由层设计清晰:

“`rust
// 来源:CubeAPI/src/routes.rs
pub fn build_router(state: AppState) -> Router {
let sandbox_routes = Router::new()
.route(“/sandboxes”, get(sandboxes::list_sandboxes))
.route(“/sandboxes”, post(sandboxes::create_sandbox))
.route(“/v2/sandboxes”, get(sandboxes::list_sandboxes_v2))
.route(“/sandboxes/:sandboxID”, get(sandboxes::get_sandbox))
.route(“/sandboxes/:sandboxID”, delete(sandboxes::kill_sandbox))
.route(“/sandboxes/:sandboxID/pause”, post(sandboxes::pause_sandbox))
.route(“/sandboxes/:sandboxID/resume”, post(sandboxes::resume_sandbox))
.route(“/sandboxes/:sandboxID/connect”, post(sandboxes::connect_sandbox));

// 全局中间件:请求ID、链路追踪、超时、压缩、跨域
Router::new()
    .route("/health", get(health::health))
    .merge(sandbox_routes)
    .with_state(state)
    .layer(
        ServiceBuilder::new()
            .layer(SetRequestIdLayer::x_request_id(MakeRequestUuid))
            .layer(TraceLayer::new_for_http())
            .layer(TimeoutLayer::new(Duration::from_secs(30)))
            .layer(CompressionLayer::new())
            .layer(CorsLayer::permissive()),
    )

}
“`

其中几个关键设计决策包括:

  • 认证可选化:仅当配置了 auth_callback_url 时,才会启用认证和限流中间件。在本地开发场景下,设置 E2B_API_KEY=dummy 即可通过。
  • V1/V2 双版本路由并存:同时暴露 /sandboxes/v2/sandboxes 路由,以兼容不同版本的 E2B SDK。
  • 30 秒全局超时:通过 tower_http::TimeoutLayer 设置统一超时,防止下游阻塞导致网关被拖垮。

2.2 异步运行时的精细控制

main.rs 中,CubeAPI 并未使用 Tokio 的 #[tokio::main] 宏,而是选择手动构建运行时:

rust
// 来源:CubeAPI/src/main.rs
let mut builder = tokio::runtime::Builder::new_multi_thread();
if cfg.worker_threads > 0 {
builder.worker_threads(cfg.worker_threads);
}
let rt = builder
.enable_all()
.thread_name("cube-api-worker")
.build()?;
rt.block_on(async_main(cfg, cli.debug))

这看似微小的选择实际上至关重要——在高并发沙箱创建场景下(例如同时处理50个请求),Tokio worker线程数直接决定了请求调度的并行度。通过 --worker-threads 参数或环境变量进行手动配置,允许运维人员在生产环境中进行精确的性能调优。

三、CubeShim:Rust 实现的 containerd Shim v2

CubeShim 是连接容器编排世界与 MicroVM 世界的“翻译官”。

它完整实现了 containerd Shim v2 协议,使得 containerd 能够像管理普通容器一样进行操作,而实际上,底层每一个“容器”都是一个拥有独立内核的 KVM 虚拟机

containerd
│ (Shim v2 API)

containerd-shim-cube-rs ← CubeShim
│ (ttrpc / vsock)

cube-agent ← 虚拟机内的 guest agent


container workload ← 运行在 MicroVM 内部

3.1 启动时的文件描述符预扩展技巧

CubeShim 的 main.rs 中包含一段精妙的底层优化代码:

rust
// 来源:CubeShim/shim/src/main.rs
unsafe {
// Create dummy socket and dup it to large fd, so that we could trigger
// expand_files in kernel. And this tricky work will avoid later multi
// thread try to invoke expand_files at same time, there will be lock
// contention in expand_files.
let dummy = libc::socket(libc::AF_UNIX, libc::SOCK_STREAM | libc::SOCK_CLOEXEC, 0);
if dummy > 0 {
libc::dup2(dummy, 512);
}
}

这段代码在进程启动时创建一个 Unix socket,然后使用 dup2 系统调用将其复制到文件描述符(fd)512。其目的是什么?

Linux 内核维护的文件描述符表(fdtable)在首次访问一个高编号的文件描述符时,会触发 expand_files 函数进行动态扩容,而这个操作需要持有锁。如果在多线程运行时(例如 Tokio 的 worker 线程)才首次触发此扩容,就会产生锁竞争。通过在单线程的启动阶段提前触发并完成扩容,可以彻底规避运行时的锁争用问题。

这是一个典型的“以空间换时间、以启动时间换运行时性能”的系统级编程技巧。

3.2 核心模块划分

CubeShim 的代码结构清晰地映射了其职责边界:

rust
// 来源:CubeShim/shim/src/lib.rs
pub mod common; // 版本信息、公共常量
pub mod container; // 容器生命周期管理(Create/Start/Kill/Delete)
pub mod cube; // Cube 运行时特有逻辑
pub mod hypervisor; // Hypervisor 交互层(VM 创建/销毁)
pub mod log; // 日志基础设施
pub mod sandbox; // 沙箱抽象(一个沙箱 = 一个 VM + N 个容器)
pub mod service; // Shim v2 gRPC 服务实现
pub mod snapshot; // 快照相关功能(暂停/恢复/克隆)

其中,sandbox(沙箱)与 container(容器)模块的分离体现了一个重要的架构设计:

  • 在 Kata Containers 等安全容器方案中,一个虚拟机(即一个 sandbox)可以承载多个容器。
  • CubeShim 继承了这一模型,但在 AI Agent 场景下,通常采用一个沙箱对应一个容器的“一对一”使用模式。

四、CubeProxy:基于 OpenResty 的智能路由

CubeProxy 解决了关键的“最后一公里”问题:用户的应用或 SDK 如何访问到具体沙箱内的服务端口?

其答案是通过域名编码的路由机制。CubeProxy 会解析 HTTP 请求中 Host 头的特定格式:<端口号>-<沙箱ID>.<域名>,并将其路由到对应虚拟机的对应端口。

“`

来源:CubeProxy/nginx.conf

server {
listen 8080 ssl reuseport;
server_name _;
ssl_certificate /usr/local/openresty/nginx/certs/cube.app+3.pem;
ssl_certificate_key /usr/local/openresty/nginx/certs/cube.app+3-key.pem;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_send_timeout 7206s;
proxy_read_timeout 7206s;
rewrite_by_lua_file lua/rewrite_phase.lua;
proxy_pass http://backend;
}
}
“`

配置中的几个关键点值得解读:

  • reuseport:启用 SO_REUSEPORT 套接字选项,允许多个 Nginx worker 进程各自拥有独立的监听队列,避免了传统的“惊群效应”,在高并发场景下能显著提升连接处理吞吐量。
  • WebSocket 支持:通过设置 UpgradeConnection "upgrade" 头部,代理能够正确转发 WebSocket 等长连接协议——这对于依赖 Chrome DevTools Protocol (CDP) 的浏览器沙箱等场景至关重要。
  • 7206 秒超时:约2小时的超时设置,足以覆盖长时间运行的 AI Agent 任务,同时避免了无限期等待。
  • Lua 阶段注入rewrite_phase.lua 脚本负责从 Host 头中解析出沙箱 ID 和端口号;balancer_phase.lua 脚本则通过 lua_shared_dict 共享内存查找后端虚拟机的实际 IP 地址。整个路由决策在高效的 Lua 层完成,无需为每个请求都查询中心化的 CubeMaster 服务。

腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案

五、Hypervisor 层:基于 Cloud Hypervisor 的深度定制

hypervisor/ 目录是项目中体量最大的 Rust 代码区域,它基于 Cloud Hypervisor 项目进行 fork,并针对 AI 沙箱场景进行了定制。其子模块结构体现了功能的完整性:

  • vmm/:虚拟机管理器核心,负责虚拟机的创建、配置和运行循环。
  • hypervisor/:KVM 接口抽象层。
  • virtio-devices/:virtio 设备模拟(如网卡、块设备、控制台等)。
  • vm-migration/:虚拟机状态的序列化与反序列化,是快照恢复功能的基础。
  • block_util/qcow/vhdx/:提供对多种磁盘格式的支持。
  • arch/:包含 x86_64 架构特定的代码(如 CPUID、MSR 配置等)。

腾讯云开源CubeSandbox:60毫秒启动的AI安全沙箱,基于RustVMM与KVM的硬件级隔离方案

CubeSandbox 能够实现低于 5MB 的单实例内存开销,其核心优化在于以下两点:

  1. 极致裁剪的客户机操作系统:客户机镜像通过专用 Dockerfile 生成,仅包含最小化的 init 进程(cube-agent)和必要的文件系统。
  2. 写时复制内存复用:基于快照克隆技术,多个沙箱实例共享同一份客户机内核和根文件系统的物理内存页,仅在被修改的页面产生新的内存分配。

六、CubeVS 与网络安全模型

CubeVS(Cube Virtual Switch)是基于 eBPF 实现的内核态虚拟交换机,位于 CubeNet/cubevs/ 目录。它在数据平面实现了三个核心能力:

  1. 沙箱间严格网络隔离:确保不同沙箱的网络命名空间彼此不可达,即使它们运行在同一台物理主机上。
  2. 细粒度出站流量过滤:可根据策略限制沙箱访问外部网络的范围,防止 Agent 被利用后对内网发起攻击。
  3. 内核态数据包转发:转发过程不经过用户态协议栈,减少了上下文切换的开销。

相较于传统的 iptables/nftables 方案,eBPF 程序直接附加到网络设备的 TC(流量控制)钩子上,在数据包进入协议栈之前即可完成过滤和转发决策,性能损耗极低。

七、一键部署与生产实践

CubeSandbox 的部署流程设计简洁。deploy/one-click/ 目录实现了一个自包含的发布包构建和安装流程:

“`bash

在支持 KVM 的机器上,可通过三步启动

curl -sL …/online-install.sh | bash # 安装服务
cubemastercli tpl create-from-image # 创建模板
–image sandbox-code:latest
–writable-layer-size 1G –expose-port 49999
export E2B_API_URL=”http://127.0.0.1:3000″ # 配置 SDK
“`

安装脚本会自动处理 MySQL/Redis 等依赖的部署、TLS 证书生成(通过内置的 mkcert)、CoreDNS 的 split-DNS 配置,以及所有组件的编排启动。对于多节点场景,计算节点只需设置环境变量 ONE_CLICK_DEPLOY_ROLE=compute 并指定控制平面 IP 地址即可加入集群。

总结与展望

CubeSandbox 代表了 AI 基础设施领域的一个重要趋势:将虚拟化技术下沉为一种透明的安全原语。开发者无需深入理解 KVM、virtio、eBPF 等底层技术,只需像使用 Docker 一样调用兼容的 SDK,即可获得硬件级的隔离保障。

从技术实现角度看,其几个关键选择值得借鉴:

  • 使用 Rust 重写关键路径:在 CubeAPI、CubeShim、Hypervisor 等组件中利用 Rust 的内存安全与零成本抽象特性,兼顾了系统编程场景下的性能与可靠性。
  • 协议兼容而非重新发明:100% 兼容现有 SDK 接口,将迁移成本降至趋近于零。
  • 利用 eBPF 实现网络安全平面:在内核态执行策略,避免了引入额外用户态组件及其带来的性能损耗。
  • 通过快照克隆实现亚百毫秒启动:将虚拟机的启动问题转化为内存页的写时复制问题。

根据项目路线图,“事件级快照回滚”是一个值得期待的特性。该功能将允许 Agent 在探索过程中于任意时间点轻量地 fork 出分支环境,类似于 Git 的分支操作,这将为 AI Agent 的树搜索、强化学习训练等场景开辟新的可能性。

CubeSandbox 已在生产环境中经过大规模验证。对于任何正在为 AI Agent 寻找安全执行环境的团队而言,该项目都值得深入评估。


关注“鲸栖”小程序,掌握最新AI资讯

本文来自网络搜集,不代表鲸林向海立场,如有侵权,联系删除。转载请注明出处:http://www.itsolotime.com/archives/30791

(0)
上一篇 16小时前
下一篇 4小时前

相关推荐

  • 揭秘OpenClaw:从周末项目到现象级开源AI的5个惊人真相

    OpenClaw 创始人 Peter Steinberger 过去几天,OpenClaw 几乎席卷了技术社区的信息流。每一位 AI 爱好者都在讨论它——人们利用这个自动化系统构建各类项目,探索着无穷无尽的应用场景。 简单来说,OpenClaw 是一个开源的自主智能体,旨在扮演一个主动的 AI 助手。它不同于需要等待指令的标准聊天机器人,而是作为一个常驻服务运…

    开源项目 2026年2月26日
    35000
  • 蚂蚁灵波开源LingBot-Map:突破流式3D重建瓶颈,实现万帧视频实时三维建模

    今年1月,蚂蚁灵波开源了包括高精度空间感知模型LingBot-Depth、具身大模型LingBot-VLA与LingBot-VA,以及世界模型LingBot-World在内的四款大模型。这些模型分别负责从图像中估算深度、对环境进行模拟理解,以及控制机器人的决策与动作,覆盖了感知、理解与行动环节。 然而,一个关键环节仍然缺失:如何将连续的感知数据实时构建成稳定…

    23小时前
    10700
  • NotebookLM开源替代方案全解析:三大GitHub明星项目打造本地化AI笔记助手

    NotebookLM 是谷歌推出的一款 AI 笔记助手。与普通 AI 不同,它严格限制在你上传的文档范围内进行回答,并能提供精准的原文引用。其标志性功能之一是播客生成,能将上传的复杂资料一键转换为逼真的双人英语对话播客,让学习过程更有趣,也支持通过“听”来消化信息。 本文将盘点 GitHub 上所有 NotebookLM 的开源替代方案,帮助你部署自己的本地…

    2025年12月19日
    92000
  • 5个颠覆性GitHub开源项目:从视频手绘到AI约会选址,解锁创意新玩法

    将视频瞬间转化为手绘故事 ClipSketch AI 是一个创意工具,能够将视频链接(如来自B站或小红书)转换为一个带有打点功能的播放器。当用户看到感兴趣的帧时,只需按下快捷键即可截图,省去了使用独立截图工具的麻烦。 该项目的核心在于其AI图像生成能力。它集成了Google Gemini大模型,能够将截取到的视频帧瞬间转换为手绘风格的分镜草图,甚至可以根据画…

    2026年1月7日
    42600
  • 探索Vibe Coding:4个GitHub开源项目带你进入AI编程新范式

    Andrej Karpathy 是 OpenAI 创始成员、前特斯拉 AI 总监。他年初在 X 上发布了一条推文,分享了自己使用 Cursor 与 Claude 进行编程的体验,并首次提出了 Vibe Coding 这一概念。 Vibe Coding 是一种基于 AI 的全新编程范式。开发者通过与 AI 进行对话式协作,共同构建应用程序或网站,其核心在于专注…

    2025年12月12日
    49000