# eSIM / Java Card VM Eksploatacija {{#include ../banners/hacktricks-training.md}} ## Pregled Ugrađene SIM kartice (eSIM) se implementiraju kao **Ugrađene UICC (eUICC)** pametne kartice koje pokreću **Java Card Virtual Machine (JC VM)** na vrhu sigurnog elementa. Zato što se profili i aplikacije mogu obezbediti *preko vazduha* (OTA) putem Daljinskog SIM Obezbeđenja (RSP), svaka greška u bezbednosti memorije unutar JC VM odmah postaje primitivna metoda za izvršavanje koda **unutar najprivilegovanijeg dela uređaja**. Ova stranica opisuje stvarno potpuno kompromitovanje Kigen-ove eUICC (Infineon SLC37 ESA1M2, ARM SC300) uzrokovano nedostatkom provere tipa u `getfield` i `putfield` bajtkodovima. Ista tehnika se može ponovo koristiti protiv drugih dobavljača koji izostavljaju verifikaciju bajtkoda na kartici. ## Površina napada 1. **Upravljanje daljinskim aplikacijama (RAM)** eSIM profili mogu sadržati proizvoljne Java Card aplikacije. Obezbeđivanje se vrši standardnim APDU-ima koji se mogu tunelovati kroz SMS-PP (Kratka Poruka Servis Tačka do Tačke) ili HTTPS. Ako napadač poseduje (ili ukrade) **RAM ključeve** za profil, može `INSTALL`/`LOAD` zloćudnu aplikaciju na daljinu. 2. **Izvršavanje bajtkoda Java Card** Nakon instalacije, aplikacija se izvršava unutar VM. Nedostatak provere u vreme izvršavanja omogućava korupciju memorije. ## Primitiv tipa-zbunjenosti `getfield` / `putfield` bi trebali da rade samo na **referencama objekata**. U Kigen eUICC instrukcije nikada ne proveravaju da li je operand na steku *objekat* ili *referenca niza*. Pošto reč `array.length` živi na tačno istom offsetu kao prva instanca polja normalnog objekta, napadač može: 1. Kreirati bajt-niz `byte[] buf = new byte[0x100];` 2. Pretvoriti ga u `Object o = (Object)buf;` 3. Koristiti `putfield` da prepiše *bilo koju* 16-bitnu vrednost unutar susednog objekta (uključujući VTABLE / ptr prevodne unose). 4. Koristiti `getfield` da pročita *proizvoljnu* memoriju kada su unutrašnji pokazivači preuzeti. ```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 ... ``` Primitive pruža **arbitrarno čitanje / pisanje** u eUICC adresnom prostoru – dovoljno da se isprazni jedinstveni ECC privatni ključ uređaja koji autentifikuje karticu u GSMA ekosistemu. ## End-to-End Eksploatacija Radni Tok 1. **Enumeracija firmvera** – Koristite nedokumentovani `GET DATA` stavku `DF1F`: ``` 80 CA DF 1F 00 // → "ECu10.13" (ranjiv) ``` 2. **Instalirajte zloćudni applet OTA** – Iskoristite javno poznate ključeve TS.48 Generic Test Profile i pošaljite SMS-PP fragmente koji transportuju CAP datoteku (`LOAD`) praćenu `INSTALL`: ``` // pojednostavljena APDU lanac 80 E6 02 00 // LOAD (blok n) 80 E6 0C 00 // INSTALL za učitavanje ``` 3. **Pokrenite konfuziju tipa** – Kada se applet odabere, izvršava write-what-where da preuzme tabelu pokazivača i iscuri memoriju kroz normalne APDU odgovore. 4. **Izvucite GSMA sertifikat ključ** – Privatni EC ključ se kopira u RAM appleta i vraća u delovima. 5. **Imitacija eUICC** – Uk stolen ključni par + sertifikati omogućavaju napadaču da se autentifikuje na *bilo koji* RSP server kao legitimna kartica (EID vezivanje može biti još uvek potrebno za neke operatore). 6. **Preuzmite i modifikujte profile** – Plaintext profili sadrže veoma osetljive podatke kao što su `OPc`, `AMF`, OTA ključevi i čak dodatni appleti. Napadač može: * Klonirati profil na drugi eUICC (otmica glasa/SMS); * Patchovati Java Card aplikacije (npr. umetnuti STK špijunski softver) pre ponovnog učitavanja; * Izvući tajne operatera za masovnu zloupotrebu. ## Kloniranje / Otmica Demonstracija Instaliranje istog profila na **PHONE A** i **PHONE B** rezultira time da Mobilni Preklopni Centar usmerava dolazni saobraćaj na uređaj koji se najrecentnije registrovao. Jedna sesija presretanja Gmail 2FA SMS-a je dovoljna da se zaobiđe MFA za žrtvu. ## Automatizovani Test & Eksploatacioni Alat Istraživači su objavili interni alat sa `bsc` (*Osnovna Provera Bezbednosti*) komandom koja odmah pokazuje da li je Java Card VM ranjiv: ``` 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 isporučeni sa okvirom: * `introspector` – pun VM i istraživač memorije (~1.7 MB Java) * `security-test` – generički verifikacioni zaobilaženje applet (~150 KB) * `exploit` – 100 % pouzdana Kigen eUICC kompromitacija (~72 KB) ## Mogućnosti ublažavanja 1. **Verifikacija bajt-koda na kartici** – primeniti potpunu kontrolu toka i praćenje tipa podataka umesto samo na vrhu steka. 2. **Sakrijte zaglavlje niza** – stavite `length` van preklapajućih polja objekta. 3. **Ojačajte politiku RAM ključeva** – nikada ne isporučujte profile sa javnim ključevima; onemogućite `INSTALL` u test profilima (obrađeno u GSMA TS.48 v7). 4. **Heuristike RSP servera** – ograničite brzinu preuzimanja profila po EID, pratite geografske anomalije, validirajte svežinu sertifikata. ## Brza lista za pentestere * Upit `GET DATA DF1F` – ranjiva firmware string `ECu10.13` ukazuje na Kigen. * Proverite da li su RAM ključevi poznati ‑> pokušajte OTA `INSTALL`/`LOAD`. * Nakon instalacije appleta, brute-force jednostavnu cast primitivu (`objarrconfusion`). * Pokušajte da pročitate privatne ključeve sigurnosnog domena – uspeh = potpuna kompromitacija. ## Reference - [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}}