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

개요

임베디드 SIM(eSIM)은 임베디드 UICC(eUICC) 스마트 카드로 구현되며, 보안 요소 위에서 **Java Card Virtual Machine(JC VM)**을 실행합니다. 프로필과 애플릿은 원격 SIM 프로비저닝(RSP)을 통해 무선으로 프로비저닝될 수 있으므로, JC VM 내부의 메모리 안전성 결함은 핸드셋의 가장 특권이 높은 구성 요소 내부에서 원격 코드 실행 원시 코드가 됩니다.

이 페이지는 getfieldputfield 바이트코드에서 타입 안전성 검사가 누락되어 발생한 Kigen의 eUICC(Infineon SLC37 ESA1M2, ARM SC300)의 실제 전체 손상 사례를 설명합니다. 동일한 기술은 카드 내 바이트 코드 검증을 생략하는 다른 공급업체에 대해 재사용될 수 있습니다.

공격 표면

  1. 원격 애플리케이션 관리(RAM) eSIM 프로필은 임의의 Java Card 애플릿을 포함할 수 있습니다. 프로비저닝은 SMS-PP(단문 메시지 서비스 포인트 투 포인트) 또는 HTTPS를 통해 터널링할 수 있는 표준 APDU로 수행됩니다. 공격자가 프로필에 대한 RAM 키를 소유(또는 도난)하면, 악성 애플릿을 원격으로 INSTALL/LOAD할 수 있습니다.
  2. Java Card 바이트 코드 실행 설치 후, 애플릿은 VM 내에서 실행됩니다. 누락된 런타임 검사는 메모리 손상을 허용합니다.

타입 혼동 원시 코드

getfield / putfield객체 참조에서만 작동해야 합니다. Kigen eUICC에서는 명령어가 스택의 피연산자가 객체인지 배열 참조인지 확인하지 않습니다. array.length 단어는 일반 객체의 첫 번째 인스턴스 필드와 정확히 동일한 오프셋에 존재하므로, 공격자는 다음을 수행할 수 있습니다:

  1. 바이트 배열 생성 byte[] buf = new byte[0x100];
  2. 이를 Object o = (Object)buf;로 캐스팅합니다.
  3. putfield를 사용하여 인접한 객체 내부의 임의 16비트 값을 덮어씁니다(여기에는 VTABLE / 포인터 변환 항목이 포함됩니다).
  4. 내부 포인터가 탈취된 후 getfield를 사용하여 임의 메모리를 읽습니다.
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 ...

원시 기능은 eUICC 주소 공간에서 임의 읽기/쓰기를 제공합니다. 이는 GSMA 생태계에 카드를 인증하는 장치 고유의 ECC 개인 키를 덤프하기에 충분합니다.

종단 간 악용 워크플로우

  1. 펌웨어 열거 – 문서화되지 않은 GET DATA 항목 DF1F 사용:
80 CA DF 1F 00   // → "ECu10.13" (취약점 존재)
  1. 악성 앱렛 OTA 설치 – TS.48 일반 테스트 프로파일의 공개적으로 알려진 키를 악용하고 CAP 파일(LOAD)을 전송하는 SMS-PP 조각을 푸시한 후 INSTALL:
// 단순화된 APDU 체인
80 E6 02 00 <data>   // LOAD (블록 n)
80 E6 0C 00 <data>   // 로드를 위한 INSTALL
  1. 타입 혼동 유발 – 앱렛이 선택되면 포인터 테이블을 탈취하기 위해 write-what-where를 수행하고 정상 APDU 응답을 통해 메모리를 유출합니다.
  2. GSMA 인증서 키 추출 – 개인 EC 키가 앱렛의 RAM에 복사되고 청크로 반환됩니다.
  3. eUICC 가장하기 – 도난당한 키 쌍 + 인증서를 통해 공격자는 모든 RSP 서버에 합법적인 카드로 인증할 수 있습니다 (일부 운영자에게는 EID 바인딩이 여전히 필요할 수 있습니다).
  4. 프로파일 다운로드 및 수정 – 일반 텍스트 프로파일에는 OPc, AMF, OTA 키 및 추가 앱렛과 같은 매우 민감한 필드가 포함되어 있습니다. 공격자는:
  • 두 번째 eUICC에 프로파일 복제 (음성/SMS 탈취);
  • 재업로드 전에 Java Card 애플리케이션 패치 (예: STK 스파이웨어 삽입);
  • 대규모 악용을 위한 운영자 비밀 추출.

클로닝 / 탈취 시연

PHONE APHONE B에 동일한 프로파일을 설치하면 모바일 스위칭 센터가 최근에 등록된 장치로 수신 트래픽을 라우팅합니다. Gmail 2FA SMS 가로채기 한 세션이면 피해자의 MFA를 우회하기에 충분합니다.

자동화된 테스트 및 악용 툴킷

연구자들은 Java Card VM이 취약한지 즉시 보여주는 bsc (Basic Security Check) 명령이 포함된 내부 도구를 공개했습니다:

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 – 일반적인 검증 우회 애플릿 (~150 KB)
  • exploit – 100 % 신뢰할 수 있는 Kigen eUICC 타협 (~72 KB)

완화 조치

  1. 카드 내 바이트 코드 검증 – 스택 최상위만이 아닌 전체 제어 흐름 및 데이터 흐름 유형 추적을 강제합니다.
  2. 배열 헤더 숨기기length를 겹치는 객체 필드 외부에 배치합니다.
  3. RAM 키 정책 강화 – 공개 키가 포함된 프로필을 절대 배포하지 마십시오; 테스트 프로필에서 INSTALL을 비활성화합니다 (GSMA TS.48 v7에서 다룸).
  4. RSP 서버 측 휴리스틱 – EID당 프로필 다운로드 속도 제한, 지리적 이상 모니터링, 인증서 신선도 검증.

펜테스터를 위한 빠른 체크리스트

  • GET DATA DF1F 쿼리 – 취약한 펌웨어 문자열 ECu10.13는 Kigen을 나타냅니다.
  • RAM 키가 알려져 있는지 확인 ‑> OTA INSTALL/LOAD 시도.
  • 애플릿 설치 후, 간단한 캐스트 원시형을 무차별 대입 (objarrconfusion).
  • 보안 도메인 개인 키를 읽어보십시오 – 성공 = 전체 타협.

참고 문헌

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