返回资讯中心
外部精选
云计算
#Kubernetes#可观测性#Blog

Hyperlight 支持在虚拟机隔离的微VM中运行 Linux 应用

来源标题:Run Linux applications in hypervisor-isolated micro-VMs with Hyperlight

Hyperlight 推出新方案,可在 hypervisor 隔离的微VM中运行 Linux 应用,从而在不受信任代码与主机之间建立硬件级边界。背景是 2026 年 Mini Shai-Hulud npm 蠕虫和 PHP2Shell 等事件,说明沙箱边界过薄会带来风险。传统进程沙箱启动快但仅靠软件隔离,虚拟机隔离强却启动慢,该方案试图兼顾两者。

CNCF BlogDanilo Chiarlone, Microsoft2026/11/9 · 今天26 分钟阅读

以下正文由 AI 翻译自 CNCF Blog(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

越来越多的云原生系统会运行团队里没人写过的代码:AI agent 一秒钟前生成的 Python 代码,或者客户刚刚上传的插件。每一段这样的代码,都需要一个边界,把它和宿主机上的其他一切隔开。

最近的两起攻击说明了边界太薄会带来什么后果。2026 年 5 月,Mini Shai-Hulud npm 蠕虫在 CI runner 和开发者机器上运行,读取了一千多个已知的凭据位置,并藏身于 AI 编码 agent 的会话钩子中,因此即使执行 npm uninstall 也无法清除。2026 年 10 月,PHP2Shell——PHP 运行时自身的一对内存处理漏洞——可能让未认证的攻击者在服务器上执行代码,补丁发布之前就已出现利用尝试。出问题的可能是代码本身,也可能是它下面的运行时,而决定损害有多大的,是出问题的代码能够触及多远。

常见的选择往往是拿一个特性换另一个。进程沙箱或语言沙箱能在毫秒级启动,但代码和宿主机之间只有软件:沙箱本身出一个漏洞,或者它与宿主机共享的内核出一个漏洞,代码就逃出去了。虚拟机把 hypervisor 挡在中间,但它本是为启动完整操作系统而设计的,启动需要时间。CNCF Sandbox 项目 Hyperlight 可以帮助弥合这一差距。本文介绍它是如何做到的、它在学会运行未经修改的 Linux 应用(也就是你今天在 Linux 上运行的那些二进制文件,无需移植或重新编译)的过程中发生了哪些变化,以及目前使用它的各种集成,从 Kubernetes 容器运行时到 agent 框架和数据库。

一个可嵌入的 VMM

Hyperlight 是一个库形式的虚拟机监视器(VMM)。它不像 QEMU 或 Firecracker 那样作为独立进程运行:应用程序把它链接进来。核心用 Rust 编写,提供 Python 和 .NET 的 SDK。应用向 Hyperlight 请求一个沙箱,Hyperlight 便创建一个拥有独立内存的 micro-VM,通过宿主机的 hypervisor,借助 CPU 的虚拟化扩展进行隔离:Linux 上是 KVM 或 MSHV,Windows 上是 WHP,macOS 上是 Hypervisor.framework。

Hyperlight micro-VM 不携带任何模拟设备,也不带其他不需要的东西。guest 只能通过宿主机选择暴露的函数来访问宿主机。沙箱能接触什么,是基于能力的:由嵌入方编写的一份允许列表,不存在需要有人记得去撤销的预设权限。

你可能通过 hyperlight-wasm 和 hyperlight-js 运行 WebAssembly 和 JavaScript 而了解 Hyperlight,它们的 guest 是为 Hyperlight 专门构建的。本文要讲的是这个家族的最新成员 hyperlight-unikraft,它可以运行未经修改的 Linux 程序。

未经修改的 Linux 应用

hyperlight-unikraft(其 CLI 为 hluk)在 micro-VM 中运行一个 unikernel:一个为单个应用构建的操作系统,只有一个地址空间,只包含该应用所需的内核组件,比如内存分配器、调度器或文件系统。内核来自 Unikraft,一个 Linux Foundation 项目。guest 运行的是与 Linux 相同的二进制文件。没有 SDK,没有特殊的 libc,也不需要重新编译。

目前 hyperlight-unikraft 可以运行 Python、Node.js、.NET(JIT 和 Native AOT)、Java、PHP、Go、Rust、C、Bash 和 PowerShell,支持 x86_64 和 arm64。

每种运行时都以一个基础 rootfs 的形式提供,项目可以用普通的 Dockerfile 扩展这个基础 rootfs,通过 pip、npm 或 .NET SDK 添加软件包。hluk build 会把结果转成 guest 镜像。有网络访问权限的 Python guest 还可以按需执行 pip install。

由于 guest 运行的是普通 Linux 二进制文件,它也可以运行另一个沙箱,比如 Wasmtime WebAssembly 运行时,并在它崩溃时把它限制住。在 WasmCon 2026 的一场演讲中,Hyperlight 团队展示了一个针对 Wasmtime 已修复漏洞(CVE-2023-26489)的利用程序,该漏洞可让 WebAssembly 代码读取其沙箱之外的内存。直接在宿主机上运行时,这个利用程序读到了宿主机进程中的机密信息。而在 hyperlight-unikraft 内运行时,它只能触及 micro-VM 自己的内存,宿主机的机密信息始终无法被触及。利用程序和演示都在 GitHub 上。hypervisor 边界把一次沙箱逃逸变成了一次 guest 崩溃。

往往比原生更快,还能对已就绪的运行时做快照

Python、Node.js 或 .NET 程序的启动延迟很少是操作系统造成的。它们来自语言运行时在你的代码运行之前所做的工作:导入模块、JIT 编译、加载框架。hyperlight-unikraft 把这些工作做一次,在那个时点对 micro-VM 做快照,然后在毫秒内恢复。对于启动工作繁重的运行时,hypervisor 隔离的沙箱比在宿主机上原生启动同一个程序还要快就绪。

每个运行时镜像都有一个小型 driver,负责启动运行时,然后等待来自宿主机的调用。当 driver 停驻时,运行时已完全启动并处于空闲状态,hluk 就是在这里做快照的。项目可以添加自己的预热代码(warm_exec = “import flask, pandas”),让快照包含它用到的库。之后的运行会在几毫秒内恢复该快照,而不是重新启动。

提速幅度取决于运行时在前期做了多少工作。以下是同一台机器上同一脚本的中位墙钟时间(一台在嵌套虚拟化下运行 KVM 的 8 vCPU Azure VM,hluk 0.20.1,2026 年 11 月),两边都包含进程启动时间(基准测试工具在 GitHub 上):

工作负载hluk,从快照恢复原生 Python hello world22 ms17 ms Node.js hello world39 ms22 ms C# 源码在 guest 内由 Roslyn 编译95 ms1,549 ms(dotnet run) Python 脚本导入 numpy、pandas、scikit-learn45 ms1,119 ms

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →