Firecracker VM Escape: PwnEscape Part 2 Analysis

Firecrackerエスケープの概要

このエクスプロイトは、Firecracker microVM内からホストマシン上でルートレベルのコード実行を実現する手法を実証するものです。ホストメモリのプリミティブを活用することで、攻撃者はFirecrackerプロセスを特定し、アクティブなvCPUスレッドを識別し、その保存されたレジスタ状態を書き換えることで、KVM_RUNシステムコールからの復帰時に実行をリダイレクトさせることができます。

ホストプロセスとvCPUスレッドの特定

このエクスプロイトチェーンは、ゲストに関連付けられたホスト側のリソースを特定することに依存しています。まず、ゲストはメモリページ内に一意のナンスを配置し、それをEPT(Extended Page Table)ウォークを使用してホスト物理メモリ内で特定します。このページのホスト物理アドレス(HPA)が特定されると、攻撃者はホストのページテーブルを使用して逆マッピングを行い、FirecrackerプロセスとそのPGD(Page Global Directory)を識別します。

ホストのPGDとFirecrackerバイナリのロードバイアス(ASLR耐性のあるマッピングを通じてELFイメージを特定することで決定)が判明すれば、攻撃者はプロセスのメモリを調査できます。このフェーズの最終ステップは、アクティブなvCPUスレッドのpt_regs構造体を見つけることです。攻撃者は、実行中のmicroVMに関連付けられた特定の命令ポインタ、スタックポインタ、ファイル記述子を含む、期待されるKVM_RUN ioctl状態と一致するフレームを検索します。

実行のリダイレクトとペイロードの配信

保存されたレジスタフレームが特定されると、攻撃者はスレッドの実行コンテキストを修正して悪意のあるペイロードを注入します。保存された命令ポインタとスタックデータを上書きすることで、攻撃者はFirecrackerプロセスに自身のstderrに対してwrite(2)呼び出しを実行させ、制御を証明します。

安定性を確保するため、このエクスプロイトはリターン指向のアプローチを使用します:

  1. スレッドは、選択した操作を実行するためにwriteラッパーへリダイレクトされます。
  2. 予期しない戻り値によって元のKVM_RUNロジックが失敗するのを防ぐため、xor eax, eax; retシーケンスを使用して戻り値がクリアされます。
  3. スレッドは元の実行パスに戻され、VMMのクラッシュを防ぐために一時的なスタックの変更が復元されます。

セキュリティコンテキストと緩和策

このデモンストレーションは、jailerを使用しないFirecracker v1.16.1で実行されました。Firecrackerのプロダクションレベルのコンテナ化(jailerユーティリティ、seccompフィルタ、名前空間の分離の使用を含む)は、このようなエスケープの影響を大幅に軽減するように設計されていることに注意することが重要です。

"適切にjailerで制限され設定されたFirecrackerインスタンスであれば、このエスケープの被害範囲は大幅に縮小されるでしょう... ほとんどのプロダクション環境のFirecrackerデプロイメントでは既にこれが行われていることを期待します。これが深刻でないと言っているわけではなく、根本的な問題はFirecracker固有のものではなく、カーネルのネットワークコードの欠陥にあります。彼らは単にそれを実証するために安全でないFirecracker設定を使用しただけです。" — Commenter @scoodah

このエクスプロイトは強力なプリミティブを実証していますが、プロダクション環境での成功は、ホストのサンドボックス設定の有効性に依存します。この根本的な脆弱性は、ゲストがホスト側のプロセスメモリと対話することを可能にするメモリ・アクセス・プリミティブに関連するリスクを浮き彫りにしています。

Sources

関連