책 소개
요약
안드로이드의 기반인 리눅스 시스템 및 구성 요소, 그리고 안드로이드 가상 머신을 소스 레벨에서 설명하고 있기 때문에 안드로이드의 내부 동작 모습을 깊이 살펴보거나 안드로이드를 디바이스에 포팅하고자 하는 사람 및 안드로이드 보안에 관심이 있는 모든 사람에게 많은 도움이 될 것이다.
이 책에서 다루는 내용
■ 파티션 및 파일시스템
■ 부트 프로세스
■ Init 및 Init 설정 파일
■ /system/bin의 네이티브 데몬
■ 프레임워크 서비스 아키텍처와 servicemanager
■ 리눅스 인터페이스를 통한 모니터링
■ 보안
이 책의 구성
1장에서는 운영체제를 소개한다. OS 버전별로(지금은 사용되지 않는 프로요(Froyo)부터 L 버전까지) 개선된 내용을 살펴본다. 또한 고수준의 관점에서 아키텍처를 설명하고, 안드로이드 스택의 각 레이어들을 알아보면서 리눅스의 토대를 살펴본다. 그런 다음 구글과 다른 벤더(예를 들면, 아마존 FireOS)의 안드로이드 변형 제품을 살펴보고, 향후의 방향과 몇 가지 논의에 대한 결론을 내린다.
2장에서는 좀 더 기술적으로 들어간다. 특히 안드로이드 파티션과 파일시스템을 다룬다. 안드로이드에서 사용되는 파티셔닝 스키마(불행하게도 표준화되어 있지 않다)와 파일시스템(Ext4와 F2FS)을 살펴본다. 다음으로 특정 시스템 디렉터리나 파일이 포함되어 있는지 알아내고자 할 때 유용한 ‘파일시스템 내용을 탐색하는 방법’을 알아본다. 그리고 포렌식을 수행할 경우에 편리하게 이용할 수 있는 내장 앱 데이터 디렉터리를 살펴본다. 또한 이 장에서는 안드로이드의 ‘보호된 파일시스템(OBB와 ASEC)’을 다룬다. 물론 루팅된 디바이스에서는 이 파일시스템이 보호되지 않는다. 마지막으로 리눅스의 가상(pseudo) 파일시스템인 cgroupfs, debugfs, procfs, sysfs 등을 설명한다.
3장은 이전에 배운 내용을 토대로 한다. 특히 파티션을 주로 다루면서 안드로이드 부트 프로세스 내에서의 파티션 역할에 대해 설명한다. 또한 안드로이드 부트 이미지(일부에서는 ‘ROM’이라는 용어로 사용되는데, 이는 틀리다)에 대해 설명하고, 디바이스 부트 파티션으로 전송하는 방법을 알아본다. 이 밖에 기본 안드로이드 부트 로더를 설명하고(좀 더 깊이 있는 내용은 이 책과 관련된 웹사이트에서 찾아볼 수 있다) 부트 이미지의 다른 컴포넌트(커널, 디바이스 트리 및 initramfs)를 상세하게 설명한다. 그리고 실험을 통해 이 컴포넌트들을 풀거나, 커스터마이즈하거나, 다시 묶는 방법을 설명한다(부트로더는 언록되어 있다고 가정한다). 또한 OTA 업데이트를 통해 이미지를 전송하는 방법과 백업 및 복구 프로세스 및 셧다운 프로세스에 대해서도 살펴본다.
4장에서는 하나의 프로세스(/init)에 대해서만 살펴본다. 이 프로세스는 UN*X에서와 같이 유저 모드에서 시스템을 시작할 책임이 있다. /init.rc 파일 구문을 자세히 살펴보면서 시동 프로세스를 자세히 설명한다. 또한 시스템 속성 관리 및 하드웨어 변경 내역 감시(ueventd)와 같은 /init의 다른 역할을 자세히 설명한다.
5장에서는 네이티브 서비스에 대해 논의한다. 예를 들어 네이티브 서비스는 /init.rc에 나와 있고, 리눅스 바이너리로 적재된다(system_server 내의 스레드로 적재되는 달빅-레벨 프레임워크와 대비된다. 달빅-레벨 프레임워크는 2권에서 다룬다). 또한 이번 장에서는 디바이스에서 볼 수 있는 모든 데몬에 대한 참조를 다룬다.
6장에서는 안드로이드에서 모든 프레임워크의 기반 역할을 하는 servicemanager 및 system_service 프로세스를 설명하면서 안드로이드 프레임워크 서비스 아키텍처에 대해 다룬다. 이번 장에서는 바인더에 대해 설명하지만, 대부분의 내용은 2권에서 살펴볼 것이다. 하지만 독자들이 안드로이드 인터널 커뮤니케이션과 리모트 프로시저 호출이 동작하는 방식에 대한 충분한 통찰력을 얻을 수 있도록 충분히 설명한다.
7장에서는 리눅스의 관점에서 안드로이드를 바라본다. 즉, 리눅스 레벨의 도구와 /proc 파일시스템을 통해 안드로이드 시스템 프로세스와 앱을 살펴본다. 또한 네이티브 레벨에 디버깅하기 위한 리눅스 시스템의 거의 모든 기술을 다룬다.
마지막 장인 8장에서는 보안에 대해 논의한다. 이 장은 미리보기용으로 만들었다(원래는 이 책을 21장으로 구성된 한 권의 책으로 만들려고 했다). 여기서는 리눅스 레벨과 프레임워크 레벨에서의 보안 기능에 대해 자세히 알아본다. 또한 ’승인’된 방법 및 뜻밖의 방법으로 안드로이드 디바이스를 루팅하는 방법을 살펴본다
목차
목차
- 1. 안드로이드 아키텍처의 진화
- 안드로이드 버전의 이력
- 프로요
- 진저브레드
- 허니콤
- 아이스크림 샌드위치
- 젤리빈
- 키켓
- 롤리팝
- 마시멜로
- 안드로이드 대 리눅스
- 리눅스의 또 다른 배포판이 아니다
- 그러고 나서 안드로이드가 왔다
- 리눅스와의 공통점과 차이점
- 안드로이드 프레임워크
- 달빅 가상 머신
- JNI
- 네이티브 라이브러리
- 바이오닉(Bionic)
- 안드로이드 네이티브 라이브러리
- 외부 네이티브 라이브러리
- 하드웨어 추상화 레이어
- 리눅스 커널
- 안드로이드 파생물
- 구글에서 만든 파생물
- 구글이 아닌 곳에서 만든 파생물
- 생각해보기
- 64비트 호환성
- 안드로이드 런타임(ART)
- 분할-화면
- 데스크톱 OS로서의 안드로이드
- 안드로이드와 프로젝트 아라
- 브릴로
- 요약
- 참조
- 안드로이드 버전의 이력
- 2. 안드로이드 파티션 및 파일시스템
- 파티셔닝 스키마
- 별도의 파티션에 대한 필요성
- GUID 파티션 테이블
- 플래시 저장 시스템
- 파일시스템
- 안드로이드 디바이스 파티션
- 안드로이드 파일시스템 콘텐츠
- 루트 파일시스템
- /system
- /system/bin
- /system/xbin
- /system/lib[64]
- /system/etc
- /data
- /data/data
- /data/misc
- /data/system
- /cache
- /vendor
- SD 카드
- 보호된 파일시스템
- OBB
- ASec
- 리눅스 가상 파일시스템
- cgroupfs
- debugfs
- functionfs(/dev/usb-ffs/adb)
- procfs(/proc)
- pstore(/sys/fs/pstore)
- SELinuxfs(/sys/fs/selinux)
- sysfs(/sys)
- 요약
- 참조
- 파티셔닝 스키마
- 3. 안드로이드 부팅, 백업 및 복구
- 안드로이드 이미지
- 부트로더
- 부트로더 이미지
- 부트로더 잠금
- 부트 이미지
- 커널
- 디바이스 트리(ARM)
- 램디스크
- 시스템 및 데이터 파티션
- 부트 프로세스
- 펌웨어 부트
- 커널 부트
- 종료 및 재부팅
- 안드로이드 백업 및 복구
- 커맨드 라인 도구
- 로컬 백업
- 백업 동작 모니터링
- 시스템 복구 및 업데이트
- OTA 업데이트
- OTA 업데이트 프로세스
- 이미지 커스터마이징
- 이미지 변경을 위한 리소스
- 요약
- 참조
- 안드로이드 이미지
- 4. init
- init의 역할과 책임
- 시스템 프로퍼티
- .rc 파일
- 종합: init의 흐름
- Init 및 USB
- init의 다른 역할
- ueventd
- watchdogd
- 요약
- 이번 장에서 설명한 파일들
- init의 역할과 책임
- 5. 안드로이드 데몬
- 핵심 서비스
- adbd
- healthd
- lmkd (안드로이드 L)
- logd(안드로이드 L)
- vold
- 네트워크 서비스
- netd
- mdnsd
- mtpd
- racoon
- rild
- 그래픽 및 미디어 서비스
- 부트애니메이션
- mediaserver
- drmserver
- 다른 서비스들
- installd
- Commands
- 키스토어
- debuggerd[64]
- sdcard
- 자이고트[64]
- 요약
- 이번 장에서 설명한 파일들
- 참조
- 핵심 서비스
- 6. 프레임워크 서비스 아키텍처
- 서비스 매니저 다시 살펴보기
- 서비스 호출 패턴
- 장단점들
- 직렬화와 AIDL(Android Interface Definition Language)
- 바인더(Binder)
- 짧은 역사
- 그러면 정확하게 바인더는 무엇일까?
- 바인더 사용하기
- 바인더 추적하기
- system_server
- 시작 및 흐름
- 시작 동작 변경하기
- 요약
- 이번 장에서 사용된 파일
- 참조
- 7. 리눅스 렌즈를 이용해 안드로이드 살펴보기
- /proc, revisited
- 심링크: cwd, exe, root
- fdinfo
- status
- pid, tid, tgid 및 ppid 정리하기
- 스레드 상태 및 컨텍스트 스위칭
- 사용자 모드 메모리 관리
- 가상 메모리 분류 및 생명주기
- 메모리 메트릭
- 아웃 오브 메모리 조건
- 시스템 호출 추적하기
- toolbox ps 툴
- wchan 및 syscall
- strace 툴
- 요약
- 이번 장에서 사용된 참조 및 설명한 파일
- /proc, revisited
- 8. 안드로이드 보안
- 모바일 보안 위협 모델링
- 공격 경로
- 로드맵
- 리눅스 레벨의 보안
- 리눅스 퍼미션
- 리눅스 케이퍼빌리티
- SELinux
- 주목할 만한 다른 특징들
- 달빅 레벨의 보안
- 달빅 레벨 퍼미션
- 달빅 코드 서명
- 사용자 레벨 보안
- 잠금 화면
- 멀티-유저 지원
- 키 매니지먼트
- 인증서 관리
- 비밀 및 개인 키 관리
- 스토리지 보안
- /data 암호화
- 시큐어 부트
- 안드로이드 루팅
- 루트로 부트하기
- 취약점을 악용해 루팅하기
- 요약
- 참조
- 모바일 보안 위협 모델링