>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Rust

信頼できないコードを安全に実行する方法

ユーザーやサードパーティサービスから送信されたコード片を実行する必要があるとします。通常のDockerは重すぎ、別プロセスで実行するのは怖いものです。一歩間違えば、サーバーが南瓜になったり、最悪の場合、ボットネットの一部になってしまいます。これはまさにCNCF Sandboxの人々がHyperlightを開発しているシナリオです。

hyperlight logo

この獣到底是什么

Hyperlightは、マイクロ仮想マシンをオンデマンドで作成するRustライブラリです。グラフィックカードやキーボード付きのコンピュータ全体をエミュレートしようとはしません。代わりに、このプロジェクトはOSカーネさえない、最大限に簡素化された実行環境をスピンアップします。「ゲスト」全体は、no_std用にコンパイルされたRustまたはCのバイナリです。

ここでの主な売り物は速度です。著者は、マイクロVMがミリ秒で起動し、ホストとゲスト間の関数呼び出しはマイクロ秒かかると主張しています。これは、独自のサーバーレスプラットフォームやセキュアなプラグインを構築するための完璧な基盤のように見えます。

実際の動作

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}."))
}

なぜ通常のVMより速いか

秘密は徹底的なミニマリズムにあります。HyperlightにはLinuxの中のLinuxはありません。ファイルシステムドライバー、ネットワークスタック、タスクスケジューラーは存在しません。関数を呼び出すと、ハイパーバイザー(LinuxではKVM、WindowsではMSHV/WHP)が単にCPUコンテキストを切り替えます。

興味深い詳細として、このプロジェクトはsnapshotrestoreメカニズムをサポートしています。数千もの類似した呼び出しを実行する必要がある場合、サンドボックスを一度初期化し、メモリスナップショットを取得してから、各新しい実行前にその状態にロールバックできます。これにより、バイナリを再読み込みする時間を費やすことなく、すべての呼び出しがクリーンな状態から開始されることが保証されます。

誰がこれを必要とし、なぜか

Hyperlightが本当に役立つシナリオがいくつかあります。

まず、クラウド関数(FaaS)です。独自のAWS Lambda代替物を構築している場合、ハイパーバイザーレベルの分離が必要ですが、コンテナの起動に1秒間待機したくありません。

次に、複雑なシステムの拡張機能があります。データベースやゲームサーバーがあり、ユーザーに独自のスクリプトを作成させたいとします。LuaやWASMはクールですが、Hyperlightはさらに厳格な分離を提供し、親しみやすいRustやCで記述できます。

ちなみに、リポジトリにはhyperlight-wasmやhyperlight-jsなどの関連プロジェクトへのリンクがあります。つまり、WebAssemblyやJavaScriptをこれらのマイクロVM内で実行できるため、ツールの汎用性がさらに高まります。

ニュアンスと制限事項

このプロジェクトはpre-1.0の状態です。これはAPIがいつでも変更される可能性があり、ドキュメントは時に頭を悩ませるものになります。

重要な注意:Hyperlightは通常のLinuxアプリケーションを実行するように設計されていません。システムコールが単に存在しないため、lscurlを実行することはできません。それを正確に必要としている場合は、UnikraftやFirecrackerなどの本格的なVMMを見る必要があります。ここでは、真空中の純粋なコードについて話しています。

試す価値はあるか

タスクが最小のレイテンシで少量のコードを安全に実行することである場合、Hyperlightは非常に有望に見えます。「漏れている」プロセスと重量級VMの間のスイートスポットを提供します。

始める最も簡単な方法はGitHub Codespaces経由です。READMEにはリンクがあります。KVMを含むすべてがすでに構成されているため、ローカルマシンを設定せずに例を調べることができます。このプロジェクトはCNCF傘下で積極的にメンテナンスされており、定期的なコミュニティコールがあるため、長期的な見通しは堅実に見えます。

関連プロジェクト