mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/esim-javacard-exploitation.md'] to ja
This commit is contained in:
parent
880d03d9f5
commit
a925d3d533
@ -77,6 +77,7 @@
|
||||
# 🧙♂️ Generic Hacking
|
||||
|
||||
- [Brute Force - CheatSheet](generic-hacking/brute-force.md)
|
||||
- [Esim Javacard Exploitation](generic-hacking/esim-javacard-exploitation.md)
|
||||
- [Exfiltration](generic-hacking/exfiltration.md)
|
||||
- [Reverse Shells (Linux, Windows, MSFVenom)](generic-hacking/reverse-shells/README.md)
|
||||
- [MSFVenom - CheatSheet](generic-hacking/reverse-shells/msfvenom.md)
|
||||
|
87
src/generic-hacking/esim-javacard-exploitation.md
Normal file
87
src/generic-hacking/esim-javacard-exploitation.md
Normal file
@ -0,0 +1,87 @@
|
||||
# eSIM / Java Card VM Exploitation
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## 概要
|
||||
組み込み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" (脆弱)
|
||||
```
|
||||
2. **悪意のあるアプレットを 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
|
||||
```
|
||||
3. **型混乱を引き起こす** – アプレットが選択されると、ポインタテーブルをハイジャックし、通常の APDU 応答を通じてメモリを漏洩させるために write-what-where を実行します。
|
||||
4. **GSMA 証明書キーを抽出** – プライベート EC キーがアプレットの RAM にコピーされ、チャンクで返されます。
|
||||
5. **eUICC を偽装** – 盗まれたキー ペア + 証明書により、攻撃者は *任意の* RSP サーバーに正当なカードとして認証できます(いくつかのオペレーターには EID バインディングがまだ必要な場合があります)。
|
||||
6. **プロファイルのダウンロードと変更** – プレーンテキストプロファイルには、`OPc`、`AMF`、OTA キー、さらには追加のアプレットなどの非常に機密性の高いフィールドが含まれています。攻撃者は以下を行うことができます:
|
||||
* プロファイルを第二の eUICC にクローンする(音声/SMS ハイジャック);
|
||||
* 再アップロードする前に Java Card アプリケーションをパッチする(例:STK スパイウェアを挿入);
|
||||
* 大規模な悪用のためにオペレーターの秘密を抽出する。
|
||||
|
||||
## クローン/ハイジャックデモンストレーション
|
||||
**PHONE A** と **PHONE 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`)をブルートフォースする。
|
||||
* セキュリティドメインの秘密鍵を読み取ろうとする – 成功 = 完全な妥協。
|
||||
|
||||
## 参考文献
|
||||
- [Security Explorations – eSIM security](https://security-explorations.com/esim-security.html)
|
||||
- [GSMA TS.48 Generic Test Profile v7.0](https://www.gsma.com/get-involved/working-groups/gsma_resources/ts-48-v7-0-generic-euicc-test-profile-for-device-testing/)
|
||||
- [Java Card VM Specification 3.1](https://docs.oracle.com/en/java/javacard/3.1/jc-vm-spec/F12650_05.pdf)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
Loading…
x
Reference in New Issue
Block a user