Adnroid# Platform-Overview
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05a-Platform-Overview.md
Android Platform Overview
이 섹션에서는 아키텍쳐 관점에서 안드로이드 플랫폼을 소개합니다. 다음과 같은 네 가지 핵심 영역에 대해 논의합니다.
- Android security architecture
- Android application structure
- Inter-process Communication (IPC)
- Android application publishing
Android 플랫폼에 대한 자세한 내용은 공식 Android 개발자 문서 웹 사이트를 참조하십시오.
Android Security Architecture
안드로이드는 Google이 모바일 운영체제 (OS)로 개발 한 Linux 기반 오픈 소스 플랫폼입니다. 현재 이 플랫폼은 휴대 전화, 태블릿, 웨어러블 기술, TV 및 기타 "Smart"디바이스와 같은 다양한 최신 기술의 기반이됩니다. 일반적인 Android 빌드는 미리 설치된 다양한("stock")앱과 함께 제공되며 Google Play 스토어 및 기타 마켓을 통해 third-party 앱 설치를 지원합니다.
Android의 소프트웨어 스택은 여러 가지 레이어로 구성됩니다. 각 계층은 인터페이스를 정의하고 특정 서비스를 제공합니다.
가장 낮은 레벨에서 안드로이드는 Linux Kernel의 변형을 기반으로합니다. 커널 위에 존재하는 HAL (Hardware Abstraction Layer)은 기본 제공 하드웨어 컴포넌트와 상호 작용할 수 있는 표준 인터페이스를 정의합니다. 이는 애플리케이션이 장치의 하드웨어와 상호 작용할 수 있도록 하는 기반입니다. 예를 들어 스톡 전화 애플리케이션에서 장치의 마이크와 스피커를 사용할 수 있습니다.
안드로이드 애플리케이션은 일반적으로 Java로 작성되고 Dalvik 바이트 코드로 컴파일됩니다. 이는 전통적인 Java 바이트 코드와 다소 다릅니다. Dalvik 바이트 코드는 먼저 Java 코드를 .class 파일로 컴파일 한 다음 dx 도구를 사용하여 JVM 바이트 코드를 Dalvik .dex 형식으로 변환하여 만듭니다.
현재 Android 버전은 Android 런타임 (ART)에서 이 바이트 코드를 실행합니다. ART는 Android 오리지널 런타임 Dalvik Virtual Machine의 후속 제품입니다. Dalvik과 ART의 주요 차이점은 바이트 코드가 실행되는 방식입니다.
Dalvik에서 바이트 코드는 JIT (Just-In-Time) 컴파일로 알려진 프로세스에서 실행시점에 machine code로 변환됩니다. 컴파일은 앱이 실행될 때마다 수행되기 때문에 JIT 컴파일은 성능에 나쁜 영향을 줍니다. 성능 향상을 위해 ART는 AOT (ahead-of-time) 컴파일을 도입했습니다. 이름에서 알 수 있듯이 앱은 처음 실행되기 전에 미리 컴파일됩니다. 이 사전에 컴파일 된 machine code는 모든 후속 실행에 사용됩니다. AOT는 전력 소모를 줄이면서 성능을 2배 향상시킵니다.
Android 앱은 하드웨어 리소스에 직접 액세스 할 수 없으며 각 앱은 자체 샌드 박스에서 실행됩니다. 이렇게하면 리소스와 앱을 정밀하게 제어 할 수 있습니다. 예를 들어, 충돌하는 앱은 기기에서 실행중인 다른 앱에는 영향을 미치지 않습니다. 동시에 Android 런타임은 앱에 할당 된 시스템 리소스의 최대 개수를 제어하여 하나의 앱이 너무 많은 리소스를 독점하지 못하게합니다.
Android Users and Groups
안드로이드 운영체제는 리눅스 기반이지만 다른 유닉스 계열 시스템처럼 사용자 계정을 구현하지 않습니다. 안드로이드에서는 샌드 박스 애플리케이션으로 리눅스 커널의 다중 사용자를 지원 합니다. : 몇 가지 예외는 있지만 각 애플리케이션은 다른 Linux 사용자와 마찬가지로 실행되며 다른 애플리케이션 및 나머지 운영 체제와 효과적으로 격리됩니다.
system/core/include/private/android_filesystem_config.h 파일 에는 시스템 프로세스가 할당 된 사전 정의 된 사용자 및 그룹 목록이 포함됩니다. 자세한 내용은 Bin Chen의 Android sandboxing 블로그 게시물을 확인하십시오.
예를 들어, Android Nougat는 다음 시스템 사용자를 정의합니다.
#define AID_ROOT 0 /* traditional unix root user */ #define AID_SYSTEM 1000 /* system server */ ... #define AID_SHELL 2000 /* adb and debug shell user */ ... #define AID_APP 10000 /* first app user */ ... |
Android Application Structure
Communication with the Operating System
안드로이드 애플 리케이션은 안드로이드 프레임 워크, 높은 수준의 자바 API를 제공하는 추상화 계층을 통해 시스템 서비스와 상호 작용합니다. 이러한 서비스의 대부분은 일반적인 Java 메소드 호출을 통해 호출되며 백그라운드에서 실행중인 시스템 서비스에 대한 IPC 호출로 변환됩니다. 시스템 서비스의 예는 다음과 같습니다.
- Connectivity (Wi-Fi, Bluetooth, NFC, etc.) - Giles - Cameras - Geolocation (GPS) - Microphone |
프레임 워크는 또한 암호화와 같은 일반적인 보안 기능을 제공합니다.
새로운 Android 버전이 출시 될 때마다 API 사양이 변경됩니다. 중요한 버그 수정 및 보안 패치는 일반적으로 이전 버전에도 적용됩니다. 작성 당시에 지원 된 가장 오래된 Android 버전은 4.4 (KitKat), API 레벨 19, 현재 Android 버전은 7.1 (Nougat), API 레벨 25입니다.
- 2012년 11월 Android 4.2 Jelly Bean (API 16) (SELinux 소개)
- 2013년 07월 Android 4.3 Jelly Bean (API 18) (SELinux 기본적으로 사용)
- 2013년 10월 Android 4.4 KitKat (API 19) (몇가지 새로운 API 및 ART 도입)
- 2014년 11월 Android 5.0 Lollipop (API 21) (ART는 기본적으로 사용되며 다른 많은 기능이 추가됨)
- 2015년 10월 Android 6.0 Marshmallow (API 23) (many new features and improvements, including granting; detailed permissions setup at run time rather than all or nothing during installation)
- 2016년 08월 Android 7.0 Nougat (API 24-25) (ART의 새로운 JIT 컴파일러)
- Android 8.0 O (API26) 베타 (주요 보안 수정 예정)
App Folder Structure
설치된 Android 앱은 /data/app/[package-name]에 있습니다. 예를 들어 YouTube 앱의 위치는 다음과 같습니다.
/data/app/com.google.android.youtube-1/base.apk |
Android Package Kit(APK) 파일은 앱을 실행하는데 필요한 코드와 리소스가 포함된 아카이브 파일 입니다. 이 파일은 개발자가 만든 서명된 원본 앱 패키지와 동일합니다. 실제로 다음 디렉토리 구조를 가진 ZIP 아카이브 입니다.
$ unzip base.apk $ ls -lah -rw-r--r-- 1 sven staff 11K Dec 5 14:45 AndroidManifest.xml drwxr-xr-x 5 sven staff 170B Dec 5 16:18 META-INF drwxr-xr-x 6 sven staff 204B Dec 5 16:17 assets -rw-r--r-- 1 sven staff 3.5M Dec 5 14:41 classes.dex drwxr-xr-x 3 sven staff 102B Dec 5 16:18 lib drwxr-xr-x 27 sven staff 918B Dec 5 16:17 res -rw-r--r-- 1 sven staff 241K Dec 5 14:45 resources.arsc |
- AndroidManifest.xml : 앱의 패키지 이름, 대상 및 최소 API 버전, 앱 구성, 컴포넌트, 사용자가 부여한 권한 등의 정의를 포함합니다.
- META-INF : 앱의 metadata를 포함 합니다.
- MANIFEST.MF : 앱 리소스의 해시를 저장합니다.
- CERT.RSA : 앱의 인증서
- CERT.SF : MANIFEST.MF 파일의 해당 라인에 대한 리소스 목록 및 SHA-1 다이제스트
- assets : AssetManager가 검색할 수 있는 app asset (XML 파일, JavaScript 파일 및 그림과 같은 Android 앱 내에서 사용되는 파일)을 포함하는 디렉터리
- classes.dex : Dalvik virtual machine / Android Runtime이 처리할 수 있는 DEX파일 형식으로 컴파일 된 class. DEX는 Dalvik Virtual Machine용 Java Bytecode입니다.
- lib : APK의 일부인 라이브러리가 들어있는 디렉토리입니다. (예 : Android SDK에 포함되지 않은 타사 라이브러리)
- res : resources.arsc로 컴파일되지 않은 자원을 포함하는 디렉토리
- resources.arsc : 레이아웃을위한 XML 파일과 같은 미리 컴파일 된 리소스를 포함하는 파일
아카이브를 unzip 유틸리티로 압축을 풀면 일부 파일을 읽을 수 없게됩니다. AndroidManifest.XML은 텍스트 편집기로 읽을 수없는 바이너리 XML 형식으로 인코딩됩니다.