hacktricks/src/generic-hacking/esim-javacard-exploitation.md

88 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# eSIM / Java Card VM Exploitation
{{#include ../banners/hacktricks-training.md}}
## 개요
임베디드 SIM(eSIM)은 **임베디드 UICC(eUICC)** 스마트 카드로 구현되며, 보안 요소 위에서 **Java Card Virtual Machine(JC VM)**을 실행합니다. 프로필과 애플릿은 원격 SIM 프로비저닝(RSP)을 통해 *무선으로* 프로비저닝될 수 있으므로, JC VM 내부의 메모리 안전성 결함은 **핸드셋의 가장 특권이 높은 구성 요소 내부에서 원격 코드 실행 원시 코드**가 됩니다.
이 페이지는 `getfield``putfield` 바이트코드에서 타입 안전성 검사가 누락되어 발생한 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" (취약점 존재)
```
2. **악성 앱렛 OTA 설치** TS.48 일반 테스트 프로파일의 공개적으로 알려진 키를 악용하고 CAP 파일(`LOAD`)을 전송하는 SMS-PP 조각을 푸시한 후 `INSTALL`:
```
// 단순화된 APDU 체인
80 E6 02 00 <data> // LOAD (블록 n)
80 E6 0C 00 <data> // 로드를 위한 INSTALL
```
3. **타입 혼동 유발** 앱렛이 선택되면 포인터 테이블을 탈취하기 위해 write-what-where를 수행하고 정상 APDU 응답을 통해 메모리를 유출합니다.
4. **GSMA 인증서 키 추출** 개인 EC 키가 앱렛의 RAM에 복사되고 청크로 반환됩니다.
5. **eUICC 가장하기** 도난당한 키 쌍 + 인증서를 통해 공격자는 *모든* RSP 서버에 합법적인 카드로 인증할 수 있습니다 (일부 운영자에게는 EID 바인딩이 여전히 필요할 수 있습니다).
6. **프로파일 다운로드 및 수정** 일반 텍스트 프로파일에는 `OPc`, `AMF`, OTA 키 및 추가 앱렛과 같은 매우 민감한 필드가 포함되어 있습니다. 공격자는:
* 두 번째 eUICC에 프로파일 복제 (음성/SMS 탈취);
* 재업로드 전에 Java Card 애플리케이션 패치 (예: STK 스파이웨어 삽입);
* 대규모 악용을 위한 운영자 비밀 추출.
## 클로닝 / 탈취 시연
**PHONE A**와 **PHONE 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`).
* 보안 도메인 개인 키를 읽어보십시오 성공 = 전체 타협.
## 참고 문헌
- [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}}