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)。由于配置文件和 applets 可以通过 Remote SIM Provisioning (RSP) 以 over-the-air (OTA) 方式下发,JC VM 内的任何内存安全漏洞都会立即成为一个远程代码执行原语 在手机最特权的组件内部

本页描述了一个真实世界的对 Kigen 的 eUICC (Infineon SLC37 ESA1M2, ARM SC300) 的完全入侵,原因是 getfieldputfield 字节码中缺失类型安全检查。相同技术可用于针对其他省略卡上字节码验证的厂商。

攻击面

  1. Remote Application Management (RAM)
    eSIM 配置文件可以嵌入任意 Java Card applets。配置使用标准 APDUs 执行,可通过 SMS-PP (Short Message Service Point-to-Point) 或 HTTPS 隧道传输。如果攻击者拥有(或窃取)某个配置文件的 RAM keys,则他们可以远程 INSTALL/LOAD 恶意 applet。
  2. Java Card byte-code execution
    安装后,applet 在 VM 内执行。缺失的运行时检查允许内存损坏。

2024–2025 生态变化

  • GSMA TS.48 v7.0 (18 Jun 2025) 从 Generic Test Profile 中移除了公共 RAM keysets,并阻止 INSTALL,除非提供了随机化 keys;已缓存的 v≤6 配置文件仍暴露静态 RAM keys 并且仍可被利用。
  • GSMA AN‑2025‑07 (09 Jul 2025) recommends on-card bytecode verification;大多数 eUICCs 仍跳过完整验证,因此 VM 的内存 bug 在 applet 安装后仍可被触及。
  • Kigen OTA hardening (Jul 2025) 在遗留 TS.48 测试配置文件处于激活状态时阻止 applet 加载并添加运行时检查,但未打补丁的设备仍然易受攻击。

The Type-Confusion Primitive

getfield / putfield 应只在 对象引用 上操作。在 Kigen eUICC 中,这些指令从不验证栈上的操作数是 object 还是 array 引用。因为 array.length 字段与普通对象的第一个实例字段位于完全相同的偏移量,攻击者可以:

  1. 创建一个字节数组 byte[] buf = new byte[0x100];
  2. 将其强制转换为 Object o = (Object)buf;
  3. 使用 putfield 覆盖相邻对象内部的 any 16-bit 值(包括 VTABLE / ptr translation entries)。
  4. 使用 getfield 在内部指针被劫持后读取 arbitrary 内存。
// 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 地址空间中提供 arbitrary read / write — 足以转储用于向 GSMA 生态系统认证卡片的设备唯一 ECC 私钥。

End-to-End Exploitation Workflow

  1. 枚举固件 – 使用未记录的 GET DATADF1F
80 CA DF 1F 00   // → "ECu10.13" (vulnerable)
  1. Install malicious applet OTA – 滥用 TS.48 Generic Test Profile 的公开已知密钥,推送传输 CAP 文件(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 – 私有 EC 密钥被复制到 applet 的 RAM 中并以分块方式返回。
  3. Impersonate the eUICC – 被窃取的密钥对 + 证书使攻击者能够作为合法卡向 any RSP 服务器进行认证(对某些运营商仍可能需要 EID 绑定)。
  4. Download and modify profiles – 明文配置文件包含高度敏感的字段,例如 OPcAMF、OTA keys 甚至额外的 applet。攻击者可以:
  • 将配置文件克隆到第二个 eUICC(voice/SMS hijack);
  • 修改 Java Card 应用(例如在重新上传前插入 STK spyware);
  • 提取运营商秘密以进行大规模滥用。

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 – 通用的验证绕过 applet (~150 KB)
  • exploit – 100% 可靠的 Kigen eUICC 完全妥协 (~72 KB)

缓解措施

  1. On-card byte-code verification – 强制进行完整的控制流 & 数据流类型跟踪,而不是仅对栈顶进行检查。
  2. Hide array header – 将 length 放置在重叠对象字段之外。
  3. Harden RAM keys policy – 永远不要随出厂 profile 发送包含公钥;在测试 profile 中禁用 INSTALL(TS.48 v7 移除了 RAM keysets)。
  4. RSP server side heuristics – 对每个 EID 限速 profile 下载,监控地理异常,验证证书的新鲜度。
  5. Keep devices off legacy test profiles – 应用 2025 年 7 月的 OTA 补丁以阻止 TS.48 v≤6 的 applet 加载,或从出厂镜像中移除测试 profile。

Quick Checklist for Pentesters

  • Query GET DATA DF1F – vulnerable firmware string ECu10.13 indicates Kigen.
  • Inspect loaded profiles: TS.48 test profiles with static RAM keys (v≤6) are directly exploitable; v7 without RAM keys need a new key leak.
  • Check if RAM keys are known ‑> attempt OTA INSTALL/LOAD.
  • After applet installation, brute-force simple cast primitive (objarrconfusion).
  • 尝试读取 Security Domain 的 private keys – 成功 = 完全妥协。

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