pVM 内で任意のペイロードが実行されるのを防ぐために、Android Virtualization Framework (AVF) は、各レイヤーが追加の適用を追加する階層化されたセキュリティ アプローチを使用します。以下は、AVF セキュリティ層のリストです。
Android – Android は、pVM アクセス許可を持つアプリのみが pVM の作成または検査を許可されるようにします。
ブートローダー – ブートローダーは、Google またはデバイス ベンダーによって署名された pVM イメージのみが起動できるようにし、 Android の検証済みの起動手順に従います。このアーキテクチャは、pVM を実行するアプリが独自のカーネルをバンドルできないことを意味します。
pVM – pVM は、pVM で実行されるペイロードに対して、 SELinuxなどによる多層防御を提供します。多層防御は、データのマッピングを実行可能ファイルとして禁止し (
neverallow execmem
)、すべてのファイル タイプに対してW^Xが確実に保持されるようにします。
セキュリティ モデル
機密性、完全性、および可用性は、CIA トライアドとも呼ばれ、情報セキュリティ ポリシーを導くために設計されたモデルです。
- 機密性とは、情報へのアクセスを制限する一連の規則です。
- 完全性とは、情報が信頼でき、正確であることを保証することです。
- 可用性は、承認されたエンティティによる情報への信頼できるアクセスの保証です。
pKVM は、ゲストの機密性と整合性を維持するように設計されていますが、可用性は維持しないことに注意してください。これらの原則は、ハイパーバイザーからユーザー空間のコンポーネントまで、アーキテクチャのあらゆる側面にわたる設計上の決定に影響を与えます。
機密性と完全性
機密性は、pKVM ハイパーバイザーによって適用されるメモリ分離プロパティに由来します。 pKVM は、個々の物理メモリ ページのメモリ所有権と、ページを共有するための所有者からの要求を追跡します。 pKVM は、資格のある pVM (ホストおよびゲスト) のみが、ハイパーバイザーによって制御されるステージ 2 ページ テーブルに特定のページがマップされるようにします。このアーキテクチャでは、pVM が所有するメモリの内容は、所有者が別の pVM と明示的に共有しない限り、非公開のままです。
機密性を維持するための制限は、pVM に代わってメモリ アクセスを実行するシステム内のすべてのエンティティ、つまり、 DMA 対応のデバイスと、より特権のあるレイヤーで実行されるサービスにも適用されます。 SoC ベンダーは、pKVM をサポートする前に、新しい一連の要件を満たす必要があります。そうしないと、機密性を提供できません。
整合性は、メモリ内のデータと計算の両方に適用されます。
- pVM は、同意なしに互いのメモリを変更することはできません。
- pVM は、互いの CPU 状態に影響を与えることはできません。
これらの要件は、ハイパーバイザーによって適用されます。しかし、データの整合性に関する問題は、dm-verity や AuthFS などの他のソリューションを適用する必要がある仮想データ ストレージでも発生します。
これらの原則は、メモリ ページへのアクセスがステージ 1 ページ テーブルとプロセス間のカーネル コンテキスト スイッチで制御される Linux が提供するプロセス分離と何ら変わりはありません。ただし、これらのプロパティを強制する pKVM の EL2 部分は、Linux カーネル全体と比較して攻撃対象領域が約半分 (約 10,000 行と 2,000 万行のコード) であるため、機密性が高く信頼できないユースケースに対してより強力な保証を提供します。プロセスの分離について。
そのサイズを考えると、pKVM は正式な検証に適しています。実際の pKVM バイナリでこれらの特性を正式に証明することを目的とした学術研究を積極的にサポートしています。
このドキュメントの残りの部分では、pKVM の各コンポーネントが提供する機密性と完全性の保証について説明します。
ハイパーバイザー
pKVM は、pVM と Android を相互に信頼できない実行環境に分離する KVM ベースのハイパーバイザーです。これらのプロパティは、ホストを含む任意の pVM 内で侵害が発生した場合に保持されます。 AVF に準拠する代替ハイパーバイザーは、同様のプロパティを提供する必要があります。
- ページの所有者によって明示的に共有されていない限り、pVM は、pVM やハイパーバイザーなどの別のエンティティに属するページにアクセスできません。このルールにはホスト pVM が含まれ、CPU アクセスと DMA アクセスの両方に適用されます。
- pVM が使用するページは、pVM が破棄された場合など、ホストに返される前にワイプされます。
- すべての pVM のメモリと 1 つのデバイス ブートからの pVM ファームウェアは、後続のデバイス ブートで OS ブートローダーが実行される前に消去されます。
- SJTAG などのハードウェア デバッガーが接続されている場合、pVM は以前に作成されたキーにアクセスできません。
- 初期イメージを検証できない場合、pVM ファームウェアは起動しません。
-
instance.img
の整合性が損なわれると、pVM ファームウェアは起動しません。 - pVM インスタンスに提供されるブート証明書チェーン (BCC) と複合デバイス識別子 (CDI) は、その特定のインスタンスによってのみ派生できます。
ゲスト OS
Microdroidは、pVM 内で実行される OS の例です。 Microdroid は、U-boot ベースのブートローダー、GKI、Android ユーザー空間のサブセット、およびペイロード ランチャーで構成されています。これらのプロパティは、ホストを含む任意の pVM 内で侵害が発生した場合に保持されます。 pVM で実行されている代替 OS は、同様のプロパティを提供する必要があります。
-
boot.img
、super.img
、vbmeta.img
、またはvbmeta\_system.img
を検証できない場合、Microdroid は起動しません。 - APK の検証に失敗すると、Microdroid は起動しません。
- APK が更新されても、同じ Microdroid インスタンスは起動しません。
- APEX のいずれかが検証に失敗すると、Microdroid は起動しません。
-
instance.img
がゲスト pVM の外部で変更された場合、Microdroid は起動しません (またはクリーンな初期状態で起動します)。 - Microdroid は、ブート チェーンに証明書を提供します。
- ゲスト pVM に共有されているディスク イメージに (署名されていない) 変更を加えると、pVM 側で I/O エラーが発生します。
- pVM インスタンスに提供される BCC および CDI は、その特定のインスタンスによってのみ派生できます。
アンドロイド
これらは Android がホストとして保持するプロパティですが、ホストが侵害された場合は当てはまりません。
- ゲスト pVM は、他のゲスト pVM と直接対話する (たとえば、vsock 接続を作成する) ことはできません。
- ホスト pVM の
VirtualizationService
のみが pVM への通信チャネルを作成できます (注: 確立されたチャネルを他のユーザーに渡すことができます)。 - プラットフォーム キーで署名されたアプリのみが、pVM を作成、所有、または操作するためのアクセス許可を要求できます。
- ホストと pVM 間のvsock接続の設定に使用されるコンテキスト識別子 (CID)と呼ばれる識別子は、ホスト 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 が含まれています。
ロック解除されたデバイス
デバイスがfastboot oem unlock
でロック解除されると、ユーザー データが消去されます。このプロセスにより、ユーザー データが不正アクセスから保護されます。デバイスのロック解除が発生すると、pVM にプライベートなデータも無効になります。
ロックが解除されると、デバイスの所有者は、pKVM 実装を含むパーティションを含め、通常は検証済みの起動によって保護されているパーティションを自由に再フラッシュできます。したがって、ロックされていないデバイスの pKVM は、セキュリティ モデルを維持するために信頼されません。
リモート パーティは、キー構成証明証明書でデバイスの検証済みの起動状態を検査することにより、この潜在的に安全でない状態を観察できます。