# eSIM / Java Card VM Exploitation {{#include ../banners/hacktricks-training.md}} ## 概述 嵌入式SIM(eSIM)作为**嵌入式UICC(eUICC)**智能卡实现,运行在安全元件上的**Java Card虚拟机(JC VM)**上。由于配置文件和小程序可以通过远程SIM配置(RSP)*空中*(OTA)进行配置,因此JC VM内部的任何内存安全缺陷瞬间成为**手机最特权组件内部的远程代码执行原语**。 本页面描述了由于`getfield`和`putfield`字节码中缺少类型安全检查而导致的Kigen的eUICC(Infineon SLC37 ESA1M2,ARM SC300)的真实世界完全妥协。相同的技术可以在其他省略卡上字节码验证的供应商中重用。 ## 攻击面 1. **远程应用管理(RAM)** eSIM配置文件可以嵌入任意Java Card小程序。配置通过标准APDU进行,可以通过SMS-PP(短消息服务点对点)或HTTPS进行隧道传输。如果攻击者拥有(或窃取)配置文件的**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 / ptr翻译条目)。 4. 一旦内部指针被劫持,使用`getfield`读取*任意*内存。 ```java // Pseudo-bytecode sequence executed by the malicious applet // buf = newarray byte 0x100 // o = (Object) buf // illegal but not verified // putfield , 0xCAFE // arbitrary write // ... set up read-what-where gadgets ... ``` 该原语提供了**任意读取/写入**eUICC地址空间的能力——足以转储设备唯一的ECC私钥,该密钥用于验证卡片与GSMA生态系统的连接。 ## 端到端利用工作流程 1. **枚举固件** – 使用未记录的`GET DATA`项`DF1F`: ``` 80 CA DF 1F 00 // → "ECu10.13" (易受攻击) ``` 2. **OTA安装恶意applet** – 滥用TS.48通用测试配置文件的公开已知密钥,并推送传输CAP文件的SMS-PP片段(`LOAD`)后跟`INSTALL`: ``` // 简化的APDU链 80 E6 02 00 // LOAD (块 n) 80 E6 0C 00 // INSTALL for load ``` 3. **触发类型混淆** – 当选择applet时,它执行写入-什么-在哪里操作以劫持指针表,并通过正常的APDU响应泄露内存。 4. **提取GSMA证书密钥** – 私有EC密钥被复制到applet的RAM中并分块返回。 5. **冒充eUICC** – 被盗的密钥对+证书使攻击者能够作为合法卡片向*任何*RSP服务器进行身份验证(某些运营商可能仍需EID绑定)。 6. **下载和修改配置文件** – 明文配置文件包含高度敏感的字段,如`OPc`、`AMF`、OTA密钥甚至额外的applet。攻击者可以: * 将配置文件克隆到第二个eUICC(语音/SMS劫持); * 在重新上传之前修补Java Card应用程序(例如,插入STK间谍软件); * 提取运营商秘密以进行大规模滥用。 ## 克隆/劫持演示 在**PHONE A**和**PHONE B**上安装相同的配置文件会导致移动交换中心将传入流量路由到最近注册的设备。一次Gmail 2FA SMS拦截会话足以绕过受害者的多因素身份验证。 ## 自动化测试与利用工具包 研究人员发布了一个内部工具,带有`bsc`(*基本安全检查*)命令,可以立即显示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` – 完整的虚拟机和内存探索器 (~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}}