eSIM / Java Card VM Exploitation

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をサポートする

概要

Embedded SIMs (eSIMs) は、セキュアエレメント上で Embedded UICC (eUICC) のスマートカードとして実装され、Java Card Virtual Machine (JC VM) を実行します。
プロファイルやアプレットは Remote SIM Provisioning (RSP) を介して over-the-air (OTA) でプロビジョニングできるため、JC VM 内のメモリ安全性の欠陥は即座に携帯機器の最も特権の高いコンポーネント内での remote code-execution primitive になります。

このページは、Kigen の eUICC (Infineon SLC37 ESA1M2, ARM SC300) における、getfieldputfield バイトコードでの型安全チェック欠如によって発生した実際の完全侵害を説明します。同じ手法は、オンカードのバイトコード検証を省略している他ベンダーにも再利用可能です。

Attack Surface

  1. Remote Application Management (RAM)
    eSIM プロファイルは任意の Java Card アプレットを埋め込めます。プロビジョニングは標準の APDUs で行われ、SMS-PP (Short Message Service Point-to-Point) や HTTPS を経由してトンネリングできます。攻撃者がプロファイルの RAM keys を所持(または盗用)していれば、遠隔から INSTALL/LOAD して悪意のあるアプレットを導入できます。
  2. Java Card byte-code execution
    インストール後、アプレットは VM 内で実行されます。ランタイムチェックが欠如しているとメモリ破壊が発生します。

2024–2025 ecosystem changes

  • GSMA TS.48 v7.0 (18 Jun 2025) は Generic Test Profile から公開 RAM keysets を削除し、ランダム化されたキーが提供されない限り INSTALL をブロックします;ただしキャッシュされた v≤6 のプロファイルは静的な RAM keys を依然として公開しており、引き続き悪用可能です。
  • GSMA AN‑2025‑07 (09 Jul 2025) はオンカードのバイトコード検証を推奨しています;ほとんどの eUICCs はまだ完全な検証を省略しているため、アプレットインストール後も VM のメモリバグへの到達は可能です。
  • Kigen OTA hardening (Jul 2025) はレガシーな TS.48 テストプロファイルが有効な場合のアプレットロードをブロックし、ランタイムチェックを追加しましたが、未修正デバイスは依然として脆弱です。

The Type-Confusion Primitive

getfield / putfield は本来 object references に対してのみ動作するはずです。Kigen eUICC ではこれらの命令はスタック上のオペランドが objectarray 参照かを検証しません。array.length ワードは通常オブジェクトの最初のインスタンスフィールドとまったく同じオフセットに存在するため、攻撃者は次のことができます:

  1. Create a byte-array byte[] buf = new byte[0x100];
  2. Cast it to Object o = (Object)buf;
  3. Use putfield to overwrite any 16-bit value inside an adjacent object (including VTABLE / ptr translation entries).
  4. Use getfield to read arbitrary memory once internal pointers are hijacked.
// 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 ...

The primitive provides arbitrary read / write in the eUICC address space – enough to dump the device-unique ECC private key that authenticates the card to the GSMA ecosystem.

End-to-End Exploitation Workflow

  1. Enumerate firmware – 未公開の GET DATA アイテム DF1F を使用:
80 CA DF 1F 00   // → "ECu10.13" (vulnerable)
  1. Install malicious applet OTA – TS.48 Generic Test Profile の公知鍵を悪用し、CAP file(LOAD)を運ぶ SMS-PP フラグメントを送り、その後に INSTALL を行う:
// simplified APDU chain
80 E6 02 00 <data>   // LOAD (block n)
80 E6 0C 00 <data>   // INSTALL for load
  1. Trigger type-confusion – applet が選択されると write-what-where を実行してポインタテーブルをハイジャックし、通常の APDU レスポンスを通じてメモリを leak する。
  2. Extract GSMA certificate key – Private EC key が applet の RAM にコピーされ、チャンクで返される。
  3. Impersonate the eUICC – 盗まれた鍵ペアと証明書により、攻撃者は任意の RSP server に正当なカードとして認証できる(事業者によっては EID binding が引き続き必要な場合あり)。
  4. Download and modify profiles – 平文プロファイルには OPcAMF、OTA keys、さらには追加の applets といった機微なフィールドが含まれる。攻撃者は:
  • Clone a profile to a second eUICC (voice/SMS hijack);
  • Patch Java Card applications (e.g. insert STK spyware) before re-uploading;
  • Extract operator secrets for large-scale abuse.

Cloning / Hijacking Demonstration

同じプロファイルを PHONE APHONE B にインストールすると、Mobile Switching Centre は最も最近登録したデバイスへ着信トラフィックをルーティングする。Gmail 2FA SMS を一度傍受するだけで被害者の MFA を回避できる。

Automated Test & Exploit Toolkit

研究者らは bsc (Basic Security Check) コマンドを備えた内部ツールを公開しており、これにより Java Card VM が脆弱かどうかを即座に表示する。

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. On-card byte-code verification – スタックトップのみではなく、完全な制御フローおよびデータフローの型追跡を強制する。
  2. Hide array header – オーバーラップするオブジェクトフィールドの外側に length を配置する。
  3. Harden RAM keys policy – 公開鍵を含むプロファイルを出荷しないこと。テストプロファイルでは INSTALL を無効化する(TS.48 v7 は RAM keysets を削除する)。
  4. RSP server side heuristics – EID ごとのプロファイルダウンロードをレート制限し、地理的異常を監視し、証明書の有効性を検証する。
  5. Keep devices off legacy test profiles – TS.48 v≤6 でアプレットの読み込みをブロックする 2025年7月の OTA を適用するか、出荷イメージからテストプロファイルを削除する。

Pentesters向けクイックチェックリスト

  • GET DATA DF1F を問い合わせる – 脆弱なファームウェア文字列 ECu10.13 は Kigen を示す。
  • 読み込まれたプロファイルを検査: 静的 RAM keys を持つ TS.48 テストプロファイル (v≤6) は直接利用可能;RAM keys がない v7 は新しいキーの leak が必要。
  • RAM keys が既知か確認 ‑> OTA INSTALL/LOAD を試みる。
  • applet インストール後、brute-force で simple cast primitive (objarrconfusion) を試す。
  • Security Domain の秘密鍵を読み取れるか試す – 成功 = 完全な侵害。

References

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をサポートする