セキュリティ

pVM 内で任意のペイロードが実行されることを防ぐため、Android 仮想化フレームワーク(AVF)では、各レイヤで違反措置を追加する階層化セキュリティ アプローチを使用しています。AVF セキュリティ レイヤのリストは次のとおりです。

  • Android は、pVM 権限を持つアプリにのみ pVM の作成または検査が許可されるようにします。

  • ブートローダー – ブートローダーは、Google またはデバイス ベンダーが署名した pVM イメージのみに起動が許可され、それらが Android 確認付きブートの手順を尊重することを保証します。このアーキテクチャは、pVM を実行するアプリが固有のカーネルをバンドルできないことを意味します。

  • pVM は、pVM 内で動作するペイロードに、SELinux などによる多層防御を提供します。多層防御は、データを実行可能としてマッピングすることを禁止し(neverallow execmem)、W^X がすべてのファイル形式に適用されるようにします。

セキュリティ モデル

機密性 / 整合性 / 可用性(CIA の 3 要素)は、情報セキュリティ ポリシーのガイドとして設計されたモデルです。

  • 機密性とは、情報へのアクセスを制限するルールのセットです。
  • 整合性とは、情報が信頼できることと正確であることの保証です。
  • 可用性とは、権限を与えられたエンティティによる情報への信頼性の高いアクセスの保証です。

機密性と整合性

機密性は、pKVM ハイパーバイザによって強制適用されるメモリ分離プロパティから生じます。pKVM は、個々の物理メモリページのメモリオーナー権限と、ページの共有を求めるオーナーからのすべてのリクエストをトラッキングします。pKVM は、資格を持つ pVM(ホストとゲスト)のみが、ハイパーバイザによって制御されるステージ 2 のページテーブルに該当ページをマッピングしていることを保証します。このアーキテクチャでは、pVM が所有するメモリの内容は非公開に保たれます(ただし、オーナーが別の pVM と明示的に共有している場合を除きます)。

機密性維持の制限は、pVM に代わってメモリアクセスを実行するシステム内の任意のエンティティにも拡張されます。それは、DMA 対応デバイスと、より特権的なレイヤで実行されるサービスです。システム オン チップ(SoC)ベンダーは、pKVM をサポートする前に新しい一連の要件を満たす必要があります。要件を満たしていない場合、機密性は提供されません。

整合性は、メモリ内データと計算の両方に適用されます。pVM では以下を行うことはできません。

  • 同意なくお互いのメモリを変更する。
  • お互いの CPU 状態に影響を及ぼす。

これらの要件はハイパーバイザによって強制適用されます。ただし、データの整合性に関する問題は、dm-verity や AuthFS などの他のソリューションを適用する必要がある仮想データ ストレージでも発生します。

これらの原則は、Linux によって提供されるプロセス分離と変わりはありません。そのような分離では、メモリページへのアクセスが、ステージ 1 のページテーブルと、プロセス間のカーネル コンテキスト スイッチで制御されます。ただし、これらのプロパティを強制適用する pKVM の EL2 部分は、Linux カーネル全体と比べて攻撃サーフェスがおよそ半分(2,000 万行のコードに対して約 1 万)であるため、プロセス分離に依存するには機密性が高すぎるユースケースでは、より強力な保証が提供されます。

その規模を考えると、pKVM は形式的な検証に適しています。Google は、これらのプロパティを実際の pKVM バイナリで形式的に検証することを目的とする学術研究を積極的に支援しています。

このページの残りの部分では、pKVM に関連する各コンポーネントが提供する機密性と整合性の保証について説明します。

ハイパーバイザ

pKVM とは、pVM と Android を相互に信頼できない実行環境に分離する KVM ベースのハイパーバイザです。これらのプロパティは、ホストを含む pVM 内で侵害行為が発生した場合に保持されます。AVF に従う代替ハイパーバイザは、同様のプロパティを提供する必要があります。

  • pVM は、pVM やハイパーバイザなどの別のエンティティに属するページにはアクセスできません(ただし、ページオーナーが明示的に共有しているエンティティを除きます)。このルールはホスト pVM にも当てはまり、CPU アクセスと DMA アクセスの両方に適用されます。

  • pVM によって使用されたページは、ホストに返される前にワイプされます(pVM が破棄されたときなど)。

  • 1 つのデバイス起動からのすべての pVM と pVM ファームウェアのメモリは、後続のデバイス起動で OS ブートローダーが実行される前にワイプされます。

  • SJTAG などのハードウェア デバッガが接続されている場合、pVM は以前作成されたキーにアクセスできません。

  • 初期イメージを検証できない場合、pVM ファームウェアは起動しません。

  • instance.img の整合性が侵害された場合、pVM ファームウェアは起動しません。

  • pVM インスタンスに渡されるブート証明書チェーン(BCC)と複合デバイス識別子(CDI)を導出できるのは、その特定のインスタンスのみです。

ゲスト OS

pVM 内で実行される OS の例として、Microdroid があります。Microdroid は、U-Boot ベースのブートローダー、GKI、Android ユーザー空間のサブセット、ペイロード ランチャーで構成されています。これらのプロパティは、ホストを含む pVM 内で侵害行為が発生した場合に保持されます。pVM 内で実行される代替 OS は、同様のプロパティを提供する必要があります。

  • boot.imgsuper.imgvbmeta.imgvbmeta\_system.img のいずれかを検証できない場合、Microdroid は起動しません。

  • APK の検証が失敗した場合、Microdroid は起動しません。

  • APK が更新された場合でも、同じ Microdroid インスタンスは起動しません。

  • いずれかの APEX の検証が失敗した場合、Microdroid は起動しません。

  • ゲスト pVM の外部で instance.img が変更された場合、Microdroid は起動しません(または、クリーンな初期状態で起動します)。

  • Microdroid はブートチェーンにアテステーションを提供します。

  • ゲスト pVM と共有されるディスク イメージに対して(未署名の)変更を行うと、pVM 側で I/O エラーが発生します。

  • pVM インスタンスに渡される BCC と CDI を導出できるのは、その特定のインスタンスのみです。

  • 暗号化されたストレージ ボリュームに書き込まれる内容は秘匿化されますが、暗号ブロック単位でのロールバック保護はありません。また、外部から無作為で改ざんされたデータブロックについては、I/O エラーとして明示的に検出されず、Microdroid へのガベージとして表示されます。

Android

Android がホストとして保持するプロパティのうち、ホストが侵害された場合に適用されないものは次のとおりです。

  • ゲスト pVM は、他のゲスト pVM と直接やり取りする(たとえば vsock 接続を行う)ことはできません。

  • ホスト pVM 内の VirtualizationService のみが pVM への通信チャネルを作成できます。

  • プラットフォーム キーで署名されたアプリのみが、pVM を作成、所有、または操作する権限をリクエストできます。

  • コンテキスト識別子(CID)という名前の識別子は、ホストと pVM 間の vsock 接続のセットアップで使用されますが、ホスト pVM の実行中は再利用されません。たとえば、実行中の pVM を別の pVM で置き換えることはできません。

可用性

pVM に関して言えば、可用性とは、ゲストが本来の目的であるタスクを実行できるように、ホストが十分なリソースをゲストに割り当てることです。

ホストの役割には、pVM の仮想 CPU のスケジューリングも含まれます。KVM は、Xen のような従来のタイプ 1 ハイパーバイザとは異なり、ワークロードのスケジューリングをホストカーネルに委任するための明示的な設計上の決定を行います。最近のスケジューラのサイズと複雑さにより、この設計上の決定は、信頼できるコンピューティング ベース(TCB)のサイズを大幅に削減します。また、パフォーマンスを最適化するためにホストがより多くの情報に基づいてスケジューリングを決定することを可能にします。ただし、悪意のあるホストは、ゲストを決してスケジュールしないことを選択できます。

同様に、pKVM は物理割り込み処理もホストカーネルに委任して、ハイパーバイザの複雑さを軽減するとともに、ホストにスケジューリングを委ねます。また、ゲスト割り込みの転送によって、サービス拒否(少なすぎる割り込み、多すぎる割り込み、または誤ってルーティングされた割り込み)のみが生じるように努めます。

最後に、ホストの仮想マシンモニター(VMM)プロセスは、メモリの割り当てと仮想デバイス(ネットワーク カードなど)の提供を行います。悪意のある VMM は、ゲストに割り当てるリソースを抑制できます。

pKVM はゲストに可用性を提供しませんが、設計により、ホストの可用性は悪意のあるゲストから保護されます。なぜなら、ホストはいつでもゲストをプリエンプトまたは終了して、ゲストのリソースを回収できるからです。

セキュアブート

データは pVM のインスタンスに関連付けられ、セキュアブートはインスタンスのデータへのアクセスが制御可能であることを保証します。インスタンスの初回起動では、pVM のシークレット ソルトをランダムに生成し、読み込まれたイメージから詳細情報(検証用の公開鍵やハッシュなど)を抽出することにより、プロビジョニングが行われます。この情報は、pVM インスタンスの後続の起動を検証し、検証に合格したイメージにのみインスタンスのシークレットを解放するために使用されます。このプロセスは、pVM 内の読み込みステージ(pVM ファームウェア、pVM ABL、Microdroid など)ごとに発生します。

DICE は、各読み込みステージにアテステーションの鍵ペアを提供します。そのうちの公開部分は、該当ステージの BCC エントリで証明されます。この鍵ペアは起動後に変更されることがあるため、再起動後も VM インスタンスで安定している(したがって永続的な状態の保護に適している)シーリング シークレットも導出されます。シーリング シークレットは VM にとって非常に高価値であるため、直接使用しないでください。代わりに、シーリング シークレットからシーリングキーを導出し、シーリング シークレットをできるだけ早く破棄してください。

各ステージは、確定的にエンコードされた CBOR オブジェクトを次のステージに引き渡します。このオブジェクトにはシークレットと BCC が含まれています。BCC には、前回のステージが安全に読み込まれたかどうかなどのステータス情報が蓄積されています。

ロック解除されたデバイス

fastboot oem unlock でデバイスがロック解除されると、ユーザーデータはワイプされます。このプロセスにより、ユーザーデータが不正アクセスから保護されます。pVM のみに限定公開されるデータも、デバイスのロック解除の際に無効化されます。

デバイスがロック解除されると、デバイスの所有者は、通常は確認付きブートで保護されているパーティション(pKVM 実装が存在するパーティションを含む)を自由に再フラッシュできます。したがって、ロック解除されたデバイス上の pKVM がセキュリティ モデルを維持することは当てにされません。

リモート パーティは、鍵のアテステーション証明書でデバイスの確認付きブート状態を検査することにより、この安全でない可能性がある状態を監視できます。