eSIM / Java Card VM Exploitation

Reading time: 9 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

概要

組み込みSIM(eSIM)は、Embedded UICC (eUICC) スマートカードとして実装され、セキュアエレメント上で**Java Card Virtual Machine (JC VM)**を実行します。プロファイルやアプレットは、リモートSIMプロビジョニング(RSP)を介してオーバー・ザ・エア(OTA)でプロビジョニングできるため、JC VM内のメモリ安全性の欠陥は、ハンドセットの最も特権のあるコンポーネント内でのリモートコード実行のプリミティブになります。

このページでは、getfieldおよびputfieldバイトコードの型安全性チェックが欠如していることによって引き起こされたKigenのeUICC(Infineon SLC37 ESA1M2、ARM SC300)の実際の完全なコンプロマイズについて説明します。同じ技術は、カード上のバイトコード検証を省略する他のベンダーに対して再利用できます。

攻撃面

  1. リモートアプリケーション管理(RAM) eSIMプロファイルは、任意のJava Cardアプレットを埋め込むことができます。プロビジョニングは、SMS-PP(ショートメッセージサービスポイントツーポイント)またはHTTPSを介してトンネリングできる標準APDUで行われます。攻撃者がプロファイルのRAMキーを所有(または盗む)場合、悪意のあるアプレットをリモートでINSTALL/LOADできます。
  2. Java Cardバイトコード実行 インストール後、アプレットはVM内で実行されます。ランタイムチェックが欠如しているため、メモリ破損が発生します。

型混乱プリミティブ

getfield / putfieldは、オブジェクト参照のみに対して操作することになっています。Kigen eUICCでは、命令はスタック上のオペランドがオブジェクトまたは配列参照であるかどうかを検証しません。array.lengthワードは、通常のオブジェクトの最初のインスタンスフィールドと正確に同じオフセットに存在するため、攻撃者は以下を行うことができます:

  1. バイト配列を作成する byte[] buf = new byte[0x100];
  2. それをキャストする Object o = (Object)buf;
  3. putfieldを使用して、隣接するオブジェクト内の任意の16ビット値を上書きする(VTABLE / ポインタ変換エントリを含む)。
  4. 内部ポインタがハイジャックされた後、getfieldを使用して任意のメモリを読み取る。
java
// Pseudo-bytecode sequence executed by the malicious applet
// buf = newarray byte 0x100
// o   = (Object) buf            // illegal but not verified
// putfield <victimObject+offset>, 0xCAFE // arbitrary write
// ... set up read-what-where gadgets ...

プリミティブは、eUICC アドレス空間で 任意の読み取り/書き込み を提供します。これは、カードを GSMA エコシステムに認証するデバイス固有の ECC プライベートキーをダンプするのに十分です。

エンドツーエンドのエクスプロイトワークフロー

  1. ファームウェアの列挙 – 文書化されていない GET DATA アイテム DF1F を使用します:
80 CA DF 1F 00   // → "ECu10.13" (脆弱)
  1. 悪意のあるアプレットを OTA でインストール – TS.48 Generic Test Profile の公知のキーを悪用し、CAP ファイルを運ぶ SMS-PP フラグメントをプッシュして INSTALL を続けます:
// 簡略化された APDU チェーン
80 E6 02 00 <data>   // LOAD (ブロック n)
80 E6 0C 00 <data>   // LOAD 用の INSTALL
  1. 型混乱を引き起こす – アプレットが選択されると、ポインタテーブルをハイジャックし、通常の APDU 応答を通じてメモリを漏洩させるために write-what-where を実行します。
  2. GSMA 証明書キーを抽出 – プライベート EC キーがアプレットの RAM にコピーされ、チャンクで返されます。
  3. eUICC を偽装 – 盗まれたキー ペア + 証明書により、攻撃者は 任意の RSP サーバーに正当なカードとして認証できます(いくつかのオペレーターには EID バインディングがまだ必要な場合があります)。
  4. プロファイルのダウンロードと変更 – プレーンテキストプロファイルには、OPcAMF、OTA キー、さらには追加のアプレットなどの非常に機密性の高いフィールドが含まれています。攻撃者は以下を行うことができます:
  • プロファイルを第二の eUICC にクローンする(音声/SMS ハイジャック);
  • 再アップロードする前に Java Card アプリケーションをパッチする(例:STK スパイウェアを挿入);
  • 大規模な悪用のためにオペレーターの秘密を抽出する。

クローン/ハイジャックデモンストレーション

PHONE APHONE B に同じプロファイルをインストールすると、モバイルスイッチングセンターは、最近登録されたデバイスに着信トラフィックをルーティングします。Gmail 2FA SMS の傍受の 1 セッションで、被害者の MFA をバイパスするのに十分です。

自動テスト & エクスプロイトツールキット

研究者は、Java Card VM が脆弱かどうかを即座に示す bsc (Basic Security Check) コマンドを持つ内部ツールを公開しました:

scard> bsc
- castcheck        [arbitrary int/obj casts]
- ptrgranularity   [pointer granularity/tr table presence]
- locvaraccess     [local variable access]
- stkframeaccess   [stack frame access]
- instfieldaccess  [instance field access]
- objarrconfusion  [object/array size field confusion]

フレームワークに同梱されたモジュール:

  • introspector – 完全なVMおよびメモリエクスプローラー (~1.7 MB Java)
  • security-test – 一般的な検証バイパスアプレット (~150 KB)
  • exploit – 100 % 信頼できるKigen eUICC妥協 (~72 KB)

緩和策

  1. カード上のバイトコード検証 – スタックトップのみではなく、完全な制御フローとデータフローの型追跡を強制する。
  2. 配列ヘッダーの隠蔽lengthを重複するオブジェクトフィールドの外に配置する。
  3. RAMキー政策の強化 – 公開鍵を含むプロファイルを出荷しない; テストプロファイルでINSTALLを無効にする(GSMA TS.48 v7で対処済み)。
  4. RSPサーバー側のヒューリスティック – EIDごとにプロファイルダウンロードのレート制限、地理的異常の監視、証明書の新鮮さの検証。

ペンテスターのためのクイックチェックリスト

  • GET DATA DF1Fをクエリ – 脆弱なファームウェア文字列ECu10.13はKigenを示す。
  • RAMキーが知られているか確認 ‑> OTA INSTALL/LOADを試みる。
  • アプレットインストール後、単純なキャストプリミティブ(objarrconfusion)をブルートフォースする。
  • セキュリティドメインの秘密鍵を読み取ろうとする – 成功 = 完全な妥協。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする