この記事をシェア
AIが書いたコードを、どう「安全に」実行するか
LLMが自律的にコードを書き、実行する時代になった。僕もこのブログサイトを含め、多くのプロジェクトでAIエージェントと協業している。しかし、ここには根本的な問題がある。
「AIが生成したコードを、本当に安全に実行できるのか?」
通常、LLMが書いたPythonスクリプトやシェルコマンドを実行する場合、ホストマシン上で直接実行するか、Dockerコンテナ内で実行することになる。しかし、前者は論外として、後者であってもrm -rf /のような破壊的コマンドや、環境変数からAPI_KEYを抜き出して外部サーバーに送信するような悪意あるコードから、完全に身を守れるわけではない。
Dockerコンテナは、ホストOSのカーネルを共有している。つまり、カーネルレベルの脆弱性を突かれた瞬間、ホストシステム全体が危険にさらされる。「コンテナエスケープ」という言葉を聞いたことがあるだろうか。これは、コンテナ内のプロセスがホスト環境に脱出してしまう現象だ。
そこで登場したのが、MicroVM(マイクロ仮想マシン)という技術だ。そして、その最前線にいるのがSmolVMである。
SmolVMとは何か?
SmolVMは、AIエージェントのための「使い捨てコンピュータ」だ。一つのコマンドで起動し、LLMが生成したコードを完全に隔離された環境で実行し、終わったら瞬時に消える。起動時間はわずか200ミリ秒以下。Docker並みの軽快さで、VMレベルのセキュリティを実現している。
現在、SmolVMには2つの主要プロジェクトが存在する。
CelestoAI版 SmolVM
ロンドンのスタートアップCelesto AI社が開発するPythonベースのSDK。Linux環境ではFirecracker、macOS環境ではQEMUをバックエンドとして使用する。LangChainやPydanticAIといったエージェントフレームワークとネイティブに統合でき、ブラウザ操作やGUIアプリケーション実行にも対応している。
smol-machines版 smolvm
元AWS Firecrackerエンジニアらが開発するRust製のCLIツール。libkrunという動的ライブラリをVMMとして採用し、バックグラウンドデーモンを一切必要としない。最大の特徴は、環境全体を単一の実行可能ファイル(.smolmachine形式)にパッケージ化できる「パック機能」だ。これにより、「私のPCでは動く」問題を根本から解決できる。
なぜMicroVMなのか? コンテナとの決定的な違い
Dockerコンテナは「同じ基礎(ホストOSカーネル)を共有する、壁で仕切られたアパートの各部屋」だ。壁はプロセスを視覚的に分離するが、基礎部分に欠陥があれば全住人に影響が及ぶ。
一方、MicroVMは「それぞれが独立した基礎(ゲストカーネル)を持つ戸建て住宅」だ。SmolVMは、Intel VT-xやAMD-V、Apple Siliconの仮想化拡張といったCPUのハードウェア仮想化機能を利用し、各サンドボックスに完全に独立したゲストカーネルを割り当てる。
仮にLLMが悪意あるカーネルエクスプロイトを含むコードを生成したとしても、その影響はハードウェア仮想化の壁に阻まれ、隔離された単一の使い捨てVM内部に完全に封じ込められる。
技術比較:SmolVM vs Docker vs クラウドサンドボックス
| 技術 | 分離方式 | 起動時間 | カーネル共有 | デプロイモデル |
|---|---|---|---|---|
| SmolVM (CelestoAI) | MicroVM (Firecracker/QEMU) | ~500ms | なし | ローカル / セルフホスト |
| smolvm (smol-machines) | MicroVM (libkrun) | <200ms | なし | ローカル / セルフホスト |
| Docker | OSレベル (Namespace, cgroups) | ~50ms | あり | 汎用インフラ |
| E2B | MicroVM (Firecracker) | ~150ms | なし | マネージドSaaS |
| Modal | ユーザー空間カーネル (gVisor) | プラットフォーム依存 | システムコール傍受 | マネージドSaaS |
MicroVMアーキテクチャの深層
1. 最小限の仮想化(Minimal Viable Virtualization)
従来のQEMU仮想マシンが起動に数秒から数十秒を要するのは、USBコントローラ、フロッピーディスクドライブ、PCIブリッジなど、現代のクラウドワークロードには不要なレガシーハードウェアをエミュレートしているためだ。
Firecrackerは、これらの不要なデバイスモデルを完全に削ぎ落とし、仮想CPU(vCPU)、メモリ、最小限のVirtIOデバイスのみをサポートする。この徹底したスリム化により、Firecrackerは約5万行のRustコードという極小のアタックサーフェスを実現し、125ミリ秒未満という驚異的な起動速度を達成している。
2. コピーオンライト(CoW)とエフェメラル環境
SmolVMのファイルシステムは、ベースとなるルートファイルシステム(rootfs)イメージに対するコピーオンライト(CoW)クローンとして実装されている。サンドボックス内でエージェントがnpm installを実行したり、巨大な一時ファイルを生成したりしても、それらの変更点はVMのオーバーレイ層にのみ記録される。
VMのライフサイクルが終了した瞬間、これらの変更差分は安全に破棄され、次のセッションでは再びクリーンな状態から瞬時に再開される。
3. 弾力的なリソース管理
メモリ管理には「Virtio balloon」技術が採用されており、ホストマシンは事前に巨大なメモリブロックを固定で確保するのではなく、ゲストOSが実際に消費しているメモリ領域のみを動的にコミットし、不要になったメモリを自動的に回収する。
各VMプロセスのホスト側でのメモリオーバーヘッドはわずか5MB程度であり、一般的なワークステーションでも数百台のMicroVMを同時に稼働させることが可能だ。
実践的なユースケース
AIエージェントフレームワークへの統合
LangChainやPydanticAIなどのフレームワークに、LLMが生成したコードを評価する「安全な実行環境」としてSmolVMを組み込む実装例:
from smolvm import SmolVM
from typing import Dict, Any
def execute_ai_generated_code(code_snippet: str) -> Dict[str, Any]:
"""LLMが生成したPythonコードを隔離されたVMで安全に実行"""
with SmolVM() as vm:
vm.set_env_vars({"OPENAI_API_KEY": "sk-...", "DEBUG_MODE": "true"})
vm.run("pip install requests pandas numpy")
result = vm.run(f"python -c '{code_snippet}'")
return {
"stdout": result.stdout,
"stderr": result.stderr,
"exit_code": result.exit_code,
"success": result.exit_code == 0
}
この実装により、LLMが誤って無限ループを発生させたり、ホストのファイルを削除しようとしたりしても、影響は数ミリ秒後に消滅する一時的なMicroVM内部に完全に封じ込められる。
環境のポータブル化
smol-machines版の「パック機能」を使えば、チーム開発における「私のPCでは動くが、他のメンバーのPCでは動かない」という問題を解決できる:
# Python 3.12環境をまるごと実行可能バイナリにパッケージ化
smolvm pack create --image python:3.12-alpine -o ./isolated-python
# 受け取ったユーザーは、インストール不要で即座に実行可能
./isolated-python run -- python3 --version
セットアップ方法
前提条件
Linux環境では、KVM(Kernel-based Virtual Machine)が利用可能である必要があります。以下のコマンドで確認:
# /dev/kvmデバイスの存在とパーミッションの確認
ls -l /dev/kvm
CelestoAI版のインストール
# インストーラースクリプトをダウンロードして実行
curl -sSL https://celesto.ai/install.sh | bash
このスクリプトは背後で以下の処理を自動的に実行する:
- Pythonパッケージ(
pip install smolvm)および依存関係のインストール - Linux環境の場合、Firecrackerバイナリのダウンロードと配置
- ネットワーク抽象化に必要なシステムパッケージ(
nftables,iproute2)のインストール - ユーザーを
kvmグループへ追加し、仮想化デバイスへのアクセス権限を付与
smol-machines版のインストール
# コマンドのディスカバリ機能を含めたインストール
curl -sSL https://smolmachines.com/install.sh | bash && smolvm --help
メリットとデメリット
メリット
- 絶対的なアイソレーション: LLMが生成した任意のコードを、ホストマシンに一切の影響を与えることなく安全に実行できる
- 完全なポータビリティ:
.smolmachine形式で環境全体をパッケージ化し、「Works on my machine」問題を根本解決 - 透過的な認証フォワーディング: SSHエージェントをVM内にフォワーディングしながら、秘密鍵の抽出は物理的に不可能
- 宣言的構成管理: DockerfileライクなSmolfile(TOML形式)で環境をコードとして定義可能
デメリットと制約
- ハードウェア要件: KVMが利用できない環境(一部のVPSやCI/CDランナー)では動作しないか、パフォーマンスが低下
- GPUサポートの過渡期: GPU パススルーは開発中(WIP)であり、現時点ではCPUワークロードに限定
- ホストディレクトリマウントの書き込み制限: セキュリティ上の理由から、マウントされたホストディレクトリは読み取り専用
セキュリティ留意点
SmolVMのハードウェア分離は強力だが、運用上の設定を誤ればその利点は損なわれる。特に注意すべき点:
エグレス(外部向け)ネットワークの制御
LLMが生成したコードが悪意のある外部サーバーへデータを送信するのを防ぐ必要がある。smol-machines版ではネットワークはデフォルトでオフになっており、--allow-hostフラグを用いて通信先を明示的に許可するホワイトリスト方式が採用されている。
# npmレジストリへの通信のみを許可
smolvm run --allow-host registry.npmjs.org -- npm install express
SSH信頼モデルの脆弱性
CelestoAI版は、ローカル環境でのゼロタッチな利便性を優先するため、VM初回接続時に未知のSSHホストキーを自動的に信頼する設定となっている。信頼できるローカルネットワークや隔離された環境内では問題ないが、パブリックネットワーク上で公開する場合は、厳格なファイアウォール規則やプライベートVPC内でのデプロイが必須である。
トラブルシューティング
smolvm doctor による自己診断
# システム設定、KVMアクセス権、ネットワークツールの依存関係を診断
smolvm doctor --strict
代表的なエラーと解決策
/dev/kvm not found または権限エラー
Linux環境においてKVMグループへの追加が反映されていない。sudo usermod -aG kvm $USERを実行した後、システムから一度ログアウトし、再ログインする。
Permission denied: Cannot create TAP device
TAPネットワークデバイスを作成するための権限が不足している。sudo ./scripts/system-setup.sh --configure-runtimeを再実行し、ネットワーク操作用のパスワードレスsudo設定を修正する。
総括:AI時代のインフラパラダイムシフト
次世代仮想環境「SmolVM」を巡る技術的潮流は、インフラストラクチャの歴史における「揺り戻し」と「最適化」を象徴している。
かつて、仮想マシンの重厚長大なオーバーヘッドを嫌い、開発者は軽量なコンテナ技術へと移行した。しかし、Generative AIが自律的にコードを書き、システムに干渉する時代が到来したことで、「隔離と安全性」の要請が再び最重要課題として浮上した。
SmolVMは、FirecrackerやlibkrunといったモダンなMicroVM基盤を活用することで、仮想マシンが持つ絶対的なハードウェア分離のセキュリティを維持しながら、コンテナに匹敵するミリ秒単位の俊敏性を実現した。
AI時代のソフトウェアアーキテクチャにおいて、未検証のコードを実行するインフラの標準単位は、もはや「プロセス(コンテナ)」ではなく「軽量なハードウェア(MicroVM)」へと移行しつつある。
システム設計者やプラットフォームエンジニアは、このパラダイムシフトを早期に認識し、SmolVMが提供する革新的な分離メカニズムを自社のセキュリティ・アーキテクチャへ戦略的に組み込んでいくことが強く推奨される。
