如何安全运行不受信任的代码
想象一下,你需要执行用户或第三方服务发送的代码。普通的 Docker 太重,而在独立进程中运行又令人担忧。一个失误,你的服务器就会变成南瓜,或者更糟,变成僵尸网络的一部分。这正是 CNCF Sandbox 的人们开发 Hyperlight 的场景。
这是什么
Hyperlight 是一个 Rust 库,可以即时创建微虚拟机。它不试图模拟配备显卡和键盘的完整计算机,而是启动一个最大程度精简的执行环境,甚至没有操作系统内核。整个"访客"只是为 no_std 编译的 Rust 或 C 二进制文件。
主要卖点是速度。作者声称微虚拟机在毫秒内启动,主机和访客之间的函数调用只需微秒。这听起来像是构建自己的无服务器平台或安全插件的理想基础。
实际使用方式
使用 Hyperlight 就像常规编程一样,只是函数在不同的世界中执行。你将库添加到 Rust 应用程序中,传入编译好的访客二进制文件,然后调用方法。
主机端初始化代码如下:
// Подготавливаем песочницу, пока без запуска VM
let mut sandbox = UninitializedSandbox::new(GuestBinary::FilePath(guest_path), None)?;
// Можно прокинуть функцию из хоста в гостя, например, для доступа к БД
sandbox.register("GetWeekday", || Ok("Monday".to_string()))?;
// А теперь «зажигаем» VM
let mut sandbox: MultiUseSandbox = sandbox.evolve()?;
// Вызываем функцию внутри виртуалки
let greeting: String = sandbox.call("SayHello", "World".to_string())?;
println!("{greeting}");
这是虚拟机内部的代码。由于宏的存在,一切都非常透明:
#[host_function("GetWeekday")]
fn get_weekday() -> Result<String>;
#[guest_function("SayHello")]
fn say_hello(name: String) -> Result<String> {
let weekday = get_weekday()?;
Ok(format!("Hello, {name}! Today is {weekday}."))
}
为什么比普通虚拟机更快
秘密在于极简主义。Hyperlight 没有 Linux 中的 Linux。没有文件系统驱动、网络栈或任务调度器。当你调用函数时,虚拟机管理程序(Linux 上的 KVM 或 Windows 上的 MSHV/WHP)只是切换 CPU 上下文。
一个有趣的细节:该项目支持 snapshot 和 restore 机制。如果需要执行数千个类似的调用,可以初始化沙箱一次,拍摄内存快照,然后在每次新运行前回滚。这确保每次调用都从干净的状态开始,而无需花费时间重新加载二进制文件。
谁需要这个,为什么
我看到几个 Hyperlight 真正能发挥作用的场景。
首先是云函数(FaaS)。如果你在构建自己的 AWS Lambda 替代品,你需要虚拟机管理程序级别的隔离,但不想等待容器启动一秒钟。
其次是复杂系统的扩展。假设你有一个数据库或游戏服务器,想让用户编写自己的脚本。Lua 或 WASM 很酷,但 Hyperlight 提供了更严格的隔离,并允许你用熟悉的 Rust 或 C 编写。
顺便说一下,仓库中有相关项目的链接,如 hyperlight-wasm 和 hyperlight-js。这意味着你可以在这些微虚拟机中运行 WebAssembly 或 JavaScript,使这个工具更加多功能。
细节与限制
该项目处于 pre-1.0 状态。这意味着 API 可以随时更改,文档偶尔会让人挠头。
重要提示:Hyperlight 不是为运行常规 Linux 应用程序设计的。你无法在其中运行 ls 或 curl,因为系统调用根本不存在。如果你需要那个,你必须看 Unikraft 或像 Firecracker 这样的完整虚拟机管理程序。这里我们谈论的是真空中的纯代码。
值得尝试吗
如果你的任务是安全地执行一小段代码且延迟最小,Hyperlight 看起来非常有前景。它在"有漏洞"的进程和重量级虚拟机之间提供了完美的平衡。
最简单的入门方式是通过 GitHub Codespaces,README 中有链接。一切都已经配置好了,包括 KVM,所以你可以探索示例而无需设置本地机器。该项目在 CNCF 旗下积极维护,有定期的社区电话会议,所以其长期前景看起来很稳固。
相关项目