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)는 보안 요소 위에서 Java Card Virtual Machine (JC VM)을 실행하는 Embedded UICC (eUICC) 스마트카드로 구현됩니다. 프로필과 애플릿이 Remote SIM Provisioning (RSP)을 통해 over-the-air (OTA)로 프로비저닝될 수 있기 때문에, JC VM 내부의 어떤 메모리 안전성 결함도 즉시 핸드셋에서 가장 권한이 높은 컴포넌트 내부에서의 remote code-execution primitive가 됩니다.

이 페이지는 getfield 및 putfield 바이트코드의 타입 안전성 검사가 누락되어 Kigen의 eUICC (Infineon SLC37 ESA1M2, ARM SC300)가 실제로 완전히 탈취된 사례를 설명합니다. 동일한 기법은 on-card byte-code verification을 생략하는 다른 벤더에도 재사용될 수 있습니다.

공격 표면

  1. Remote Application Management (RAM)
    eSIM 프로필은 임의의 Java Card applets를 포함할 수 있습니다. 프로비저닝은 표준 APDUs로 수행되며, 이는 SMS-PP (Short Message Service Point-to-Point) 또는 HTTPS를 통해 터널링될 수 있습니다. 공격자가 프로필의 RAM keys를 보유(또는 탈취)하면 원격으로 악성 애플릿을 INSTALL/LOAD할 수 있습니다.
  2. Java Card byte-code execution
    설치 후 애플릿은 VM 내부에서 실행됩니다. 런타임 검사 누락은 메모리 손상(memory corruption)을 허용합니다.

2024–2025 ecosystem changes

  • GSMA TS.48 v7.0 (18 Jun 2025) removed public RAM keysets from the Generic Test Profile and blocks INSTALL unless randomized keys are provided; cached v≤6 profiles still expose static RAM keys and remain exploitable.
  • GSMA AN‑2025‑07 (09 Jul 2025) recommends on-card bytecode verification; most eUICCs still skip full verification so VM memory bugs stay reachable after applet install.
  • Kigen OTA hardening (Jul 2025) blocks applet loading when legacy TS.48 test profiles are active and adds runtime checks, but unpatched devices stay vulnerable.

The Type-Confusion Primitive

getfield / putfield are supposed to operate only on object references. Kigen eUICC에서는 해당 명령들이 스택 상의 오퍼랜드가 object인지 array인지 검증하지 않습니다. array.length 워드는 일반 객체의 첫 번째 인스턴스 필드와 정확히 같은 오프셋에 있기 때문에, 공격자는 다음을 할 수 있습니다:

  1. 바이트 배열 생성: byte[] buf = new byte[0x100];
  2. 캐스트: Object o = (Object)buf;
  3. putfield를 사용해 인접 객체 내부의 어떤 16비트 값이든 덮어씁니다(여기에는 VTABLE / ptr translation entries 포함).
  4. 내부 포인터가 탈취되면 getfield를 사용하여 임의의 메모리를 읽습니다.
// 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.

엔드 투 엔드 익스플로잇 워크플로우

  1. 펌웨어 열거 – 문서화되지 않은 GET DATA 항목 DF1F 사용:
80 CA DF 1F 00   // → "ECu10.13" (vulnerable)
  1. 악성 applet OTA 설치 – TS.48 Generic Test Profile의 공개된 키를 악용하고 CAP 파일을 전송하는 SMS-PP 조각을 푸시한 후 INSTALL 수행:
// simplified APDU chain
80 E6 02 00 <data>   // LOAD (block n)
80 E6 0C 00 <data>   // INSTALL for load
  1. type-confusion 유발 – applet이 선택되면 write-what-where를 수행하여 포인터 테이블을 하이재킹하고 정상 APDU 응답을 통해 메모리를 leak합니다.
  2. GSMA certificate key 추출 – Private EC key는 applet의 RAM으로 복사되어 청크 단위로 반환됩니다.
  3. eUICC 가장 – 탈취한 키 페어와 인증서를 사용하면 공격자는 정당한 카드로서 any RSP 서버에 인증할 수 있습니다(일부 통신사에서는 여전히 EID 바인딩이 필요할 수 있음).
  4. 프로파일 다운로드 및 수정 – 평문 프로파일에는 OPc, AMF, OTA keys 및 추가 applet 등 매우 민감한 필드가 포함되어 있습니다. 공격자는 다음을 수행할 수 있습니다:
  • 프로파일을 두 번째 eUICC로 복제(voice/SMS hijack);
  • 재업로드하기 전에 Java Card 애플리케이션을 패치(예: STK spyware 삽입);
  • 대규모 악용을 위해 운영자 비밀을 추출.

Cloning / Hijacking Demonstration

PHONE A와 PHONE B에 동일한 프로파일을 설치하면 Mobile Switching Centre가 가장 최근에 등록된 기기로 들어오는 트래픽을 라우팅합니다. Gmail 2FA SMS를 한 세션만 가로채도 피해자의 MFA를 우회하기에 충분합니다.

자동화된 테스트 및 익스플로잇 툴킷

연구자들은 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]

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)

완화 조치

  1. 카드 내 byte-code verification – stack-top만이 아니라 전체 control-flow & data-flow type tracking을 적용하도록 강제.
  2. 배열 헤더 숨기기 – 겹치는 객체 필드 밖에 length를 배치.
  3. RAM 키 정책 강화 – 공개 키가 포함된 프로파일을 절대 출고하지 않음; 테스트 프로파일에서 INSTALL 비활성화( TS.48 v7은 RAM keysets 제거 ).
  4. RSP 서버 측 heuristics – EID별 프로파일 다운로드 속도 제한, 지리적 이상 징후 모니터링, 인증서 최신성 검증.
  5. 장치를 레거시 테스트 프로파일에서 분리 유지 – TS.48 v≤6으로 applet 로딩을 차단하는 2025년 7월 OTA를 적용하거나 공장 이미지에서 테스트 프로파일 제거.

Pentesters를 위한 빠른 체크리스트

  • Query GET DATA DF1F – 취약한 펌웨어 문자열 ECu10.13은 Kigen을 나타냄.
  • 로드된 프로파일 검사: static RAM keys가 있는 TS.48 테스트 프로파일(v≤6)은 직접적으로 악용 가능; RAM keys가 없는 v7은 새로운 key leak이 필요.
  • RAM keys가 알려져 있는지 확인 ‑> OTA INSTALL/LOAD 시도.
  • applet 설치 후, brute-force simple cast primitive (objarrconfusion).
  • Security Domain 개인 키를 읽어 시도 – 성공 = full compromise.

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 지원하기