mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Add content from: eSIM security
This commit is contained in:
parent
fe6cf11722
commit
753e9f9d55
@ -76,6 +76,7 @@
|
|||||||
# 🧙♂️ Generic Hacking
|
# 🧙♂️ Generic Hacking
|
||||||
|
|
||||||
- [Brute Force - CheatSheet](generic-hacking/brute-force.md)
|
- [Brute Force - CheatSheet](generic-hacking/brute-force.md)
|
||||||
|
- [Esim Javacard Exploitation](generic-hacking/esim-javacard-exploitation.md)
|
||||||
- [Exfiltration](generic-hacking/exfiltration.md)
|
- [Exfiltration](generic-hacking/exfiltration.md)
|
||||||
- [Reverse Shells (Linux, Windows, MSFVenom)](generic-hacking/reverse-shells/README.md)
|
- [Reverse Shells (Linux, Windows, MSFVenom)](generic-hacking/reverse-shells/README.md)
|
||||||
- [MSFVenom - CheatSheet](generic-hacking/reverse-shells/msfvenom.md)
|
- [MSFVenom - CheatSheet](generic-hacking/reverse-shells/msfvenom.md)
|
||||||
|
89
src/generic-hacking/esim-javacard-exploitation.md
Normal file
89
src/generic-hacking/esim-javacard-exploitation.md
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
# eSIM / Java Card VM Exploitation
|
||||||
|
|
||||||
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Embedded SIMs (eSIMs) are implemented as **Embedded UICC (eUICC)** smart-cards that run a **Java Card Virtual Machine (JC VM)** on top of a secure element.
|
||||||
|
Because profiles and applets can be provisioned *over-the-air* (OTA) via Remote SIM Provisioning (RSP), any memory-safety flaw inside the JC VM instantly becomes a remote code-execution primitive **inside the most privileged component of the handset**.
|
||||||
|
|
||||||
|
This page describes a real-world full compromise of Kigen’s eUICC (Infineon SLC37 ESA1M2, ARM SC300) caused by missing type-safety checks in the `getfield` and `putfield` bytecodes. The same technique can be re-used against other vendors that omit on-card byte-code verification.
|
||||||
|
|
||||||
|
## Attack Surface
|
||||||
|
1. **Remote Application Management (RAM)**
|
||||||
|
eSIM profiles may embed arbitrary Java Card applets. Provisioning is performed with standard APDUs that can be tunnelled through SMS-PP (Short Message Service Point-to-Point) or HTTPS. If an attacker owns (or steals) the **RAM keys** for a profile, they can `INSTALL`/`LOAD` a malicious applet remotely.
|
||||||
|
2. **Java Card byte-code execution**
|
||||||
|
After installation, the applet executes inside the VM. Missing run-time checks allow memory corruption.
|
||||||
|
|
||||||
|
## The Type-Confusion Primitive
|
||||||
|
`getfield` / `putfield` are supposed to operate only on **object references**. In Kigen eUICC the instructions never validate whether the operand on the stack is an *object* or an *array* reference. Because an `array.length` word lives at the exact same offset as the first instance field of a normal object, an attacker can:
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
```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 ...
|
||||||
|
```
|
||||||
|
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** – Use undocumented `GET DATA` item `DF1F`:
|
||||||
|
```
|
||||||
|
80 CA DF 1F 00 // → "ECu10.13" (vulnerable)
|
||||||
|
```
|
||||||
|
2. **Install malicious applet OTA** – Abuse publicly-known keys of the TS.48 Generic Test Profile and push SMS-PP fragments that transport the CAP file (`LOAD`) followed by an `INSTALL`:
|
||||||
|
```
|
||||||
|
// simplified APDU chain
|
||||||
|
80 E6 02 00 <data> // LOAD (block n)
|
||||||
|
80 E6 0C 00 <data> // INSTALL for load
|
||||||
|
```
|
||||||
|
3. **Trigger type-confusion** – When the applet is selected it performs the write-what-where to hijack a pointer table and leak memory through normal APDU responses.
|
||||||
|
4. **Extract GSMA certificate key** – Private EC key is copied to the applet’s RAM and returned in chunks.
|
||||||
|
5. **Impersonate the eUICC** – The stolen key pair + certificates let the attacker authenticate to *any* RSP server as a legitimate card (EID binding may still be required for some operators).
|
||||||
|
6. **Download and modify profiles** – Plaintext profiles contain highly sensitive fields such as `OPc`, `AMF`, OTA keys and even additional applets. The attacker can:
|
||||||
|
* 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
|
||||||
|
Installing the same profile on **PHONE A** and **PHONE B** results in the Mobile Switching Centre routing incoming traffic to whichever device most recently registered. One session of Gmail 2FA SMS interception is enough to bypass MFA for the victim.
|
||||||
|
|
||||||
|
## Automated Test & Exploit Toolkit
|
||||||
|
The researchers released an internal tool with a `bsc` (*Basic Security Check*) command that immediately shows whether a Java Card VM is vulnerable:
|
||||||
|
```
|
||||||
|
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]
|
||||||
|
```
|
||||||
|
Modules shipped with the framework:
|
||||||
|
* `introspector` – full VM and memory explorer (~1.7 MB Java)
|
||||||
|
* `security-test` – generic verification bypass applet (~150 KB)
|
||||||
|
* `exploit` – 100 % reliable Kigen eUICC compromise (~72 KB)
|
||||||
|
|
||||||
|
## Mitigations
|
||||||
|
1. **On-card byte-code verification** – enforce full control-flow & data-flow type tracking instead of stack-top only.
|
||||||
|
2. **Hide array header** – place `length` outside of overlapping object fields.
|
||||||
|
3. **Harden RAM keys policy** – never ship profiles with public keys; disable `INSTALL` in test profiles (addressed in GSMA TS.48 v7).
|
||||||
|
4. **RSP server side heuristics** – rate-limit profile downloads per EID, monitor geographic anomalies, validate certificate freshness.
|
||||||
|
|
||||||
|
## Quick Checklist for Pentesters
|
||||||
|
* Query `GET DATA DF1F` – vulnerable firmware string `ECu10.13` indicates Kigen.
|
||||||
|
* Check if RAM keys are known ‑> attempt OTA `INSTALL`/`LOAD`.
|
||||||
|
* After applet installation, brute-force simple cast primitive (`objarrconfusion`).
|
||||||
|
* Try to read Security Domain private keys – success = full compromise.
|
||||||
|
|
||||||
|
## References
|
||||||
|
- [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