>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
Rust

Comment exécuter du code non fiable sans perdre la raison

Imaginez que vous devez exécuter un morceau de code envoyé par un utilisateur ou un service tiers. Docker classique semble trop lourd, et le lancer dans un processus séparé fait peur. Un faux mouvement et votre serveur se transforme en citrouille ou, pire, devient partie d'un botnet. C'est exactement le genre de scénario pour lequel les gens du CNCF Sandbox développent Hyperlight.

hyperlight logo

Qu'est-ce que c'est

Hyperlight est une bibliothèque Rust qui crée des micro-machines virtuelles à la volée. Elle ne tente pas d'émuler un ordinateur entier avec une carte graphique et un clavier. À la place, le projet fait tourner un environnement d'exécution réduit au maximum qui n'a même pas de noyau de système d'exploitation. L'ensemble du « guest » n'est qu'un binaire compilé pour no_std Rust ou C.

Le principal argument de vente ici est la vitesse. Les auteurs affirment qu'une micro-VM démarre en millisecondes, et que les appels de fonction entre l'hôte et le guest prennent des microsecondes. Cela ressemble à la fondation parfaite pour construire vos propres plateformes serverless ou des plugins sécurisés.

Comment ça marche en pratique

Travailler avec Hyperlight ressemble à de la programmation classique, sauf que les fonctions s'exécutent dans des mondes différents. Vous ajoutez la bibliothèque à votre application Rust, vous lui donnez un binaire guest compilé, et vous appelez les méthodes.

Voici à quoi ressemble l'initialisation côté hôte :

// Подготавливаем песочницу, пока без запуска 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}"); 

Et voici à quoi ressemble le code à l'intérieur de la machine virtuelle. Grâce aux macros, tout est très 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}."))
}

Pourquoi c'est plus rapide que les VMs classiques

Le secret réside dans le minimalisme total. Hyperlight n'a pas Linux dans Linux. Il n'y a pas de pilotes de système de fichiers, de pile réseau ou d'ordonnanceur de tâches. Quand vous appelez une fonction, l'hyperviseur (KVM sur Linux ou MSHV/WHP sur Windows) commute simplement le contexte du CPU.

Un détail intéressant : le projet supporte les mécanismes snapshot et restore. Si vous avez besoin d'exécuter des milliers d'appels similaires, vous pouvez initialiser le bac à sable une fois, prendre un instantané mémoire, et le restaurer avant chaque nouvelle exécution. Cela garantit que chaque appel commence avec un état propre sans passer de temps à recharger le binaire.

Qui en a besoin et pourquoi

Je vois plusieurs scénarios où Hyperlight pourrait vraiment prendre son envol.

Premièrement, il y a les fonctions cloud (FaaS). Si vous construisez votre propre alternative à AWS Lambda, vous avez besoin d'une isolation de niveau hyperviseur mais vous ne voulez pas attendre une seconde pour qu'un conteneur se lance.

Deuxièmement, il y a les extensions pour les systèmes complexes. Disons que vous avez une base de données ou un serveur de jeu et que vous voulez laisser les utilisateurs écrire leurs propres scripts. Lua ou WASM c'est bien, mais Hyperlight fournit une isolation encore plus stricte et vous permet d'écrire dans du Rust ou C familier.

Au fait, le dépôt contient des liens vers des projets connexes comme hyperlight-wasm et hyperlight-js. Cela signifie que vous pouvez déjà exécuter du WebAssembly ou du JavaScript à l'intérieur de ces micro-VMs, rendant l'outil encore plus polyvalent.

Nuances et limitations

Le projet est en statut pré-1.0. Cela signifie que l'API peut changer à tout moment, et la documentation est parfois déconcertante.

Note importante : Hyperlight n'est pas conçu pour exécuter des applications Linux classiques. Vous ne pourrez pas y exécuter ls ou curl car les appels système n'existent tout simplement pas. Si vous avez exactement besoin de cela, vous devrez regarder du côté d'Unikraft ou de VMM complets comme Firecracker. Ici, on parle de code pur dans le vide.

Est-ce que ça vaut le coup d'essayer

Si votre tâche est d'exécuter en toute sécurité un petit morceau de code avec une latence minimale, Hyperlight semble très prometteur. Il fournit ce juste milieu entre les processus « perméables » et les VMs lourdes.

Le moyen le plus simple de commencer est via GitHub Codespaces, avec des liens directement dans le README. Tout est déjà configuré là-bas, y compris KVM, donc vous pouvez explorer les exemples sans configurer votre machine locale. Le projet est activement maintenu sous l'égide du CNCF, avec des appels communautaires réguliers, donc ses perspectives à long terme semblent solides.

Projets similaires