eSIM / Java Card VM Exploitation
Reading time: 6 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Panoramica
Le SIM incorporate (eSIM) sono implementate come Embedded UICC (eUICC) smart-card che eseguono una Java Card Virtual Machine (JC VM) su un elemento sicuro. Poiché i profili e gli applet possono essere forniti over-the-air (OTA) tramite Remote SIM Provisioning (RSP), qualsiasi difetto di sicurezza della memoria all'interno della JC VM diventa istantaneamente un primitivo di esecuzione di codice remoto all'interno del componente più privilegiato del dispositivo.
Questa pagina descrive un compromesso completo nel mondo reale dell'eUICC di Kigen (Infineon SLC37 ESA1M2, ARM SC300) causato dalla mancanza di controlli di sicurezza dei tipi nei bytecode getfield
e putfield
. La stessa tecnica può essere riutilizzata contro altri fornitori che omettono la verifica del bytecode sulla scheda.
Superficie di attacco
- Gestione remota delle applicazioni (RAM)
I profili eSIM possono incorporare applet Java Card arbitrarie. La fornitura viene eseguita con APDU standard che possono essere incapsulate tramite SMS-PP (Short Message Service Point-to-Point) o HTTPS. Se un attaccante possiede (o ruba) le chiavi RAM per un profilo, può
INSTALL
/LOAD
un applet malevolo da remoto. - Esecuzione del bytecode Java Card Dopo l'installazione, l'applet viene eseguito all'interno della VM. La mancanza di controlli di runtime consente la corruzione della memoria.
Il primitivo di confusione dei tipi
getfield
/ putfield
dovrebbero operare solo su riferimenti a oggetti. Nell'eUICC di Kigen, le istruzioni non convalidano mai se l'operando nello stack è un oggetto o un riferimento a un array. Poiché una parola array.length
si trova esattamente allo stesso offset del primo campo di istanza di un oggetto normale, un attaccante può:
- Creare un array di byte
byte[] buf = new byte[0x100];
- Castarlo a
Object o = (Object)buf;
- Usare
putfield
per sovrascrivere qualsiasi valore a 16 bit all'interno di un oggetto adiacente (inclusi VTABLE / voci di traduzione ptr). - Usare
getfield
per leggere memoria arbitraria una volta che i puntatori interni sono stati compromessi.
// 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 ...
Il primitivo fornisce lettura / scrittura arbitraria nello spazio degli indirizzi eUICC – sufficiente per estrarre la chiave ECC privata unica del dispositivo che autentica la scheda nell'ecosistema GSMA.
Flusso di lavoro di sfruttamento end-to-end
- Enumerare il firmware – Utilizzare l'elemento
GET DATA
non documentatoDF1F
:
80 CA DF 1F 00 // → "ECu10.13" (vulnerabile)
- Installare l'applet malevolo OTA – Abusare delle chiavi pubblicamente note del profilo di test generico TS.48 e inviare frammenti SMS-PP che trasportano il file CAP (
LOAD
) seguito da unINSTALL
:
// catena APDU semplificata
80 E6 02 00 <data> // LOAD (blocco n)
80 E6 0C 00 <data> // INSTALL per il caricamento
- Attivare la confusione di tipo – Quando l'applet viene selezionato, esegue il write-what-where per dirottare una tabella di puntatori e rivelare la memoria attraverso le normali risposte APDU.
- Estrarre la chiave del certificato GSMA – La chiave EC privata viene copiata nella RAM dell'applet e restituita in blocchi.
- Impersonare l'eUICC – La coppia di chiavi rubate + certificati consente all'attaccante di autenticarsi a qualsiasi server RSP come una scheda legittima (il binding EID potrebbe essere ancora richiesto per alcuni operatori).
- Scaricare e modificare i profili – I profili in testo semplice contengono campi altamente sensibili come
OPc
,AMF
, chiavi OTA e persino applet aggiuntivi. L'attaccante può:
- Clonare un profilo su un secondo eUICC (dirottamento voce/SMS);
- Patchare le applicazioni Java Card (ad es. inserire spyware STK) prima di ricaricarle;
- Estrarre segreti dell'operatore per abusi su larga scala.
Dimostrazione di clonazione / dirottamento
Installare lo stesso profilo su PHONE A e PHONE B porta il Mobile Switching Centre a instradare il traffico in arrivo verso il dispositivo che si è registrato più recentemente. Una sessione di intercettazione SMS 2FA di Gmail è sufficiente per bypassare la MFA per la vittima.
Toolkit di test e sfruttamento automatizzato
I ricercatori hanno rilasciato uno strumento interno con un comando bsc
(Basic Security Check) che mostra immediatamente se una VM Java Card è vulnerabile:
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]
Moduli forniti con il framework:
introspector
– esploratore completo di VM e memoria (~1.7 MB Java)security-test
– applet generico di verifica bypass (~150 KB)exploit
– compromissione Kigen eUICC 100 % affidabile (~72 KB)
Mitigazioni
- Verifica del byte-code sulla scheda – applicare il tracciamento completo del flusso di controllo e del flusso di dati invece di solo quello in cima allo stack.
- Nascondere l'intestazione dell'array – posizionare
length
al di fuori dei campi oggetto sovrapposti. - Rafforzare la politica delle chiavi RAM – non spedire mai profili con chiavi pubbliche; disabilitare
INSTALL
nei profili di test (trattato in GSMA TS.48 v7). - Euristiche lato server RSP – limitare il numero di download dei profili per EID, monitorare anomalie geografiche, convalidare la freschezza del certificato.
Checklist Rapida per Pentester
- Query
GET DATA DF1F
– la stringa firmware vulnerabileECu10.13
indica Kigen. - Controllare se le chiavi RAM sono conosciute ‑> tentare
INSTALL
/LOAD
OTA. - Dopo l'installazione dell'applet, forzare la lettura di un semplice cast primitivo (
objarrconfusion
). - Provare a leggere le chiavi private del Security Domain – successo = compromissione totale.
Riferimenti
- Security Explorations – eSIM security
- GSMA TS.48 Generic Test Profile v7.0
- Java Card VM Specification 3.1
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.