
2026/11/07 4:33
ファイアクラッカーVMエスケープ:PwnEscape パート2
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
重要なセキュリティの突破が明らかとなり、Firecracker ハイパーバイザーを迂回してホストシステムで完全な root アクセスを取得できることが、CVE-2026-99999 として追跡されています。このエクスプロイトは、拡張ページテーブル(EPT)の解決、ホストのページテーブルへの逆マッピング、ASLR 下でのバイナリに対するイメージマッピング、そしてアクティブな
pt_regs 構造体の所在を特定する「4 つのリゾルブ段階」に依存し、KVM_RUN から直ちに戻った生きている vCPU スレッドをハイジャックします。この復帰中に保存されたレジスタを変更することで、研究者たちは隔離から脱出し、管理者権限でコードを実行することに成功しました。特筆すべきは、攻撃がペイロードの配信後に一時スタック語を復元する可逆的な手順を含んでいることであり、その結果、Firecracker インスタンスは通常通り実行され続け、SSH アクセスも保持されており、侵害されているにもかかわらず機能的と見なされます。特定バージョンの Firecracker とホストカーネルでテストされたこの概念実証(PoC)は、jailer プロセスを必要とせずに、ホストメモリおよびプロセス制御を直接操作できることを示しており、unjailered インスタンスが脆弱であることを実証しています。本文
脆弱性回避によるファイアークラッカープロセス乗っ取りとホストルート権限実行
ファイアークラッカー(Firecracker)は信頼できないコードをマイクロ VM に隔離するセキュリティ製品ですが、当グループはこの仕組みの隙間を活用し、ゲスト OS からホストシステム上でルート権限のコード実行を実現しました。
01 概要と攻撃手法の要約
基本コンセプト
- 目的: ファイアークラッカーがレジスタ情報を保存・管理する挙動を特定し、KVM(仮想化インターフェース)からの復帰地点を変更することで、ゲストからホストのコードを強制実行すること。
- 成果: ゲスト OS が一時スタックを復元した後でも、ファイアークラッカーは不正な動作を続け、SSH 経由での VM アクセスが維持されます。
- 位置付け: 前回の「PwnEscape Part 1」で示したホストメモリ操作の原理に基づいた次段階の実装。CVE-2026-99999 に対する攻撃シナリオの検証です。
02 攻撃ステップの詳細
ステップ 1: 支配の場所を選定する(KVM_RUN の復帰先)
- ファイアークラッカーは、仮想 CPU(vCPU)実行時に KVM を介してゲストを走行させます。
- ユーザー空間でイベントが発生し
システムコールから戻った際、ファイアークラッカースレッドへ復帰します。KVM_RUN - 復帰直前、ホストカーネルはユーザー空間のレジスタ情報を
構造体に保存しています(指令ポインタ:再開地点、スタックポインタ:使用スタック)。pt_regs - 攻撃経路: 保存されたフレーム(スタックフレーム)を特定・改ざんすることで、復帰時の実行コードを任意に操作可能です。
ステップ 2: ホスト上のゲストページを検出する(EPT 解決)
- ゲストとホストは異なる物理アドレス空間を持ちます(GPA と HPA)。拡張ページテーブル(EPT)がこれをトランスレートします。
- Nonce トークン: ゲストメモリページに固有のパターンを埋め込み、EPT ルートを探索してホスト物理アドレス(HPA)を確認します。
- 複数の候補から絞り込み、
を取得し、次段階の解決器へ渡します。guest_page_hpa
ステップ 3: ファイアークラッカープロセスの特定
- ファイアークラッカーは自身のメモリ空間にゲストページをマッピングしています。
- 逆マッパー(Reverse Mapper): 既知の物理ページ
から、ホストページのグローバルディレクトリ(PGD)ルートを見つけ出し、プロセスの詳細情報を取得します。guest_page_hpa - ASLR の回避:
- ELF イメージを特定し、ロードバイアス(
)を計算。firecracker_base - 以下の 3 箇所を確認可能なコード領域にアクセス可能とします:
ラッパー関数write(2)- KVM ioctl 実行後の継続部分
- クリーンな復帰用の
シークエンスxor eax,eax; ret
- ELF イメージを特定し、ロードバイアス(
ステップ 4: 実行中の vCPU フレームの特定
- ターゲットの絞り込み: KVM_RUN の実行中スレッドにおいて、ioctl 継続地点の保存レジスタフレームを検出します。
- 多重チェック項目(以下を満たす唯一の候補に絞り込む):
| チェック項目 | 確認内容 |
|---|---|
| システムコール | 種別および状態がアクティブな ioctl と一致するか。 |
| リクエスト引数 | ioctl が か。 |
| ファイルディスクリプタ | ヘルパー想定範囲内か。 |
| 指令ポインタ | 検証済みの ioctl 継続地点と一致するか。 |
| スタックポインタ | 復元された PGD でトランスレート可能か。 |
| セグメント/フラグ | ユーザー空間への有効な復帰を記述しているか。 |
| コラーの復帰先アドレス | ファイアークラッカーテキストマッピング内にあるか。 |
- 条件を満たす位置(
)を取得し、ヘルパーへ渡します。frame_hpa
ステップ 5: KVM 復帰先のリダイレクト
- ペイロード: ファイアークラッカープロセスの標準エラー出力に文字列
を書き出させる(8 バイト)。N8V23M2\n - 実装方法:
を実行し、戻り値を調整するために復帰シーケンスを組み込みます。write(2, buffer, 8)- 1 つ目の復帰先:eax クリア用 (
)xor eax,eax; ret - 2 つ目の復帰先:元の実行地点に戻るアドレス
- トリガー: ゲストがシリアルポートへ 1 バイト書き込むことで vCPU スレッドを KVM_RUN から復帰させます。
ステップ 6: 実行の確認および回復検証
- 観測結果: ホスト側で標準エラー出力から
が正確に出力されました。N8V23M2 - 健全性確認:
- ファイアークラッカープロセスは終了せず稼働中(PID 2936)。
- ゲストの SSH は応答可能。
- 一時的スタックは元の状態へ完全復元済み。
- ホストカーネルエラーは発生しませんでした。
ステップ 7: ホスト上のルート権限でのコード実行
- 環境: x86-64、ファイアークラッカー v1.16.1、ホスト カーネル 5.x/Ubuntu AWS AMI。
- 実装方法:
でルート権限下で起動し、systemd-run
でスレッド固定(ピン留め)することで、制御された呼び出しをホスト上でルート権限として実行します。taskset- 既存の
ラッパーにより、コンパクトな証明(POC)が得られました。write
- 制約:
- Jailer(権限制限モジュール)が設定されていない環境での検証です。
- 特権放棄やネームスペース制限が適用された標準的なコンテナ環境では、利用可能なリソースの評価が必要です。
03 技術的アーティファクト
保存された解決器値
以下は実行記録から取得した主要なアドレス情報です。
| 変数名 | レコードされたアドレス | 役割 / 導入位置 |
|---|---|---|
| 0x08f03000 | Nonce ページのゲスト物理アドレス(1 番目の解決器へ) |
| 0x165610000 | EPT 解決器により発見されたホスト物理ページ |
| 0x14afc2000 | 逆マッパーにより復元されたホスト PGD ルート |
| 0x7298c2400000 | イメージマッパーにより復元されたロードバイアス |
| 0x13a5bff48 | アクティブな vCPU ステートとして選択された保存レジスタフレーム |
- ラン ID:
eventpath-v23-0907self02 - ブート ID:
2b3cd5ac-2311-427f-a50a-6a79ecb8daa7
検証コマンド(Proof of Concept)
アーティファクトの完全性を確認するには、以下の SHA-256 チェックサムを使用します。
shasum -a 256 -c SHA256SUMS
リリースバンドル構成
- 最終ヘルパーのソースコード
- JSONL 形式の解決器レコード
- ホストキャプチャと回復マニフェスト
- 4 つのプロベナンスが証明された読み取り専用解決器バイナリ
- SHA-256 マニフェスト
04 結論
ゲストはホストメモリへのアクセスを利用して、VM を走行中のスレッド自体を乗っ取ることに成功しました。シリアル書き込みという単純なトリガーがきっかけとなり、次なるユーザー空間操作を攻撃者が制御できるようになります。