안드로이드에서 UICC 접근을 위한 오픈 모바일 API 분석
초록
본 보고서는 안드로이드 기기에서 보안 요소인 UICC에 접근하기 위한 오픈 모바일 API(Open Mobile API)의 구조와 구현 방식을 살펴보고, 삼성 갤럭시 S3의 스톡 ROM을 역공학하여 API 연동 및 APDU 통신 인터페이스를 분석한다. 또한, 이 기능을 커스텀 펌웨어인 CyanogenMod에 통합하는 방법을 상세히 제시한다.
상세 분석
오픈 모바일 API는 모바일 애플리케이션이 보안 요소(SE)와 표준화된 방식으로 통신할 수 있게 해 주는 인터페이스이다. API는 크게 세 계층으로 구성된다. 첫 번째는 애플리케이션 레이어로, Java 기반의 SmartcardService와 Reader 객체를 제공한다. 두 번째는 서비스 레이어로, 실제 SE에 대한 접근을 담당하는 SEService와 SEChannel 구현체가 존재한다. 마지막으로 하드웨어 레이어는 UICC, eSE, SIM 기반 SE 등 물리적 보안 요소와 직접 통신하는 드라이버와 네이티브 라이브러리로 이루어진다.
안드로이드에서는 org.simalliance.openmobileapi 패키지를 통해 표준 API를 제공한다. 하지만 제조사마다 SE 통합 방식이 다르기 때문에, API 구현체가 다르게 배치된다. 삼성은 com.sec.android.service.se 패키지 아래에 자체 서비스(SecSEService)와 네이티브 라이브러리(libseandroid.so)를 두어 UICC와의 APDU 교환을 수행한다. 역공학 결과, SecSEService는 Binder 기반 IPC를 이용해 애플리케이션 요청을 받아 SEService 구현체에 전달하고, 이는 다시 SEChannel을 통해 libseandroid.so의 SEOpenChannel 함수로 라우팅한다.
libseandroid.so는 RIL(Radio Interface Layer)와 연동해 UICC에 직접 접근한다. 핵심 함수는 RIL_REQUEST_OEM_HOOK_RAW를 이용해 라디오 모듈에 커스텀 명령을 전송하고, 응답을 APDU 형태로 받아 반환한다. 이 과정에서 SIM_IO 구조체가 사용되며, channelId와 slotId를 지정해 다중 채널을 지원한다. 또한, 보안상의 이유로 인증 토큰이 필요하며, 토큰 검증은 SecSEService 내부에서 수행된다.
CyanogenMod에 통합하기 위해서는 두 가지 주요 작업이 필요하다. 첫째, org.simalliance.openmobileapi 패키지를 시스템 이미지에 포함하고, SEService 구현체를 SecSEService와 호환되도록 어댑터 클래스를 작성한다. 둘째, libseandroid.so와 동일한 기능을 제공하는 네이티브 라이브러리를 커스텀 ROM에 빌드하고, RIL 인터페이스를 통해 UICC와 통신하도록 설정한다. 이를 위해 device/<vendor>/<board>/se 디렉터리에 se_service.cpp와 se_channel.cpp를 추가하고, Android.mk에 라이브러리 의존성을 명시한다.
보안 요소 통합 시 고려해야 할 점은 권한 관리와 인증이다. AndroidManifest에 android.permission.SECURE_ELEMENT_PRIVILEGED와 android.permission.NFC 권한을 선언해야 하며, 시스템 레벨에서만 접근 가능한 SEService를 system UID로 실행해야 한다. 또한, APDU 전송 시 데이터 길이 제한(최대 255바이트)과 응답 코드(ISO 7816-4 표준) 처리를 정확히 구현해야 한다.
본 분석을 통해 오픈 모바일 API가 제공하는 추상화 레이어와 실제 하드웨어 연동 사이의 복잡한 매핑 구조를 이해할 수 있었다. 특히, 제조사별 커스텀 구현이 존재함에도 불구하고, 표준 API를 유지하면서도 네이티브 드라이버와 RIL을 활용하는 방식은 안드로이드 생태계에서 보안 요소를 확장하는 핵심 전략임을 확인했다.
댓글 및 학술 토론
Loading comments...
의견 남기기