Android Security Internals (Lesson 3)

Post on 12-Apr-2017

422 views 8 download

Transcript of Android Security Internals (Lesson 3)

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.MFfilename - signfilename - signfilename - 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