Untrusted Code ausführen, ohne graue Haare zu bekommen
Stellen Sie sich vor, Sie müssen ein Code-Stück ausführen, das von einem Benutzer oder einem Drittanbieterdienst gesendet wurde. Normales Docker fühlt sich zu schwer an, und es einfach in einem separaten Prozess auszuführen, ist furchteinflößend. Ein falscher Zug und Ihr Server verwandelt sich in einen Kürbis oder, schlimmer noch, wird Teil eines Botnetzes. Genau für diese Art von Szenario entwickeln die Leute vom CNCF Sandbox Hyperlight.
Was ist das für ein Biest
Hyperlight ist eine Rust-Bibliothek, die im Handumdrehen Micro-Virtual Machines erstellt. Sie versucht nicht, einen ganzen Computer mit Grafikkarte und Tastatur zu emulieren. Stattdessen startet das Projekt eine maximal abgespeckte Ausführungsumgebung, die nicht einmal einen OS-Kernel hat. Der gesamte „Gast" ist nur eine Binärdatei, die für no_std Rust oder C kompiliert wurde.
Das Hauptverkaufsargument ist hier die Geschwindigkeit. Die Autoren behaupten, dass eine Micro-VM in Millisekunden startet und Funktionsaufrufe zwischen Host und Gast nur Mikrosekunden dauern. Das klingt nach der perfekten Grundlage für den Bau eigener Serverless-Plattformen oder sicherer Plugins.
Wie es in der Praxis funktioniert
Mit Hyperlight zu arbeiten fühlt sich wie normale Programmierung an, außer dass Funktionen in verschiedenen Welten ausgeführt werden. Sie fügen die Bibliothek Ihrer Rust-Anwendung hinzu, übergeben ihr eine kompilierte Gast-Binärdatei und rufen Methoden auf.
So sieht die Host-seitige Initialisierung aus:
// Подготавливаем песочницу, пока без запуска 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}");
Und so sieht der Code innerhalb der virtuellen Maschine aus. Dank Makros ist alles sehr transparent:
#[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}."))
}
Warum es schneller ist als normale VMs
Das Geheimnis liegt im totalen Minimalismus. Hyperlight hat kein Linux innerhalb von Linux. Es gibt keine Dateisystemtreiber, keinen Netzwerk-Stack und keinen Task-Scheduler. Wenn Sie eine Funktion aufrufen, wechselt der Hypervisor (KVM unter Linux oder MSHV/WHP unter Windows) einfach den CPU-Kontext.
Ein interessantes Detail: Das Projekt unterstützt snapshot und restore Mechanismen. Wenn Sie Tausende ähnlicher Aufrufe ausführen müssen, können Sie die Sandbox einmal initialisieren, einen Speicher-Snapshot erstellen und vor jedem neuen Lauf dorthin zurückkehren. Dies stellt sicher, dass jeder Aufruf mit einem sauberen Zustand beginnt, ohne Zeit für das erneute Laden der Binärdatei aufzuwenden.
Wer braucht das und warum
Ich sehe mehrere Szenarien, in denen Hyperlight wirklich durchstarten könnte.
Erstens gibt es Cloud-Funktionen (FaaS). Wenn Sie Ihre eigene AWS-Lambda-Alternative bauen, brauchen Sie Hypervisor-Level-Isolation, möchten aber nicht eine Sekunde auf das Starten eines Containers warten.
Zweitens gibt es Erweiterungen für komplexe Systeme. Angenommen, Sie haben eine Datenbank oder einen Spieleserver und möchten Benutzern erlauben, ihre eigenen Skripte zu schreiben. Lua oder WASM ist cool, aber Hyperlight bietet noch striktere Isolation und ermöglicht es Ihnen, in vertrautem Rust oder C zu schreiben.
Übrigens enthält das Repository Links zu verwandten Projekten wie hyperlight-wasm und hyperlight-js. Das bedeutet, dass Sie bereits WebAssembly oder JavaScript in diesen Micro-VMs ausführen können, was das Tool noch vielseitiger macht.
Nuancen und Einschränkungen
Das Projekt befindet sich im Pre-1.0-Status. Das bedeutet, die API kann sich jederzeit ändern und die Dokumentation ist gelegentlich zum Haare raufen.
Wichtiger Hinweis: Hyperlight ist nicht für das Ausführen normaler Linux-Anwendungen konzipiert. Sie werden dort ls oder curl nicht ausführen können, weil Systemaufrufe einfach nicht existieren. Wenn Sie genau das brauchen, müssen Sie sich Unikraft oder vollwertige VMMs wie Firecracker ansehen. Hier geht es um reinen Code im Vakuum.
Lohnt es sich, es zu versuchen
Wenn Ihre Aufgabe darin besteht, ein kleines Code-Stück mit minimaler Latenz sicher auszuführen, sieht Hyperlight sehr vielversprechend aus. Es bietet genau den sweet Spot zwischen „leckenden" Prozessen und schwergewichtigen VMs.
Der einfachste Weg zu beginnen ist über GitHub Codespaces, mit Links direkt in der README. Dort ist alles bereits konfiguriert, einschließlich KVM, sodass Sie die Beispiele erkunden können, ohne Ihre lokale Maschine einzurichten. Das Projekt wird aktiv unter dem CNCF-Dach gepflegt, mit regelmäßigen Community-Calls, daher sehen die langfristigen Aussichten solide aus.
Ähnliche Projekte