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를 통해 패키지 검증.
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 파일과 보안 앱 컨테이너 지원
• 구글에서 지원하는 앱 검증 사용 가능