Season 1/기술 보안

[ Android ] 기초 정리 - Booting Process & Rooting

작성자 - LRTK

Booting Process

Android 장치 전원 리부팅 작업을 Android booting sequence이라고 합니다.

 

Boot Loader

Android 장치의 전원이 들어올 경우 미리 정의된 Boot code를 ROM에서 찾아서 실행합니다.

Boot code를 의해 Boot Loader이 RAM에 로드가 됩니다.

 

이는 운영체제가 실행되기 전에 실행되는 것으로, Boot Loader은 부팅 및 시스템 커널 검색을 단말기에 지시하는 하위코드입니다.

 

Boot Loader은 보통 비휘발성 메모리에 존재하며, 단말기 고유의 경우가 많습니다.

일반적인 위치는  <android source>/bootable/bootloader/legacy/usbloader 에 위치합니다.

 

Boot Loader는 Primary Boot Loader와 Secondary Boot Loader로 나뉩니다.

  • Primary Boot Loader
    칩셋에 저장되어 있으며, 외부 회로의 데이터 구성와 하드웨어 구성을 제어하고 Secondary Boot Loader를 실행합니다.
  • Secondary Boot Loader
    RAM 상에 상주하여 실행되며, Kernel의 구동에 필요한 네트워크, 메모리 등을 준비합니다.

 

Kernel

Android 커널은 Linux 커널과 유사한 방법으로 시작합니다.

커널이 부팅되면 캐시, 보호된 메모리, 스케줄링 및 드라이버 로드를 시작합니다.

 

커널은 시스템 셋업이 완료되면 시스템 파일에서 Init을 실행합니다.

 

Init

Init은 첫 번째 프로세스으로 모든 프로세스의 부모가 되는 프로세스입니다.

Init 위치 :  <android source>/system/core/init 

Init.rc 위치 :  <android source>/system/core/rootdir/ 

 

Init 프로세스에는 두 가지 작업을 수행합니다.

  • /sys, /dev, /proc 등의 디렉토리 마운트
  • /init.rc 스크립트 실행 (init.rc는 시스템의 초기 셋업 담당)

init.rc에선 부팅 시 안드로이드 로고 출력 작업을 수행합니다.

 

Zygote

Java에서는 애플리케이션별로 별도의 가상 머신 인스턴스가 메모리에 팝업되는 것을 알 수 있습니다.

Android 환경에서 각 애플리케이션이 있어서 여러 개의 Dalvik(VM) 인스턴스를 실행하면 엄청난 양의 메모리를 소비하게 됩니다.

 

이 문제를 극복하기 위해 Android에는 Zygote라는 시스템을 사용합니다.

Zygote를 사용하면 Dalvik VM 전체에서 코드를 공유할 수 있어 메모리 설치 공간을 줄이고 부팅 시간을 최소화할 수 있습니다.

 

해당 단계에서 부팅 애니메이션 출력을 수행합니다.

 

System Server

zygote는 필요한 Java 클래스와 리소스를 모두 프리로드한 후 시스템 서버를 시작합니다.

 

시스템 서버는 안드로이드 시스템의 핵심입니다.

가장 먼저 발생하는 것은 서버가 네이티브 기능에 인터페이스를 제공하는 Android_servers라는 네이티브 라이브러리를 로드하는 것입니다.

 

다음으로 네이티브 서비스를 셋업하는 네이티브 init 메서드가 호출됩니다.

네이티브 서비스를 설정하면 서버 스레드가 생성됩니다. 이 스레드는 필요한 시작 순서에 따라 시스템의 나머지 서비스를 시작합니다.

 

각 서비스는 System Server의 개별 Dalvik 스레드에서 실행됩니다.

시스템 서비스가 메모리에서 실행되면 Android는 부팅 프로세스를 완료하며, 이때 "ACTION_BOOT_COMPLETED" 표준 브로드캐스트 액션이 실행됩니다.

 

Rooting

Android에 기기의 보호 등의 목적으로 적용된 제한들을 제거하기 위한 목적으로 행하는 권한 상승

 

Rooting 목적

  • OS 권한에 의해 제한되지 않고 Android 장치의 보안을 진단하기 위함
  • OS 최고 권한(Root) 획득
  • Filesystem Write 권한 획득
  • 시스템 설정(firewalls, overclocking, ad-blockers 등) 변경 가능

 

Rooting 과정

Boot Loader Unlock

Boot Loader은 시스템을 초기화하고, Kernel를 RAM에 로드 시켜주는 역할한다.

처음 부팅 시 root 권한으로 부팅하기 위해서는 kernel를 수정해야한다.

 

하지만 제조사에서 사용자가 임의로 기기의 펌웨어를 수정하기 못하게 제한하여 상품을 출시한다.

해당 기능을 Boot Loader locked이라고 한다.

 

Android 기기의 플래시 메모리에 직접 데이터를 쓰거나, 진단할 수 있는 엔지니어링 프로토콜인 Fastboot Mode를 이용하여 Boot Loader Unlocked를 시킬 수 있다.

 

해당 Fastboot Mode를 통해 Custom ROM(Kernel), Custom Recovery 등을 설치하여 root 권한으로 부팅을 시킬 수 있다.

 

Custom Recovery

Recovery는 Android 기기 유지관리 기능을 제공하며, 안전 장치 역할로 Android boot image를 가지고 있습니다. 또한 Android 펌웨어 업데이트를 수동 또는 OTA(Over The Air) 방식으로 관리를 한다.

 

순정 Recovery는 Android 기기 호환성에 필요한 최소한의 기능만 사용 가능하며, 서명 값을 검증하여 인증된 펌웨어만 사용 가능하다.

 

Custom Recovery Image는 제한된 기능들을 우회하기 위해 AOSP에서 제공하는 Source Code에서 몇 가지 기능을 Custom하여 Recovery Image를 제작한 것을 뜻한다.

  • 서명되지 않은 펌웨어 허용 or Custom Key로 서명된 펌웨어 허용
  • ADB를 root 권한으로 실행하여 모든 ADB 기능 엑세스 허용
  • 모든 기능을 갖춘 BusyBox binary 포함

Custom Recovery Image를 Fastboot mode를 활용하여 설치하게 된다.

만약 Fastboot mode가 차단된 기기의 경우 Odin과 같은 프로그램을 활용하여 설치한다.



Custom ROM

Android ROM은 Android 플랫폼을 기반으로 하는 기기의 펌웨어입니다.

 

순정 Android ROM에 root 권한을 사용할 수 있도록, System Image에 setuid 권한을 가진 su binary를 추가하거나 추가적으로 원하는 기능을 수정하여 Custom ROM으로 제작한다.

 

Custom Recovery를 활용하여 Custom ROM을 기기에 설치하여 Rooting를 성공 할 수 있다.

 

Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.