해당 도서의 7장_안드로이드의 이해 (197p-216p) 내용 정리
안드로이드 모델
안드로이드는 모바일 기기를 구동하기 위해 설계된 가장 대중적인 모바일 운영체제
오픈소스로 아파치 라이선스 하에 코드 공개되어 있음
→ 실질적으로 모든 사람이 코드에 접근 가능, 무료로 수정하며 기기의 요구사항에 따른 소프트웨어 사용할 수 있음
안드로이드 OS 사용하는 주요 제조사: 삼성, HTC, 소니, LG 등
리눅스 커널 계층
안드로이드 OS는 리눅스 커널 기반, 구글의 구조적 수정 통해 만들어짐
- 리눅스
- 여러 다른 하드웨어 상에서 쉽게 컴파일됨
- 이동성 있는 플랫폼
- 보안과 프로세스 관리에 있어서 검증된 플랫폼
- 커널
- 기기의 소프트웨어와 하드웨어 사이의 추상화 계층으로 동작
- 하드웨어 명령 → 소프트웨어 명령으로 변환하는 과정 수행을 위한 드라이버를 포함
- 와이파이, 블루투스, USB, 오디오, 디스플레이 등과 관련된 드라이버 포함
- 커널의 드라이버가 하드웨어를 제어
리눅스 커널은 프로세스 관리, 메모리 관리, 보안, 네트워킹 등 안드로이드의 핵심 기능을 관리
각 안드로이드 버전은 다른 버전의 리눅스 커널을 사용
라이브러리 계층
안드로이드의 네이티브 라이브러리들로 이루어진 계층
같은 계층에 안드로이드 런타임도 존재
C 또는 C++ 언어로 작성, 기기가 다양한 종류의 데이터 다룰 수 있게 도움
- SQLite 라이브러리
- 데이터베이스에 자료 저장하고 불러오는 데 유용
- Media Framework 라이브러리
- 다른 라이브러리들에 서비스 제공하는 주요 인터페이스로 동작
- WebKit 라이브러리
- 웹 브라우저에 웹 페이지 전달
- Surface manager 라이브러리
- 그래픽 담당
안드로이드 런타임
- 안드로이드 기기에서 애플리케이션 실행시키는 역할
- 런타임: 애플리케이션 시작되고 종료될 때까지의 시간
- 핵심 라이브러리
- 달빅 가상 머신(DVM, Dalvik Virtual Machine)
- 안드로이드 기기에 설치한 모든 애플리케이션은 자바 프로그래밍 언어로 작성되고, 자바 프로그래밍 컴파일 시 바이트코드 생성
- JVM(Java VM)은 바이트코드를 실행하는 가상 머신
- DVM은 Dex 컴파일러, 변환한 자바 바이트코드인 달빅 바이트코드를 실행
- dx 도구를 사용해 .class 파일들이 dex 파일로 변환됨.
- DVM은 JVM보다 낮은 메모리와 낮은 처리 환경에 더 적합
- 달빅 바이트코드는 오직 하나의 dex 파일로 구성, 각 안드로이드 애플리케이션은 자신만의 달빅 가상 머신을 실행
애플리케이션 프레임워크 계층
자원 관리, 통화 관리 등 폰의 기본적인 기능 다루는 계층
기기에 설치된 애플리케이션이 직접 통신하는 블록
애플리케이션 프레임워크 계층의 주요 블록 ▼
- Telephony Manager: 음성 통화를 관리
- Context Provider: 다른 애플리케이션 간 데이터 공유를 관리
- Resource Manager: 애플리케이션이 사용하는 다양한 자원 관리
애플리케이션 계층
최상위 계층으로, 사용자가 기기와 직접 상호작용하는 부분
기기에서 볼 수 있는 모든 것(주소록, 메일, 카메라 등)은 애플리케이션
- 미리 설치된 애플리케이션
- 기기와 함께 제공됨
- 전화 걸기, 웹 브라우저, 주소록 등
- 사용자가 설치한 애플리케이션
- 구글 플레이 스토어, 아마존 마켓플레이스 등을 통해 다운로드 가능
안드로이드 보안
안드로이드는 보안에 대해 특히 집중하여 설계됨
플랫폼으로써의 안드로이드는 다계층 보안을 통해 기기에 존재하는 사용자 데이터에 대한 보안을 제공
사용자 보호를 위한 기본 설정과 안전한 애플리케이션 개발 위해 개발 커뮤니티에서 활용되는 기능들 존재
안드로이드 보안 제어와 관련되어 주의해야 하는 사항
- 사용자 관련 데이터 보호
- 시스템 자원 보호
- 애플리케이션 간 서로의 데이터 접근 금지
안전한 커널
안드로이드는 안전한 플랫폼인 리눅스를 커널로 사용해 안전성 확보
리눅스의 사용자 기반 퍼미션 모델은 안드로이드에서도 잘 동작함
출시된 안드로이드 버전 별로 커널 버전도 변화되어 왔다.
퍼미션 모델
애플리케이션이 인터넷, 전화 걸기 등 민감한 기능에 접근 위해서는 사용자로부터 퍼미션을 받아야 함
이 퍼미션을 통해 사용자는 애플리케이션이 기기의 어떤 기능에 접근하려는지 미리 알 수 있음
→ 어떤 종류의 악성 행위(데이터 훔치기, 시스템 감염 등)를 수행하기 위해 사용자의 허락을 요구
- 사용자가 공격 방지할 수 있도록 돕지만, 사용자가 인지하지 못하고 많은 퍼미션 허락한다면 문제 발생
애플리케이션 샌드박스
리눅스 시스템에서 각 사용자는 고유한 사용자 ID(UID) 할당받음
사용자들은 서로의 데이터에 접근하지 못하고, 특정 사용자가 실행한 모든 애플리케이션은 같은 권한으로 동작
안드로이드에서도 각 애플리케이션이 고유 사용자처럼 실행됨 → 각 애플리케이션에 UID가 할당되고 분리된 프로세스로 실행
해당 개념은 커널 레벨에서의 애플리케이션 샌드박스를 가능케 함.
- 커널은 애플리케이션 간 보안 제약을 UID, GID와 같은 기존 리눅스에서의 개념을 사용하여 관리
- 만약 애플리케이션이 다른 애플리케이션 데이터 읽는 등의 악성 행위 시도해도, 해당 사용자 권한 갖고 있지 않기 때문에 행위가 허락되지 않음
√ 애플리케이션이 다른 애플리케이션의 데이터에 접근하는 것을 운영체제가 보호
안전한 프로세스 간 통신
안드로이드는 같은 애플리케이션 내의 한 액티비티에서 다른 액티비티로 메시지 보내거나,
다른 애플리케이션의 액티비티로 메시지 보내는 것을 통해 안전한 프로세스 간 통신을 제공
- 안드로이드는 interprocess communication(IPC) 매커니즘 제공
- 인텐트
- 서비스
- content provider 등
애플리케이션 서명
설치된 모든 애플리케이션이 디지털적으로 서명되어야 하는 건 필수사항
개발자는 자신의 애플리케이션에 서명해야지만 구글 플레이스토어에 등록 가능
애플리케이션에 서명된 개인키는 개발자가 가지고 있음
→ 같은 키를 사용해 개발자는 애플리케이션의 업데이트 제공과 애플리케이션 간 데이터 공유를 수행
안드로이드 파일 계층
어떤 시스템(데스크탑 또는 모바일)에서 포렌식 분석 수행 위해서는 내부의 파일 계층 이해가 중요
안드로이드가 파일과 폴더에 자료를 어떻게 구성하는지에 대한 기본적 이해는 포렌식 분석가가 작업을 특정 문제로 축소하는 데 도움
리눅스의 파일 구조
- 단일 트리구조, 최상위 부분은 /(루트)로 표기됨
- 파일 시스템이 로컬이나 원격에 있는지 관계없이 루트 하위에 존재
- 안드로이드 파일 계층은 기존의 리눅스 계층을 수정한 버전
안드로이드 기기에 존재하는 중요한 폴더들
- /boot
- 폰이 부팅하는 데 필요한 정보와 파일을 가진 파티션
- 커널과 램디스크가 있는 파티션이라, 이 파티션 없이는 폰이 작동하지 않음
- 램 내부의 데이터는 매우 중요하기 때문에 포렌식 과정에서 반드시 수집되어야 함
- /system
- 커널과 램디스크 이외의 시스템 관련 파일을 포함
- 이 파티션 없이는 기기가 부팅되지 않음
- 해당 파티션의 콘텐츠 보기 위한 명령어 ▼
shell@Android:/ $ cd /system
cd /system
shell@Android:/system $ Is
Is
- /recovery
- 백업 목적으로 설계됨
- 기기가 복구 모드로 부팅하는 것을 가능하게 함
- 복구 모드에서 폰 설치를 복구할 수 있는 도구를 찾을 수 있음
- /data
- 각 애플리케이션의 데이터를 포함
- 주소록, SMS, 통화한 전화번호 등 사용자 관련 데이터 대부분이 이 폴더에 저장
- 해당 폴더의 콘텐츠 보기 위한 명령어 ▼
C:\Android-sdk-windows\platform-tools>adb.exe shell
root@Android:/ # cd /data
cd /data
root@Android:/data # Is
Is
- /cache
- 빠른 데이터 읽기를 위해 자주 접근되는 데이터와 몇 가지 로그를 저장
- 해당 파티션에 존재하는 데이터가 /data 파티션에 더이상 존재하지 않을 수 있기 때문에 이 파티션이 포렌식 조사에서 중요성을 지님
- /misc
- 기타 설정 정보를 담고 있음
- 설정들은 켜고 꺼짐 등의 대부분 기기의 상태를 정의
- 하드웨어 설정, USB 설정 등도 이 폴더에서 접근 가능
안드로이드 파일 시스템
파일 시스템의 속성과 구조에 대한 지식은 포렌식 과정에서 유용하게 사용됨
파일 시스템
- 데이터가 저장, 구성되고 볼륨에서 검색되는 방법을 의미
- 기본적인 설치는 여러 파티션으로 쪼개진 하나의 볼륨을 기반으로 하고, 각 파티션은 다른 파일 시스템이 관리
- 각 파일 시스템은 볼륨에 존재하는 파일 관리하기 위해 자신만의 규칙을 정의, 해당 규칙에 따라 각 파일 시스템은 다른 검색 속도, 보안, 크기 등을 제공
리눅스에서와 같이 안드로이드도 드라이브가 아닌 마운트 지점 활용, 여러 가지 파일 시스템을 사용
안드로이드 기기의 파일 시스템 보기
안드로이드 커널이 지원하는 파일 시스템은 proc 폴더에 있는 filesystems 파일의 내용을 확인하여 알 수 있음
해당 폴더의 콘텐츠 보기 위한 명령어 ▼
shell@Android: / $ cat /proc/filesysterns
cat /proc/filesys terns
- 첫 번째 열은 파일 시스템이 기기에 마운트되어 있는지 여부를 알려줌
- 이때, nodev로 표시되는 기기는 마운트되지 않은 것.
- 두 번째 열은 기기에 존재하는 모든 파일 시스템을 나타냄
이와 같은 mount 명령 통해 기기에 존재하는 파티션 나타낼 수 있음 ▼
shell@Android:/ $ mount
root 파일 시스템(rootfs)는 안드로이드의 주요 구성요소 중 하나로 기기를 부팅하는 데 필요한 모든 정보 담고 있음
/ (root 폴더)에 마운트되어 있음
기기가 부팅 과정 시작하면 기기는 많은 핵심 파일에 접근해야 하므로 root 파일 시스템을 마운트
sysfs 파일 시스템은 기기의 환경설정에 대한 정보를 담고 있으며 /sys 폴더에 마운트됨
다음 출력값은 안드로이드 기기의 sys 디렉토리 내부의 여러 폴더를 보여줌
이 폴더들에 존재하는 데이터 대부분이 환경설정과 연관되어 있기 때문에 포렌식 조사관에게 큰 중요성 주진 않음
그러나 특정 설정이 폰에 활성화되어 있는지 확인할 필요 있는 경우에 이 폴더를 조사하는 것이 도움됨
포렌식 수집에서 이 데이터를 가져오는 것은 조사 과정에서 데이터 변경되지 않음을 보장하는 가장 좋은 방법
devpts 파일 시스템은 안드로이드 기기의 터미널 세션과의 인터페이스 나타내며 /dev/pts에 마운트됨
proc 파일 시스템은 커널 데이터 구조, 프로세스와 다른 시스템과 관련된 정보를 /proc 디렉토리에 저장함
/proc/ 파일 시스템은 기기의 모든 사용 가능한 파일 시스템 목록을 나타냄
기기의 CPU에 대한 정보를 보여줌
tmpfs 파일 시스템은 램(휘발성 메모리)에 파일을 저장할 때 사용되는 임시 저장소
램을 사용하는 주요 장점은 빠른 접근과 검색이지만, 기기 재시작하거나 전원 꺼지면 이 데이터에 더이상 접근 불가
→ 기기 재시작되기 전 데이터 조사하거나 램 수집 방법을 통해 데이터 추출하는 것이 중요
EXT (Extended File System)
1992년에 리눅스 커널에 특화되어 출시
첫 번째 파일 시스템 중의 하나였으며 가상 파일 시스템을 사용
이후 EXT2, EXT3, EXT4도 출시됨
EXT3
- EXT2와 비교했을 때 저널링(Journaling)이라는 주요 장점을 가짐
- 예상치 못한 전원 꺼짐에도 파일 시스템 검증할 필요 없음
EXT4
- 네 번째 확장 파일 시스템
- 듀얼 코어 프로세서를 장착한 모바일 기기와 함께 주목받아옴
- 안드로이드의 Gingerbread 버전에서 YAFFS 파일시스템(듀얼 코어 시스템의 병목으로 알려져옴)을 대체함
FAT32
- 마이크로소프트의 FAT32 파일 시스템은 대부분의 안드로이드 기기와 윈도우, 리눅스, 맥OS를 포함한 대부분의 주요 운영체제에서 지원
- 이 시스템은 시스템이 안드로이드 기기의 FAT32 영역에 있는 파일을 쉽게 읽고, 수정하고, 삭제할 수 있게 함
- 대부분의 외부 SD 카드는 FAT32 파일 시스템을 사용해 포맷됨
- VFAT는 FAT16과 FAT32 파일 시스템의 확장 버전
YAFFS2(Yet Another Flash File System 2)
- 2002년에 출시된 오픈소스, 단일 스레드 파일 시스템
- NAND 플래시를 다룰 때 빠르도록 설계됨
- 포렌식 과정에서 제대로 수집되지 않는 OOB(Out Of Band)를 활용하기 때문에 분석을 힘들게 함
- 가장 대중적인 시스템이었으며 여전히 안드로이드 기기에서 널리 사용되고 있음
- 로그 구조의 파일 시스템, 갑작스러운 정전에도 데이터 무결성이 보장됨
- 현재 새로운 커널 버전에서는 YAFFS2 지원되지 않지만 특정 모바일 제조사는 여전히 지원
F2FS(Flash Friendly File System)
- 2013년 2월에 리눅스 3.8 커널을 운영하는 삼성 기기를 지원하기 위해 출시
- NANA 플래시 메모리를 최적화하는 로그 구조 기반의 방법을 사용
- 오프라인 지원 기능이 주요 장점
- 아직 대중적이지 않으며 업데이트가 되고 있음
RFS(Robust File System)
- 삼성 기기에서 NAND 플래시 메모리를 지원
- 저널링이 트랜젝션 로그를 통해 지원되는 FAT16(또는 FAT32) 파일 시스템이라고 요약 가능
- 지연 시간을 가지며 안드로이드 기능의 속도를 느리게 한다고 알려져 있음
'SWUFORCE > 모바일 포렌식' 카테고리의 다른 글
[모바일 포렌식] 9_안드로이드 데이터 추출 기법 (5) | 2024.11.13 |
---|---|
[모바일 포렌식] 8_안드로이드 포렌식 셋업과 데이터 사전 추출 기법 (5) | 2024.11.05 |
[모바일 포렌식] 모바일 포렌식 입문 (9) | 2024.10.08 |
[고려대 정보보호대학원] 모바일 포렌식 분석 (1) | 2024.10.01 |
[고려대 정보보호대학원] 모바일 포렌식 수집: 아이폰 (0) | 2024.10.01 |