Skip to content
KitploitKITPLOIT
ツールブログ
Log in
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/msm8916-mainline/cve-2022-22063
組み込みシステムセキュリティ特権昇格脆弱性分析エクスプロイトハードウェアセキュリティ論文と研究学習と教育ファームウェア解析バイナリエクスプロイト
GitHubmsm8916-mainline/cve-2022-22063

CVE-2022-22063

一部の旧型Qualcommチップセットのハイパーバイザーファームウェアにおけるセキュリティ問題

473133年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る

CVE-2022-22063

CVE-2022-22063 は、一部の古い Qualcomm チップセットのハイパーバイザーファームウェアにおけるセキュリティ上の問題です。保護されていないハードウェアコンポーネント(「ブートリマッパー」)を悪用すると、改変されたオペレーティングシステムからハイパーバイザーへの完全な読み取り/書き込みアクセスを取得できます(権限昇格)。影響を受けるプラットフォームでは、特定のファームウェアバージョンに関する知識(アドレスや変数など)が不要なため、この問題の悪用は簡単です。

注記: Qualcomm は顧客に修正を提供しましたが(アップデートをリリースする十分な時間がありました)、影響を受けるデバイスの多くはかなり古く、ベンダーから修正を受け取れない場合があります。この問題は、改変された、または侵害されたオペレーティングシステムから(別のセキュリティ問題を利用して)のみ悪用可能です。ファームウェアに脆弱性があっても、オペレーティングシステムを最新かつ安全な状態に保つことで十分な場合があります。

概要

  • CVE 識別子: CVE-2022-22063
  • セキュリティ評価(Qualcomm): Critical
  • 共通脆弱性評価システム: 8.4 (High)、CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
  • 共通脆弱性タイプ一覧 (CWE): CWE-1257: Improper Access Control Applied to Mirrored or Aliased Memory Regions および/または CWE-1262: Improper Access Control for Register Interface、Qualcomm はこの問題を広く CWE-16: Configuration として分類しています。

この問題は [Qualcomm's December 2022 Security Bulletin] にも掲載されました。

要件

この問題は、影響を受ける対象で実行されているハードウェアとソフトウェアの組み合わせに依存します:

  1. ソフトウェア: デバイスは、Qualcomm が提供する別個の「ハイパーバイザー」ファームウェアを実行します(通常は内部ストレージの hyp パーティション内の ELF イメージ)。
  2. ハードウェア: ブートリマッパー の非セキュア版が存在します(通常は APCS_BOOT_START_ADDR_NSEC と呼ばれるハードウェアレジスタを使用して設定可能)。これはハイパーバイザーによって保護されておらず、したがって特権レベルの低いオペレーティングシステムカーネル(例:Linux)からアクセス可能です。

影響を受けるハードウェアを搭載している可能性が高いチップセットは他にもいくつかあります(例:MSM8909 や MSM8953)が、それらには侵害される可能性のある別個のハイパーバイザーファームウェアがありません。

影響

  • 権限昇格: すでに侵害されたオペレーティングシステムカーネル(例:Linux)があれば、この問題によりハイパーバイザーレベル(ARM では EL1 -> EL2)への権限昇格が簡単に可能になります。ハイパーバイザーが管理するすべてのメモリを読み取りまたは書き込みできます。これにより、ハイパーバイザーが管理する異なるセキュリティドメインや仮想マシン(存在する場合、設定に依存)の分離が破られます。
    (関連情報:[An introduction to Access Control on Qualcomm Snapdragon Platforms])

  • セキュアブート: 市場に出回っているほとんどの Qualcomm デバイスは、ファームウェアの不正な変更を防ぐためにセキュアブートを利用しています。ファームウェアは暗号署名され、ブートチェーンによって検証されます。この問題により、改変されたオペレーティングシステムから(公式にサポートされている「ブートローダーアンロック」または別のエクスプロイトを介して)、ロードされたハイパーバイザーファームウェアを実行時に変更したり、完全に置き換えたりすることが可能です。
    (関連情報:[Qualcomm Secure Boot and Image Authentication Technical Overview (v1.0)] および (v2.0))

技術的背景

注記: この問題は元々、Qualcomm Snapdragon 410 (MSM8916) プラットフォームで発見されました。以下の説明の一部は MSM8916 に固有の場合があります。例えば:

  • 特定のメモリアドレス
  • 64 ビット ARM/AArch64 ファームウェア設計(一部の影響を受けるプラットフォームは 32 ビット ARM/AArch32 のみをサポート)

ただし、一般的な概念は影響を受けるすべてのプラットフォームに同様に適用されます。

ハイパーバイザー

ARMv8-A 64 ビットアーキテクチャは、4 つの特権レベル(「例外レベル」、EL)を定義しています。アプリケーション、オペレーティングシステムカーネル、ハイパーバイザーに通常使用される別々のレベルがあります:

AArch64 例外レベル

CPU は例外の発生中にレベル間を切り替えます。例えば、割り込みが到来した場合などです。また、ハイパーバイザーコール (hvc) などの特別な命令を使用して、一部のレベル間を切り替えることもできます。
(関連情報:[AArch64 Exception model])

ハイパーバイザーは、それぞれ独立したオペレーティングシステムカーネルを持つ 1 つまたは複数の仮想マシンをホストできます。各仮想マシンには、ステージ2変換 を使用して独自のメモリビューを提供できます。仮想マシンからのすべてのメモリアクセスは、2 つの変換ステージを通過します:最初のステージは(仮想)オペレーティングシステムが管理し、2 番目のステージはハイパーバイザーが管理します。ハイパーバイザーや他の仮想マシンが使用するメモリは、変換テーブルから省略することで隠すことができます。
(関連情報:[AArch64 virtualization], [AArch64 memory management])

Qualcomm のハイパーバイザーファームウェアは EL2 で実行され、ステージ2変換を使用して、EL1 で実行中のメインのオペレーティングシステムカーネル(通常は Linux)からハイパーバイザーメモリへのアクセスを禁止しています。この構成では、ステージ2変換は主にアドレス変換なしのメモリ保護に使用されることに注意してください。メインのオペレーティングシステムは、メモリマップド入出力 (MMIO) 空間内のほとんどのハードウェアコンポーネント(例:SD コントローラーやカメラサブシステム)に直接アクセスできます。ハイパーバイザー/EL2 (hyp) とセキュアモニター/EL3 (tz の一部) に属するメモリへのアクセスは制限されています:

Qualcomm ハイパーバイザーのメモリ保護(ステージ2変換を使用)

ブートリマッパー

ブートリマッパー は仮想化とは関係ありません:CPU コアの起動初期に必要です。このハードウェアプラットフォームでは、CPU コアは常にアドレス 0x0 から実行を開始します。ブートリマッパーは、CPU の周囲に組み込まれた追加のハードウェアコンポーネントであり、最初の 64 または 128 KiB (0x00000 - 0x20000) を設定可能なメモリ領域にリマップします。

デフォルトでは、ブートリマッパーはブート ROM(デバイス起動時に最初に実行されるコード)を指しています。その後、マッピングが変更され、他の CPU コアが RAM にロードされた EL3 ファームウェア(tz の一部)で直ちに実行を開始するようになります:

ブートリマッパー

CPU がアクセスするアドレス(tz 内)は、2 つの異なる物理アドレスを使用してアクセス可能になることに注目してください:RAM 内の実際のアドレス (0x8650xxxx) と、ブートリマッパーを使用したリマップ後のアドレス (0x0000xxxx) です。

実際には、ブートリマッパーには 2 つの別々のインスタンスがあります:

  • セキュア: セキュア状態で行われるメモリアクセスをリマップします。CPU は最初にセキュア状態 (EL3) で実行を開始するため、これは CPU 起動時に使用されるインスタンスです。APCS_BOOT_START_ADDR_SEC (= 0x0b010004) を使用して設定できますが、セキュア状態でのみ設定可能です。
  • 非セキュア: 非セキュア状態で行われるメモリアクセスをリマップします。非セキュア状態でも APCS_BOOT_START_ADDR_NSEC (= 0x0b010008) を使用して設定可能です。

両方のブートリマッパーインスタンスは、リマップ領域のベースアドレスと 2 つの設定ビットを含むメモリレジスタを使用して設定できます:REMAP_EN はリマップを有効にし、BOOT_128KB_EN は 64 KiB だけでなく最初の 128 KiB をリマップします。

(関連情報:[Qualcomm Snapdragon 410E Technical Reference Manual rev. D]、85 ページと 116 ページ)

概念

前の 2 つのセクションの知識を使えば、基本的なアイデアは単純です:ブートリマッパーを使用して、ハイパーバイザーのメモリ保護(ステージ2変換)をバイパスします。

ブートリマッパーは CPU 起動時にのみ機能するわけではありません。いつでも使用でき、リマップ領域への完全な読み取り/書き込み/実行アクセスを許可します。また、Qualcomm のハイパーバイザーは、影響を受けるデバイス上でオペレーティングシステムがブートリマッパーの非セキュアインスタンスを設定およびアクセスすることを防いでいないようです(ステージ2変換によって保護されていません)。したがって、この問題は次のように簡単に悪用できます:

  1. ブートリマッパーを、通常はステージ2変換によって保護されている任意のメモリ領域(例:アドレス 0x8640xxxx から始まるハイパーバイザーファームウェア hyp)を指すように設定し、
  2. ブートリマッパー(アドレス 0x0000xxxx)を介して読み取り/書き込みを行う。

CVE-2022-22063 の概念

リマップ領域は動的に(ブロック単位で)シフトでき、ブートリマッパーで利用可能な 64/128 KiB よりも大きなメモリ領域にアクセスできます。また、これを使用してハイパーバイザーのメモリ保護を完全に無効にすることも可能です(概念実証 を参照)。


注記: 同じエクスプロイトはセキュアワールドファームウェア (tz) には機能しません。ブートリマッパーはステージ2変換をバイパスできますが、DRAM 内の tz メモリ領域は、ブートリマッパーを通過した後のアクセスを遮断する追加のハードウェアコンポーネント(CPU の外部)によって保護されているようです:

EL3 ファームウェアに適用した CVE-2022-22063 の概念(機能しない)

tz メモリ領域はおそらくセキュア状態でのみアクセス可能です。このエクスプロイトでバイパスできるのはハイパーバイザーのメモリ保護のみであり、ハードウェアの他のセキュリティメカニズムは引き続き有効です。

概念実証

ブートリマッパーを使用すると、ファームウェアバージョンに関する知識なしに、元のハイパーバイザーファームウェアを実行時に完全に無効化して置き換えることができます。特に、変更される可能性のある変数や関数のメモリアドレスを取得するためにリバースエンジニアリングを使用する必要はありません。ハイパーバイザーファームウェアのおおよそのメモリ領域を知るだけで十分です。例えば、オープンソースの Linux コード内のメモリ予約から、またはハイパーバイザーファームウェアバイナリ(内部ストレージの hyp パーティションにあります)の ELF ヘッダーを読むことによって得られます。

一般的なアイデアは次のとおりです:

  1. ブートリマッパーを使用して、オペレーティングシステムからのハイパーバイザーコールを処理するコードを上書きします。
  2. ハイパーバイザーコール (hvc) を実行して、オペレーティングシステムからハイパーバイザーへ(EL1 から EL2 へ)切り替えます。
  3. シェルコードに、メモリ保護に使用されるステージ2変換を含むハイパーバイザーを完全に無効化させます。その後、EL1 に戻ります。
  4. これで、ハイパーバイザーメモリはブートリマッパーを経由せずに EL1 から直接アクセスできます。

これを実装するコードは長くはありませんが、低レベルの AArch64 アセンブリと CPU キャッシュの慎重な操作が必要です。しかし、主な疑問はまだ未解決です:コードを特定のハイパーバイザーファームウェアバージョンに依存させずに、シェルコードを正確にどこに書き込むべきでしょうか?

エントリアドレスの特定

ハイパーバイザーコール中(一般に任意の例外中)は、CPU の実行は特別なメモリアドレス、つまり 例外ベクター に強制的に移されます。例外ベクターは、現在の例外レベルまたは下位の例外レベルから発生するさまざまな種類の例外を処理するコードを含む、より大きな ベクターテーブル の一部です:

AArch64 ベクターテーブル

各ボックスは、32 個のアセンブリ命令を格納できる例外ベクターを表しています。この領域では不十分なため、通常は追加コードを置くためのより広い領域へジャンプする分岐命令が含まれます。

オフセットは、各例外レベルのベクターテーブルのベースアドレスを定義する ベクターベースアドレスレジスタ (VBAR) を基準にしています。ハイパーバイザーはベースアドレスを VBAR_EL2 CPU レジスタに書き込みます。

ハイパーバイザーコールは、下位の例外レベル(EL1 で実行中のオペレーティングシステムカーネルから EL2 のハイパーバイザーへ)から行われる同期例外です。したがって、オペレーティングシステムカーネルが 32 ビットモードで実行されている場合、CPU は VBAR_EL2+0x600 にジャンプし、64 ビットモードでは VBAR_EL2+0x400 にジャンプします。ブートリマッパーを使用してこのアドレスにカスタムコードを書き込み、ハイパーバイザーコールを行うと、CPU はシェルコードの実行を開始します。

ツールをダウンロード