Android Security Internals
- 3장 패키지 관리
석사 29기 박준영
Contents
• 패키지 전체 구조
• 패키지 서명
• APK 설치 / 업데이트 과정
• 암호화된 APK 설치
• (구) 포워드 락 / (신) 포워드 락
• 패키지 검증
• 요약
Android App Package
• APK ( JAR ( ZIP ) )
• App Code
• App Resource
• App Manifest
1. 패키지명 / 버전 / 컴포넌트 및 기타 데이터 선언
2. 폰트 / 음악파일 등
3. 앱 실행 코드, native dex format (Dalvik VM)
4. JNI를 이용한 Native Library 이용시 arch마다 dir생성.
5. Package manifest file / Code signature
6. 리소스 (Animation / Image .. )
7. 문자열 / 스타일 등 컴파일된 리소스
!
"
#
$
%
&
'
Code Sign (JAVA)
• Signature 보호 수준의 권한을 부여
• 프로그램 무결성 보증
• 생성자 확인
MANIFEST.MF
filename - sign
filename - sign
filename - sign
…
MANIFEST.MF
파일명 - 서명값 쌍의 묶음
CERT.SF
전체 매니페스트 파일
+
각 항목의 SHA1-Digest
CERT.SF에 의해
MANIFEST.MF가 검증됨.
——————————— 중략 ———————————
!
"
#$
%
&
'
(
1. 객체 식별자
2. 버전
3. 사용된 해시 알고리즘 식별자
4. 서명한 데이터 형
5. 서명값을 포함한 SignerInfo 구조체
6. 사용된 다이제스트 알고리즘
7. 서명값 생성에 사용된 다이제스트 암호화 알
8. 서명값
Common Code Sign
vs
Android Code Sign
공개키 암호 기반
X.509 인증서 포맷
PKI측면의 인증서 검증 X
모든 APK항목
동일 인증서로 서명
공통점 차이점
signapk
• code signing tool for Android
• 특장점을 제외하면 jarsigner와 거의 동일하게 작동.
• SHA1 + SHA256 / ECDSA 서명 추가지원
• 전체 파일 서명모드 (OTA Update 용)
• Google play store
• Sideloading (apk를 디바이스에 넣어 실행하여 바로 설치)
• adb install
• shell을 이용하여 시스템 앱 디렉토리에 복사하여 설치
APK 설치 방법
App Package의 위치
• /system/app - 대부분의 시스템 앱
• /system/priv-app - SignatureOrSystem 보호 수준 권한의 앱
• /system/vendor/app - 제조사 고유 앱
• /data/app - 사용자 설치 앱
Package Installer (System App)
• 패키지 관리에 대한 기본 정보를 GUI로 보여줌
• 패키지 정보를 분석, 앱의 요구권한 표시
• [알 수 없는 출처] 옵션 활성화했을 경우만 설치 가능
• 이후 pm명령(CLI기반)을 통해 설치/제거
알 수 없는 출처
/system/priv-app 내의 권한있는 앱인지 검사 후
권한이 없다면 ‘알 수 없는 출처’
Package Manager Service
• 패키지 관리 기반 구조의 핵심 객체
• APK 파싱, 앱 설치 시작, 패키지 업그레이드/제거, 패키지 DB유지, 권한 관리
• installPackageWithVerificationAndEncryption()

- 암호화된 APK파일 설치, 검증 Agent를 통해 패키지 검증.
Installer 클래스
• /dev/socker/installd 소켓을 통해 installd 데몬에 연결, 전달할 명령 캡슐화.
• system UID로 실행.
• 앱 디렉터리 생성, 삭제, 변경 위해 installd 데몬에 작업 위임
installd 데몬
• 앱 관리 기능을 시스템 패키지 매니저에 제공
• 높은 권한을 가진 네이티브 데몬
• dexopt 명령 실행 (odex 생성)
• system UID로 실행되는 프로세스만 접근
• Opaque Binary Blob(OBB)파일 / 외장 메모리 등 마운팅
• 디바이스 암호화
• 패스워드 변경
• 보안 컨테이너 관리 (포워드 락 구현을 위함)
• system UID로 실행됨
마운트 서비스
OBB
void 데몬
• 볼륨 관리 데몬
• root 사용자로 실행됨
• 파일시스템 생성 / 포맷
• 보안 컨테이너 관리
미디어 컨테이너 서비스
• APK 파일 복사(설치 위치 or 암호화된 컨테이너)
• 패키지 매니저 서비스가 이동식 저장소에 접근할 수 있게 함
• 암호화된 APK파일 복호화
• 마운트 서비스에 암호화된 컨테이너 생성 위임,

새로 생성된 컨테이너에 APK의 보호된 부분 복사.
앱 디렉터리 감시자
• 앱 디렉터리가 변경되는지를 항상 감시
• APK파일이 추가될 시 패키지 검사 후 앱 설치 / 업데이트
패키지 설치
• 패키지 파싱 / 검증
• 권한 허용 / 설치과정 시작
• 앱 디렉터리 복사
• 패키지 스캐닝
• 데이터 디렉터리 생성
• ODEX 생성
• packages.xml 갱신
• 컴포넌트와 권한 갱신
• ‘알 수 없는 출처’ 설치 여부 체크
• APK파일 파싱
• AndroidManifest.xml / 패키지 서명에서 정보 수집
• APK파일의 무결성 검증
패키지 파싱 / 검증
패키지 설치
• 패키지 파싱 / 검증
• 권한 허용 / 설치과정 시작
• 앱 디렉터리 복사
• 패키지 스캐닝
• 데이터 디렉터리 생성
• ODEX 생성
• packages.xml 갱신
• 컴포넌트와 권한 갱신
• 앱이 요청하는 권한 정보 출력
• InstallAppProgress Activity에 설치 정보 전달
• installPackageWithVerificationAndEncryption() 실행
• InstallAppProgress는 오류대기상태
권한 허용 / 설치과정 시작
패키지 설치
• 패키지 파싱 / 검증
• 권한 허용 / 설치과정 시작
• 앱 디렉터리 복사
• 패키지 스캐닝
• 데이터 디렉터리 생성
• ODEX 생성
• packages.xml 갱신
• 컴포넌트와 권한 갱신
• /data/app에 apk파일 복사
• /data/app-lib로 앱 라이브러리 복사
• 패키지명에 기반한 이름으로 변경(com.example...apk)
• apk 파일 권한 0644로 설정
• SELinux 컨텍스트 설정
앱 디렉터리 복사
패키지 설치
• 패키지 파싱 / 검증
• 권한 허용 / 설치과정 시작
• 앱 디렉터리 복사
• 패키지 스캐닝
• 데이터 디렉터리 생성
• ODEX 생성
• packages.xml 갱신
• 컴포넌트와 권한 갱신
• dexopt명령을 installd에 보내 위임
• dexopt를 fork()
• /data/dalvik-cache 디렉터리에 odex 생성
ODEX 생성
패키지 설치
• 패키지 파싱 / 검증
• 권한 허용 / 설치과정 시작
• 앱 디렉터리 복사
• 패키지 스캐닝
• 데이터 디렉터리 생성
• ODEX 생성
• packages.xml 갱신
• 컴포넌트와 권한 갱신
packages.xml 갱신
패키지 설치
• 패키지 파싱 / 검증
• 권한 허용 / 설치과정 시작
• 앱 디렉터리 복사
• 패키지 스캐닝
• 데이터 디렉터리 생성
• ODEX 생성
• packages.xml 갱신
• 컴포넌트와 권한 갱신
• 내부 컴포넌트 레지스트리에 새 앱의 컴포넌트 추가
• 앱이 선언한 권한 그룹 / 권한 추가
• 패키지 DB 변경내용 디스크에 저장
• 다른 컴포넌트들에게 Broadcast
컴포턴트와 권한 갱신
패키지 업데이트
• 서명 검증

- 기존 패키지와 동일한 서명자에 의해 서명되어 있는지.
• 반드시 원래의 인증서를 이용해 서명해야 함
암호화된 APK 설치
• Android 4.1부터 적용
• PackageInstaller는 암호화된 APK를 지원하지 않음
• pm명령 사용 or 설치앱 직접 제작
• adb install = adb push + pm install
adb install [-l] [-r] [-s] [—algo <알고리즘 명> --key <16진수 키> --iv <16진수 IV>] <file>
(구) 포워드 락
• 사용자가 유료 앱을 다른 사용자에게 전달하지 못하도록 함
• /data/app : 리소스 / 매니페스트 (누구나 읽을 수 있음)
• /data/app-private : 실행코드 (system 사용자만 읽을 수 있음)
• root권한을 가진 디바이스에서 추출 가능
• ‘Google Play Licensing’으로 교체, 이후 새로운 포워드 락으로 개선
안드로이드 4.1 포워드 락
• 컨테이너에 ext4 Filesystem 사용
• res.zip은 누구나 읽기 가능
• pkg.apk는 앱 전용사용자만 읽기 가능
• /data/app-asec 에 .asec 확장자를 가진 파일로 저장됨.
패키지 검증
• 악성코드 / 멀웨어 등 유해가능성이 있는 앱으로부터 보호
• 구글에 앱 데이터를 전송하여 검증
요약
• APK 파일은 JAR의 확장

- 리소스, 코드, Manifest등을 담고있음.
• APK는 JAR 파일과 같은 코드 서명 포맷으로 서명되지만, 모든 파일을 동일 인증
서 집합으로 서명해야 함.
• 업데이트 시 코드 서명자의 ‘인증서’를 기반으로 신뢰 관계 설정
• 포워드 락 구현을 위해 암호화된 APK 파일과 보안 앱 컨테이너 지원
• 구글에서 지원하는 앱 검증 사용 가능
Question & Answer

Android Security Internals (Lesson 3)

  • 1.
    Android Security Internals -3장 패키지 관리 석사 29기 박준영
  • 2.
    Contents • 패키지 전체구조 • 패키지 서명 • APK 설치 / 업데이트 과정 • 암호화된 APK 설치 • (구) 포워드 락 / (신) 포워드 락 • 패키지 검증 • 요약
  • 3.
    Android App Package •APK ( JAR ( ZIP ) ) • App Code • App Resource • App Manifest
  • 4.
    1. 패키지명 /버전 / 컴포넌트 및 기타 데이터 선언 2. 폰트 / 음악파일 등 3. 앱 실행 코드, native dex format (Dalvik VM) 4. JNI를 이용한 Native Library 이용시 arch마다 dir생성. 5. Package manifest file / Code signature 6. 리소스 (Animation / Image .. ) 7. 문자열 / 스타일 등 컴파일된 리소스 ! " # $ % & '
  • 5.
    Code Sign (JAVA) •Signature 보호 수준의 권한을 부여 • 프로그램 무결성 보증 • 생성자 확인 MANIFEST.MF filename - sign filename - sign filename - sign …
  • 6.
    MANIFEST.MF 파일명 - 서명값쌍의 묶음 CERT.SF 전체 매니페스트 파일 + 각 항목의 SHA1-Digest CERT.SF에 의해 MANIFEST.MF가 검증됨.
  • 7.
    ——————————— 중략 ——————————— ! " #$ % & ' ( 1.객체 식별자 2. 버전 3. 사용된 해시 알고리즘 식별자 4. 서명한 데이터 형 5. 서명값을 포함한 SignerInfo 구조체 6. 사용된 다이제스트 알고리즘 7. 서명값 생성에 사용된 다이제스트 암호화 알 8. 서명값
  • 8.
    Common Code Sign vs AndroidCode Sign 공개키 암호 기반 X.509 인증서 포맷 PKI측면의 인증서 검증 X 모든 APK항목 동일 인증서로 서명 공통점 차이점
  • 9.
    signapk • code signingtool for Android • 특장점을 제외하면 jarsigner와 거의 동일하게 작동. • SHA1 + SHA256 / ECDSA 서명 추가지원 • 전체 파일 서명모드 (OTA Update 용)
  • 10.
    • Google playstore • Sideloading (apk를 디바이스에 넣어 실행하여 바로 설치) • adb install • shell을 이용하여 시스템 앱 디렉토리에 복사하여 설치 APK 설치 방법
  • 11.
    App Package의 위치 •/system/app - 대부분의 시스템 앱 • /system/priv-app - SignatureOrSystem 보호 수준 권한의 앱 • /system/vendor/app - 제조사 고유 앱 • /data/app - 사용자 설치 앱
  • 12.
    Package Installer (SystemApp) • 패키지 관리에 대한 기본 정보를 GUI로 보여줌 • 패키지 정보를 분석, 앱의 요구권한 표시 • [알 수 없는 출처] 옵션 활성화했을 경우만 설치 가능 • 이후 pm명령(CLI기반)을 통해 설치/제거 알 수 없는 출처 /system/priv-app 내의 권한있는 앱인지 검사 후 권한이 없다면 ‘알 수 없는 출처’
  • 13.
    Package Manager Service •패키지 관리 기반 구조의 핵심 객체 • APK 파싱, 앱 설치 시작, 패키지 업그레이드/제거, 패키지 DB유지, 권한 관리 • installPackageWithVerificationAndEncryption()
 - 암호화된 APK파일 설치, 검증 Agent를 통해 패키지 검증.
  • 14.
    Installer 클래스 • /dev/socker/installd소켓을 통해 installd 데몬에 연결, 전달할 명령 캡슐화. • system UID로 실행. • 앱 디렉터리 생성, 삭제, 변경 위해 installd 데몬에 작업 위임
  • 15.
    installd 데몬 • 앱관리 기능을 시스템 패키지 매니저에 제공 • 높은 권한을 가진 네이티브 데몬 • dexopt 명령 실행 (odex 생성) • system UID로 실행되는 프로세스만 접근
  • 16.
    • Opaque BinaryBlob(OBB)파일 / 외장 메모리 등 마운팅 • 디바이스 암호화 • 패스워드 변경 • 보안 컨테이너 관리 (포워드 락 구현을 위함) • system UID로 실행됨 마운트 서비스 OBB
  • 17.
    void 데몬 • 볼륨관리 데몬 • root 사용자로 실행됨 • 파일시스템 생성 / 포맷 • 보안 컨테이너 관리
  • 18.
    미디어 컨테이너 서비스 •APK 파일 복사(설치 위치 or 암호화된 컨테이너) • 패키지 매니저 서비스가 이동식 저장소에 접근할 수 있게 함 • 암호화된 APK파일 복호화 • 마운트 서비스에 암호화된 컨테이너 생성 위임,
 새로 생성된 컨테이너에 APK의 보호된 부분 복사.
  • 19.
    앱 디렉터리 감시자 •앱 디렉터리가 변경되는지를 항상 감시 • APK파일이 추가될 시 패키지 검사 후 앱 설치 / 업데이트
  • 20.
    패키지 설치 • 패키지파싱 / 검증 • 권한 허용 / 설치과정 시작 • 앱 디렉터리 복사 • 패키지 스캐닝 • 데이터 디렉터리 생성 • ODEX 생성 • packages.xml 갱신 • 컴포넌트와 권한 갱신 • ‘알 수 없는 출처’ 설치 여부 체크 • APK파일 파싱 • AndroidManifest.xml / 패키지 서명에서 정보 수집 • APK파일의 무결성 검증 패키지 파싱 / 검증
  • 21.
    패키지 설치 • 패키지파싱 / 검증 • 권한 허용 / 설치과정 시작 • 앱 디렉터리 복사 • 패키지 스캐닝 • 데이터 디렉터리 생성 • ODEX 생성 • packages.xml 갱신 • 컴포넌트와 권한 갱신 • 앱이 요청하는 권한 정보 출력 • InstallAppProgress Activity에 설치 정보 전달 • installPackageWithVerificationAndEncryption() 실행 • InstallAppProgress는 오류대기상태 권한 허용 / 설치과정 시작
  • 22.
    패키지 설치 • 패키지파싱 / 검증 • 권한 허용 / 설치과정 시작 • 앱 디렉터리 복사 • 패키지 스캐닝 • 데이터 디렉터리 생성 • ODEX 생성 • packages.xml 갱신 • 컴포넌트와 권한 갱신 • /data/app에 apk파일 복사 • /data/app-lib로 앱 라이브러리 복사 • 패키지명에 기반한 이름으로 변경(com.example...apk) • apk 파일 권한 0644로 설정 • SELinux 컨텍스트 설정 앱 디렉터리 복사
  • 23.
    패키지 설치 • 패키지파싱 / 검증 • 권한 허용 / 설치과정 시작 • 앱 디렉터리 복사 • 패키지 스캐닝 • 데이터 디렉터리 생성 • ODEX 생성 • packages.xml 갱신 • 컴포넌트와 권한 갱신 • dexopt명령을 installd에 보내 위임 • dexopt를 fork() • /data/dalvik-cache 디렉터리에 odex 생성 ODEX 생성
  • 24.
    패키지 설치 • 패키지파싱 / 검증 • 권한 허용 / 설치과정 시작 • 앱 디렉터리 복사 • 패키지 스캐닝 • 데이터 디렉터리 생성 • ODEX 생성 • packages.xml 갱신 • 컴포넌트와 권한 갱신 packages.xml 갱신
  • 25.
    패키지 설치 • 패키지파싱 / 검증 • 권한 허용 / 설치과정 시작 • 앱 디렉터리 복사 • 패키지 스캐닝 • 데이터 디렉터리 생성 • ODEX 생성 • packages.xml 갱신 • 컴포넌트와 권한 갱신 • 내부 컴포넌트 레지스트리에 새 앱의 컴포넌트 추가 • 앱이 선언한 권한 그룹 / 권한 추가 • 패키지 DB 변경내용 디스크에 저장 • 다른 컴포넌트들에게 Broadcast 컴포턴트와 권한 갱신
  • 26.
    패키지 업데이트 • 서명검증
 - 기존 패키지와 동일한 서명자에 의해 서명되어 있는지. • 반드시 원래의 인증서를 이용해 서명해야 함
  • 27.
    암호화된 APK 설치 •Android 4.1부터 적용 • PackageInstaller는 암호화된 APK를 지원하지 않음 • pm명령 사용 or 설치앱 직접 제작 • adb install = adb push + pm install adb install [-l] [-r] [-s] [—algo <알고리즘 명> --key <16진수 키> --iv <16진수 IV>] <file>
  • 28.
    (구) 포워드 락 •사용자가 유료 앱을 다른 사용자에게 전달하지 못하도록 함 • /data/app : 리소스 / 매니페스트 (누구나 읽을 수 있음) • /data/app-private : 실행코드 (system 사용자만 읽을 수 있음) • root권한을 가진 디바이스에서 추출 가능 • ‘Google Play Licensing’으로 교체, 이후 새로운 포워드 락으로 개선
  • 29.
    안드로이드 4.1 포워드락 • 컨테이너에 ext4 Filesystem 사용 • res.zip은 누구나 읽기 가능 • pkg.apk는 앱 전용사용자만 읽기 가능 • /data/app-asec 에 .asec 확장자를 가진 파일로 저장됨.
  • 30.
    패키지 검증 • 악성코드/ 멀웨어 등 유해가능성이 있는 앱으로부터 보호 • 구글에 앱 데이터를 전송하여 검증
  • 31.
    요약 • APK 파일은JAR의 확장
 - 리소스, 코드, Manifest등을 담고있음. • APK는 JAR 파일과 같은 코드 서명 포맷으로 서명되지만, 모든 파일을 동일 인증 서 집합으로 서명해야 함. • 업데이트 시 코드 서명자의 ‘인증서’를 기반으로 신뢰 관계 설정 • 포워드 락 구현을 위해 암호화된 APK 파일과 보안 앱 컨테이너 지원 • 구글에서 지원하는 앱 검증 사용 가능
  • 32.