Android 보안 위협
Android 공격
- 포렌식
- 공격자는 피해자의 단말기를 탈취한 후 메모리와 디스크 정보를 덤프하여 개인 중요 정보들을 탈취
- 코드 실행
- 공격자가 피해자 단말기에서 실행되는 앱의 임의 코드 실행 취약점을 이용해 피해자의 단말기에서 임의 코드를 실행하여 단말기 장악
- 웹 기반
- 공격자가 웹 뷰를 통해 만들어진 앱에서 웹 취약점을 통해 사용자 및 서버 공격
- 악성 앱
- 공격자는 유명한 앱의 서명 개인키를 탈취해 악성 코드를 삽입한 업데이트 버전을 배포하는 방식으로 공격
Android 이해
AOSP (Android Open Source Project)
- Android는 휴대기기용 오픈소스 운영체제이며 Google이 주도하는 오픈소스 프로젝트
- 인터페이스 및 아키텍처
- Android 보안
- 호환 기기 설계
Architecture
- Android는 다양한 폼 팩터를 사용하는 다양한 기기에 사용할 수 있도록 제작된 오픈소스 소프트웨어 스택
Linux Kernel
- 리눅스 계열을 사용하는 Android의 핵심으로 하트웨어와 우리가 사용하고 있는 OS를 연결시켜주는 다리와 같은 존재 (보안, 자원관리, 추상화, 하드웨어 드라이버, 전력관리)
- 리눅스 계열의 OS
Binder
- Android 전용 프로세스 간 통신 메커니즘 및 원격 메소드 호출 시스템
Ashmem (Andriod Shared Memory)
- Android 공유 메모리
Pmem (Process Memory allocator)
- 프로세스 메모리 할당 자
Logger
- logcat 명령에 대한 kernel 지원
HAL
- 하드웨어 추상화 계층(Hardware Abstraction Layer)은 하드웨어에 대한 공통 명령어 집합들로 이루어져 있으며, 프레임워크의 요청에 따라 해당 하드웨어 라이브러리 모듈을 제공

Runtime
- AOT(Ahead Of Time), JIT(Just In Time) 컴파일
- 최적화된 GC(Garbage Collector : 메모리 관리)
Native Libraries
- ART 및 HAL 등의 많은 핵심 Android 시스템 구성 요소와 서비스는 C 및 C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드 기반으로 빌드 되어 있음
NDK(Native Development Kit)
- C/C++ 등의 언어로 앱 일부를 구현할 수 있는 도구
- C/C++ 로 구현된 코드를 Android에서 사용될 수 있는 Library나 Binary로 만들어 줌
JNI(Java Native Interface)
- Java 코드에서 C/C++ 로 만들어진 Library를 사용 가능하게 해주는 인터페이스 제공
- Java 코드에 Native 함수를 선언하면, Java는 Library 파일(*.so)에서 매핑되는 함수를 찾음
NDK & JNI 연동
- JNI 정보를 담고 있는 JNI_OnLoad() 함수가 로드하려는 Library 파일 안에 구현되어 있을 경우 수동 매핑, 구현되어 있지 않을 경우 자동 매핑이 이루어짐
Android Framework
- Java API 프레임워크
- 핵심 시스템 구성요소 모듈과 서비스 재사용을 단순화하여 어플리케이션을 제작하는데 필요한 기능을 제공
- 뷰 시스템, 리소스 매니저, 알림 매니저, 액티비티 매니저, 콘텐츠 제공자
Applications
- 사용자들과 만나는 최상위 계층
- Android에서 제작되어 기본적으로 설치되는 앱(사전 설치)과 사용 자가 설치한 앱(사용자 설치) 두가지로 나뉨
Android Booting Process
- Power On : 물리적 하드웨어에 전원 공급
- Boot Loader : ROM에 저장되어 있는 Boot ROM 코드 실행 → RAM에 Boot Loader 로드
- Kernel : Init Process 실행
- Init : /sys, /dev, /proc 디렉터리 마운드 init.rc 스크립트 실행
- Zygote : Dalvik VM 초기화 및 실행 시키고 Android 디바이스에서 App 실행 시 메모리 사용량을 최소화하기 위한 준비를 함
- System Server & Managers : Native Library를 call하여 Native System service 구동 → Java System service 구동
Rooting
- Android에 적용된 제한들을 제거하기 위한 목적으로 행하는 Android 디바이스의 권한 상승
Rooting 목적
- OS 권한에 의해 제한되지 않고 Android 장치의 보안을 진단하기 위함
- OS 최고 권한 (root) 획득
- Filesystem Write 권한 획득
- 시스템 설정(firewalls, overclocking, ad-blockers 등) 변경 가능
Rooting 과정
Boot Loader Unlocked
- Custom ROM(Kernel), Custom Recovery 등을 설치하기 위함
Boot Loader
-
- Android OS 시동 전 실행되더 Kernel이 올바르게 실행되기 위한 관련 작업 수행
- 부팅 과정에서 System(clocks, keyboard, console 등)을 초기화하고 Kernel을 RAM에 로드
- Fastboot Mode
- Android 기기의 플래시 메모리에 직접 데이터를 쓰거나, 진단할 수 있는 엔지니어링 프로토콜
- 펌웨어 변경, 공장 초기화 등 기능 수행 가능
Custom Recovery Installed
- Android 기기 유지 관리 기능을 제공
- 안전 장치 역할로 미니멀한 Android boot image를 가지고 있음
- Android 펌웨어 업데이트를 수동이나 OTA 방식으로 관리
- Android 기기 호환성에 필요한 최소한의 기능만 사용 가능
- 서명값을 검증하여 인증된 펌웨어만 사용 가능
Custom ROM Installed
- Custom Recovery를 활용하여 최고 권한이 있는 Custom ROM을 기기에 설치하여 Rooting의 목표인 최고 권한(root) 획득 가능
- Android ROM
- Android 플랫폼을 기반으로 하는 기기의 펌웨어
- Custom ROM
- Android ROM에 최고 권한을 사용할 수 있도록 system image에 setuid 권한을 가진 su binary 추가
- 추가적으로 원하는 기능들 수정 (ex. supersu)
DEX (Dalvik Executable)
- Android Application은 Dalvik VM에서 더 효과적으로 실행되기 위해 개발자가 JDK로 코드를 컴파일하여 만든 바이트 코드로, Dalvik VM에서 DEX 파일로 변환되어 실행
Smali
- Dalvik byte code를 위한 어셈블리 언어
- 기계어 형태로 되어있으며 원하는 부분의 코드 패치가 가능
코드 서명
- 앱 개발자가 누구인지 나타내기 위해 개발자 자신의 코드 서명 인증서로 서명하는 것
- S/W → Hash 값 → 코드 서명 값(Signed Hash) → S/W 배포
코드 서명 목적
- 악의적인 사용자가 패치한 앱의 배포를 막기 위해
Android Application 구조 및 동작
APK (Android Package) 구조
Application
assets : 앱 실행에 필요한 자원(동영상 등 큰 파일)을 관리하는 폴더
res : 앱 실행에 필요한 자원(아이콘 등 작은 파일)을 관리하는 폴어
META-INF : 인증서명과 관련된 정보가 담겨있는 폴더
libs : 라이브러리 파일(*.so)이 들어있는 폴더
AndroidManifest.xml : Android 정의 파일로 Android App 정보(접근 권한, 버전 등)가 들어 있는 파일
resources.arsc : 파일 리소스의 배열이라는 뜻. res 정보가 들어있는 파일
class.dex : Android 가상머신 Dalvik이 인식할 수 있도록 *.class 파일을 바이트 코드로 변환 시킨 소스 파일
AndroidManifest.xml
- 고유한 패키지 이름
- Activity, Service, Broadcast Receiver, Instrumentation Definiton
- 권한 정의
- 응용 프로그램과 함께 패키지 되어 사용되는 외부 라이브러리에 대한 정보
- 공유 UID 정보, 기본 설치 위치 및 UI 정보
- package : 패키지 이름
- uses-permission : 권한 (읽기, 쓰기, 외부와 통신 가능한 권한)
- debuggable : true - 디버깅 가능(취약)
- allowBackup : true - 백업 가능
- activity : 속성, 설정 등 확인 가능
- provider : true - 외부 앱에서 해당 provider 사용 가능 (권한 검증이 있는지 확인해봐야됨)
공유 UID(프로세스에 대한 고유 사용자)
- 두 개 이상의 어플리케이션에서 동일한 사용자 식별자 지정이 가능함
- 앱들은 동일한 UID에서 실행되는데, 이를 통해 동일 UID를 가진 앱은 잠재적으로 서로의 리소스에 접근 가능
Activity
- 사용자와 상호작용하기 위한 진입점으로 UI를 포함한 화면 하나를 나타냄
- 사용자가 현재 관심을 가지고 있는 화면을 추적하여 계속 실행하게 함
- Activity Manager에서 위와 같은 일들을 처리함
Service
- 백그라운드에서 앱을 계속 실행하기 위한 진입점으로 백그라운드에서 실행됨
- 오랫동안 실행되는 작업을 수행하거나 원격 프로세스를 위한 작업 수행
Broadcast Receiver
- 시스템이 정기적인 사용자 플로우 밖에서 이벤트를 앱에 전달하도록 지원
- 앱이 시스템 전체의 브로드캐스트 알림에 응답할 수 있도록 도와줌
Content Providers
- 파일 시스템, SQLite DB, 웹 상이나 앱이 앤세스할 수 있는 다른 영구 저장 위치에 저장 가능한 앱 데이터의 공유에 있어 읽기, 쓰기 권한 관리 역할
- Content Providers를 구성하여 다른 어플리케이션들과 안전하게 데이터 공유 가능
'Android App' 카테고리의 다른 글
| Android Application 분석 방법 (0) | 2025.11.19 |
|---|---|
| Android Mobile Solution 분석 (0) | 2025.11.19 |
| Android 진단 환경 구축 (0) | 2025.11.19 |