컴퓨터공학 전공생의 보안 도전기✌

[안드로이드 리버싱] Week 3 본문

Security/Mobile

[안드로이드 리버싱] Week 3

A7uly 2022. 1. 20. 16:59

안드로이드 보안 모델

애플리케이션 격리: sandbox, permission, trustzone

플랫폼 강화: selinux, aslr, exploit mitigation

디바이스 무결성: data encryption

업무를 위한 기능: 프로세스 기업 서비스

안드로이드 보안 모델 3계층

  1. OS 보안

리눅스 커널이 제공하는 사용자 기반 보호 기능을 활용하여 앱 리소스를 식별하고 서로 분리.

SELinux

최근에는 강제 접근 제어 등을 포함하는 접근 제어 보안 정책을 지원하는 이눅스 커널 보안 모듈이 적용됙 있다.

앱 샌드박스 (격리)

미국에서 어린아이를 보호하기 위해 모래통(Sandbox)에서만 놀도록 하는데서 유래한 보안 모델을 말한다.

악의적인 외부 프로그램으로부터 보호된 앱에 접근을 방지하기 위해서.

그리고 내부 os 컴포넌트들도 보호하기 위해서.

 

앱 설치 시 각 앱마다 고유한 UID(user id)를 할당하고 자체 프로세스 내에서 앱을 실행

각 앱은 자신만이 읽고 쓸 수 있는 전용 디렉터리를 부여받음.

uid를 통해 앱에 대한 접근을 통제한다. 다른 앱의 데이터나 시스템에 권한없이는 접근이 불가능.

Verified Boot

부팅 시 커널의 무결성을 검증.

실행된 코드가 신뢰할 수 있는 소스인지를 보장해주기 위한 것.

신뢰의 체인...? 이라는 것을 만들어서 각 구간별로 악의적인 변경이 있는지를 검사해서 하나라도 다르면, invaild하다고 판결.

디바이스에 변경 불가능한 하드웨어 고유의 키를 저장해 구현한다고 함.

 

2. 앱 보안

permission

앱은 androidmanifest.xml 에 이 앱에 대한 권한정보를 명시한다. 앱이 요청하고 있는 권한을 검사하고 허용 여부를 결절한 후 설치된다.

다른 앱이 권한을 부여받기 위해서는 허가가 필요.

 

개발자 서명을 통해 앱 배포 및 업데이트에서 보안을 강화

 

data storage

내부 저장, 외부 저장, content provider 3가지를 지원

대칭키를 이용해 데이터를 암호화하여 저장한다.

그리고 사용자가 boot up을 하거나 unlock을 할때 복호화

 

개발자 서명, 키스토어 구조

앱 개발자가 앱을 생성하여 배포할 때, 이 앱의 개발자가 누구인지를 나타내기 위해 자신의 코드 서명인증서로 서명을 해야 한다. 누가 패키징 했는지를 기록하여 이후 악의적인 목적으로 리패키징하는 것을 구별할 수 있게한다.

안드로이드 기기가 앱 업데이트할 때 검증용도로도 사용. 서명 사용 시 업로드 키를 분실하거나 키가 도용된 경우 이를 다시 생성해야 한다.

모든 앱은 보안키(공개키, 비공개키 한쌍) 으로 서명된다. 공개 키+비공개키 소유자 식별 메타데이터가 포함된 공개키 인증서를 업데이트 시 그 업데이트 인증서와 일치하는 경우에만 수락.

 

이 서명은 key를 통해 할 수 있고 이 key들을 담을 수 있는 파일을 keystore라고 한다. 인증서와 비공개 키의 저장소 역할을 하는 바이너리 파일.

Keystore는 비공개키를 안전하게 보관하고 암복호화 및 인증과정에서만 정상적으로 키를 사용할 수 있도록 해주는 매커니즘이다. android system TEE(자원을 보호하는 영역) 영역에 존재 (apk가 아니라) 외부로의 키 추출 과정을 방어.

안드로이드 앱 빌드 프로세스 (컴파일, 패키징, 서명)

빌드 되기 전 : 소스코드, 리소스파일들, AIDL(service ipc definition) 파일들이 함께 있다.

컴파일

AAPT(android asset packaging tool) : androidmanifest.xml이나 activity를 위한 xml 파일들과 같은 리소스 파일들을 컴파일하여 R.java라는 클래스를 생성하고 특정 resource id로 매핑.

aidl tool : 프로세스 간 통신(IPC)으로 서로 통신을 위해 클라이언트와 서비스가 모두 동의한 프로그래밍 인터페이스인 .aidl 인터페이스를 자바 인터페이스로 만들어준다

소스 코드, R.java, java interface는 컴파일러를 이용해 자바 바이트코드(.class)로 변환된다.

DEX : .class 파일들을 모두 .dex 파일로 변환

패키징

apkbuilder: dex 파일과 컴파일된 리소스 파일들 등을 모두 합쳐 .apk로 패키징

서명

패키징 과정에서 keystore를 통해 서명도 함께.

.apk 파일이란? (dex, manifest, 구조 분석)

안드로이드 앱 확장자로 android package의 줄임말이다. 앱을 설치하는 역할을 하며 zip과 동일한 형식으로 압축되어 있다.

인증을 위해 서명도 포함됨.

  1. androidmanifest.xml
  2. resource
  3. dex

1번은 안드로이드 앱의 속성들을 정의하는 파일. 패키지명, 버전, 권한 등의 정보 기록. activity, service 등 앱 컴포넌트 등을 포함한다.

2번은 안드로이드의 이미지, 스타일(layout, 도형, 값 등)을 관리하는 파일

3번 dex는 달빅 실행 파일. 즉 *안드로이드 런타임에서 궁극적으로 실행되는 코드. 앱의 실질적인 실행 파일이다.

이밖에도 외부 라이브러리 저장되는 폴더, 앱 인증 및 서명 관련 데이터 저장되는 META-INF 폴더 등이 있다.

 

*안드로이드 런타임(ART) - 장치에 앱이 설치될 때 ART이 AOT파일 컴파일을 수행하여 바이트 코드를 장치의 프로세서가 필요로 하는 기계어로 변환

'Security > Mobile' 카테고리의 다른 글

[안드로이드 리버싱] Week 7: Android Hooking  (0) 2022.02.23
[안드로이드 리버싱] Week 5  (0) 2022.02.10