android security internals (lesson 3)

32
Android Security Internals - 3장 패키지 관리 석사 29기 박준영

Upload: joon-young-park

Post on 12-Apr-2017

424 views

Category:

Technology


8 download

TRANSCRIPT

Page 1: Android Security Internals (Lesson 3)

Android Security Internals- 3장 패키지 관리

석사 29기 박준영

Page 2: Android Security Internals (Lesson 3)

Contents• 패키지 전체 구조

• 패키지 서명

• APK 설치 / 업데이트 과정

• 암호화된 APK 설치

• (구) 포워드 락 / (신) 포워드 락

• 패키지 검증

• 요약

Page 3: Android Security Internals (Lesson 3)

Android App Package

• APK ( JAR ( ZIP ) )

• App Code

• App Resource

• App Manifest

Page 4: Android Security Internals (Lesson 3)

1. 패키지명 / 버전 / 컴포넌트 및 기타 데이터 선언

2. 폰트 / 음악파일 등

3. 앱 실행 코드, native dex format (Dalvik VM)

4. JNI를 이용한 Native Library 이용시 arch마다 dir생성.

5. Package manifest file / Code signature

6. 리소스 (Animation / Image .. )

7. 문자열 / 스타일 등 컴파일된 리소스

!

"

#

$

%

&

'

Page 5: Android Security Internals (Lesson 3)

Code Sign (JAVA)

• Signature 보호 수준의 권한을 부여

• 프로그램 무결성 보증

• 생성자 확인

MANIFEST.MFfilename - signfilename - signfilename - sign

Page 6: Android Security Internals (Lesson 3)

MANIFEST.MF

파일명 - 서명값 쌍의 묶음

CERT.SF

전체 매니페스트 파일 +

각 항목의 SHA1-Digest

CERT.SF에 의해 MANIFEST.MF가 검증됨.

Page 7: Android Security Internals (Lesson 3)

——————————— 중략 ———————————

!

"

#$

%

&

'

(

1. 객체 식별자

2. 버전

3. 사용된 해시 알고리즘 식별자

4. 서명한 데이터 형

5. 서명값을 포함한 SignerInfo 구조체

6. 사용된 다이제스트 알고리즘

7. 서명값 생성에 사용된 다이제스트 암호화 알고리즘

8. 서명값

Page 8: Android Security Internals (Lesson 3)

Common Code Sign vs

Android Code Sign

공개키 암호 기반

X.509 인증서 포맷

PKI측면의 인증서 검증 X

모든 APK항목 동일 인증서로 서명

공통점 차이점

Page 9: Android Security Internals (Lesson 3)

signapk

• code signing tool for Android

• 특장점을 제외하면 jarsigner와 거의 동일하게 작동.

• SHA1 + SHA256 / ECDSA 서명 추가지원

• 전체 파일 서명모드 (OTA Update 용)

Page 10: Android Security Internals (Lesson 3)

• Google play store

• Sideloading (apk를 디바이스에 넣어 실행하여 바로 설치)

• adb install

• shell을 이용하여 시스템 앱 디렉토리에 복사하여 설치

APK 설치 방법

Page 11: Android Security Internals (Lesson 3)

App Package의 위치

• /system/app - 대부분의 시스템 앱

• /system/priv-app - SignatureOrSystem 보호 수준 권한의 앱

• /system/vendor/app - 제조사 고유 앱

• /data/app - 사용자 설치 앱

Page 12: Android Security Internals (Lesson 3)

Package Installer (System App)

• 패키지 관리에 대한 기본 정보를 GUI로 보여줌

• 패키지 정보를 분석, 앱의 요구권한 표시

• [알 수 없는 출처] 옵션 활성화했을 경우만 설치 가능

• 이후 pm명령(CLI기반)을 통해 설치/제거

알 수 없는 출처

/system/priv-app 내의 권한있는 앱인지 검사 후 권한이 없다면 ‘알 수 없는 출처’

Page 13: Android Security Internals (Lesson 3)

Package Manager Service

• 패키지 관리 기반 구조의 핵심 객체

• APK 파싱, 앱 설치 시작, 패키지 업그레이드/제거, 패키지 DB유지, 권한 관리

• installPackageWithVerificationAndEncryption() - 암호화된 APK파일 설치, 검증 Agent를 통해 패키지 검증.

Page 14: Android Security Internals (Lesson 3)

Installer 클래스

• /dev/socker/installd 소켓을 통해 installd 데몬에 연결, 전달할 명령 캡슐화.

• system UID로 실행.

• 앱 디렉터리 생성, 삭제, 변경 위해 installd 데몬에 작업 위임

Page 15: Android Security Internals (Lesson 3)

installd 데몬

• 앱 관리 기능을 시스템 패키지 매니저에 제공

• 높은 권한을 가진 네이티브 데몬

• dexopt 명령 실행 (odex 생성)

• system UID로 실행되는 프로세스만 접근

Page 16: Android Security Internals (Lesson 3)

• Opaque Binary Blob(OBB)파일 / 외장 메모리 등 마운팅

• 디바이스 암호화

• 패스워드 변경

• 보안 컨테이너 관리 (포워드 락 구현을 위함)

• system UID로 실행됨

마운트 서비스

OBB

Page 17: Android Security Internals (Lesson 3)

void 데몬

• 볼륨 관리 데몬

• root 사용자로 실행됨

• 파일시스템 생성 / 포맷

• 보안 컨테이너 관리

Page 18: Android Security Internals (Lesson 3)

미디어 컨테이너 서비스

• APK 파일 복사(설치 위치 or 암호화된 컨테이너)

• 패키지 매니저 서비스가 이동식 저장소에 접근할 수 있게 함

• 암호화된 APK파일 복호화

• 마운트 서비스에 암호화된 컨테이너 생성 위임,새로 생성된 컨테이너에 APK의 보호된 부분 복사.

Page 19: Android Security Internals (Lesson 3)

앱 디렉터리 감시자

• 앱 디렉터리가 변경되는지를 항상 감시

• APK파일이 추가될 시 패키지 검사 후 앱 설치 / 업데이트

Page 20: Android Security Internals (Lesson 3)

패키지 설치• 패키지 파싱 / 검증

• 권한 허용 / 설치과정 시작

• 앱 디렉터리 복사

• 패키지 스캐닝

• 데이터 디렉터리 생성

• ODEX 생성

• packages.xml 갱신

• 컴포넌트와 권한 갱신

• ‘알 수 없는 출처’ 설치 여부 체크

• APK파일 파싱

• AndroidManifest.xml / 패키지 서명에서 정보 수집

• APK파일의 무결성 검증

패키지 파싱 / 검증

Page 21: Android Security Internals (Lesson 3)

패키지 설치• 패키지 파싱 / 검증

• 권한 허용 / 설치과정 시작

• 앱 디렉터리 복사

• 패키지 스캐닝

• 데이터 디렉터리 생성

• ODEX 생성

• packages.xml 갱신

• 컴포넌트와 권한 갱신

• 앱이 요청하는 권한 정보 출력

• InstallAppProgress Activity에 설치 정보 전달

• installPackageWithVerificationAndEncryption() 실행

• InstallAppProgress는 오류대기상태

권한 허용 / 설치과정 시작

Page 22: Android Security Internals (Lesson 3)

패키지 설치• 패키지 파싱 / 검증

• 권한 허용 / 설치과정 시작

• 앱 디렉터리 복사

• 패키지 스캐닝

• 데이터 디렉터리 생성

• ODEX 생성

• packages.xml 갱신

• 컴포넌트와 권한 갱신

• /data/app에 apk파일 복사

• /data/app-lib로 앱 라이브러리 복사

• 패키지명에 기반한 이름으로 변경(com.example...apk)

• apk 파일 권한 0644로 설정

• SELinux 컨텍스트 설정

앱 디렉터리 복사

Page 23: Android Security Internals (Lesson 3)

패키지 설치• 패키지 파싱 / 검증

• 권한 허용 / 설치과정 시작

• 앱 디렉터리 복사

• 패키지 스캐닝

• 데이터 디렉터리 생성

• ODEX 생성

• packages.xml 갱신

• 컴포넌트와 권한 갱신

• dexopt명령을 installd에 보내 위임

• dexopt를 fork()

• /data/dalvik-cache 디렉터리에 odex 생성

ODEX 생성

Page 24: Android Security Internals (Lesson 3)

패키지 설치• 패키지 파싱 / 검증

• 권한 허용 / 설치과정 시작

• 앱 디렉터리 복사

• 패키지 스캐닝

• 데이터 디렉터리 생성

• ODEX 생성

• packages.xml 갱신

• 컴포넌트와 권한 갱신

packages.xml 갱신

Page 25: Android Security Internals (Lesson 3)

패키지 설치• 패키지 파싱 / 검증

• 권한 허용 / 설치과정 시작

• 앱 디렉터리 복사

• 패키지 스캐닝

• 데이터 디렉터리 생성

• ODEX 생성

• packages.xml 갱신

• 컴포넌트와 권한 갱신

• 내부 컴포넌트 레지스트리에 새 앱의 컴포넌트 추가

• 앱이 선언한 권한 그룹 / 권한 추가

• 패키지 DB 변경내용 디스크에 저장

• 다른 컴포넌트들에게 Broadcast

컴포턴트와 권한 갱신

Page 26: Android Security Internals (Lesson 3)

패키지 업데이트

•서명 검증- 기존 패키지와 동일한 서명자에 의해 서명되어 있는지.

• 반드시 원래의 인증서를 이용해 서명해야 함

Page 27: Android Security Internals (Lesson 3)

암호화된 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>

Page 28: Android Security Internals (Lesson 3)

(구) 포워드 락

• 사용자가 유료 앱을 다른 사용자에게 전달하지 못하도록 함

• /data/app : 리소스 / 매니페스트 (누구나 읽을 수 있음)

• /data/app-private : 실행코드 (system 사용자만 읽을 수 있음)

• root권한을 가진 디바이스에서 추출 가능

• ‘Google Play Licensing’으로 교체, 이후 새로운 포워드 락으로 개선

Page 29: Android Security Internals (Lesson 3)

안드로이드 4.1 포워드 락

• 컨테이너에 ext4 Filesystem 사용

• res.zip은 누구나 읽기 가능

• pkg.apk는 앱 전용사용자만 읽기 가능

• /data/app-asec 에 .asec 확장자를 가진 파일로 저장됨.

Page 30: Android Security Internals (Lesson 3)

패키지 검증

• 악성코드 / 멀웨어 등 유해가능성이 있는 앱으로부터 보호

• 구글에 앱 데이터를 전송하여 검증

Page 31: Android Security Internals (Lesson 3)

요약• APK 파일은 JAR의 확장- 리소스, 코드, Manifest등을 담고있음.

• APK는 JAR 파일과 같은 코드 서명 포맷으로 서명되지만, 모든 파일을 동일 인증서 집합으로 서명해야 함.

• 업데이트 시 코드 서명자의 ‘인증서’를 기반으로 신뢰 관계 설정

• 포워드 락 구현을 위해 암호화된 APK 파일과 보안 앱 컨테이너 지원

• 구글에서 지원하는 앱 검증 사용 가능

Page 32: Android Security Internals (Lesson 3)

Question & Answer