Season 1/기술 보안

[ Android ] 기초 정리 - Android 공격 종류 및 구조

작성자 - LRTK

Android 공격 종류

  • 포렌식 공격
    공격자가 단말기를 탈취 한 후 메모리와 디스크 정보를 덤프하여 개인 중요 정보 탈취
  • 코드 실행 공격
    단말기에서 실행되는 앱의 임의 코드 실행 취약점을 이용하여 단말기를 장악하는 공격
  • 웹 기반 공격
    웹 뷰를 통해 만들어진 앱에서 웹 취약점을 통해 사용자 및 서버 공격
  • 악성 앱 공격
    정상 앱의 서명 개인키를 탈취하여 악성 코드를 삽입한 업데이트 버전을 배포하는 방식으로 공격

Android Architecture

Android는 다양한 기기와 폼 팩터에 사용할 수 있도록 제작된 Linux 기반의 오픈소스 소프트웨어 스택이다.

 

Linux Kernel

Kernel은 운영체제를 운영하는데에 필요한 기능들을 연결해주는 역활을 수행한다.

 

Android 플랫폼의 기반은 Linux 커널입니다. 예를 들어, ART(Android 런타임)는 스레딩 및 하위 수준의 메모리 관리와 같은 기본 기능에 Linux 커널을 사용합니다.

 

Linux 커널을 사용하면 Android가 주요 보안 기능을 활용하고 기기 제조업체가 널리 알려진 커널용 하드웨어 드라이버를 개발할 수 있습니다.

 

Android는 Linux Kernel 기반으로 Android 환경에 맞는 여려 기능들을 변경하였다.

  • Binder : Android 전용 프로세스 간 통신 메커니즘 및 원격 메소드 호출 시스템
  • Ashmem (Android Shared Memory) : Android 공유 메모리
  • Pmem (Process Memory allocator) : 프로세스 메모리 할당 자
  • Logger : logcat 명령에 대한 kernel 지원

 

HAL

HAL(하드웨어 추상화 계층)은 상위 수준의 Java API 프레임워크에 기기 하드웨어 기능을 노출하는 표준 인터페이스를 제공합니다.

프레임워크 API가 기기 하드웨어에 액세스하기 위해 호출을 수행하면 Android 시스템이 해당 하드웨어 구성 요소에 대한 라이브러리 모듈을 로드합니다.

 

Android Runtime

Android 버전 5.0(API 레벨 21) 이상을 실행하는 기기의 경우, 각 앱이 자체 프로세스 내에서 자체 ART(Android 런타임) 인스턴스로 실행됩니다.

ART는 DEX 파일을 실행하여 저용량 메모리 기기에서 여러 가상 머신을 실행하도록 작성되었습니다.

 

DEX 파일은 Android용으로 특별히 설계된 바이트코드 형식으로, 최소 메모리 공간에 맞게 최적화되어 있습니다.

Jack과 같은 툴체인을 빌드하고, Java 소스를 Android 플랫폼에서 실행될 수 있는 DEX 바이트코드로 컴파일합니다.

 

ART의 주요 기능 중 몇 가지를 살펴보자면 다음과 같습니다.

  • AOT(Ahead-Of-Time) 및 JIT(Just-In-Time) 컴파일
  • 최적화된 가비지 컬렉션(GC: 메모리 관리)
  • Android 9(API 레벨 28) 이상에서 앱 패키지의 DEX(Dalvik Executable) 형식 파일이 더욱 간소한 기계 코드로 변환됨
  • 전용 샘플링 프로파일러, 상세 진단 예외 및 크래시 보고, watchpoint를 설정하여 특정 필드를 모니터링할 수 있는 기능을 비롯한 향상된 디버깅 지원 기능

Android 버전 5.0(API 레벨 21) 이전 버전에서는 Dalvik이 Android 런타임이었습니다.

앱이 ART에서 제대로 실행되면 Dalvik에서도 제대로 실행되지만, 그 반대의 경우 제대로 실행된다는 보장은 없습니다.

 

Android에는 Java API 프레임워크가 사용하는 몇 가지 Java 8 언어 기능을 포함하여 대부분의 Java 프로그래밍 언어 기능을 제공하는 일련의 핵심 런타임 라이브러리도 포함되어 있습니다.

 

JIT (Just In Time)

어플리케이션 구동 시 실시간으로 자바 코드로 변환하여, 자바 코드 일정 부분을 RAM 상에 상주합니다.

  • 장점 : 성능적으로 크게 향상됨.
  • 단점 : JIT 컴파일러 구동 시 하드웨어의 부하가 크게 발생하며, 다른 방식에 비해 RAM 사용량 증가

 

AOT (Ahead Of Time)

어플리케이션 설치 시 한 번에 컴파일하여 바이트 코드로 변환하며, 실행 시 변환된 코드를 사용합니다. (ART에서 사용)

  • 장점 : 성능적으로 크게 향상됨.
  • 단점 : 어플리케이션 설치 공간이 Dalvik VM에 비해 약 1.5 ~ 2배 가량 공간 차지하며 설치 시간이 오래 걸림.

 

Native C/C++ Libraries

ART 및 HAL 등의 많은 핵심 Android 시스템 구성 요소와 서비스가 C 및 C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드를 기반으로 빌드되었습니다. Android 플랫폼은 Java 프레임워크 API를 제공하여 이러한 일부 네이티브 라이브러리의 기능을 앱에 노출합니다.

 

C 또는 C++ 코드가 필요한 앱을 개발하는 경우에는 Android NDK를 사용하여 네이티브 코드에서 직접 이러한 몇몇 네이티브 플랫폼 라이브러리에 액세스할 수 있습니다.

 

NDK (Native Development Kit)

C/C++(Native Code) 등의 언어로 앱 일부를 구현할 수 있는 도구

C/C++로 구현된 코드를 Android에서 사용될 수 있는 Library나 Binary로 만들어주는 도구

 

JNI (Java Native Interface)

java 코드에서 C/C++로 만들어진 Library를 사용 가능하게 해주는 인터페이스 제공

java 코드에 Native 함수를 선언하면, java는 Library 파일(*.so)에서 패칭되는 함수를 찾을 수 있습니다.

 

NDK & JNI 연동

JNI 정보를 담고 있는 JNI_OnLoad() 함수가 로드하려는 labrary 파일 안에 구현되어 있을 경우 수동 매핑, 구현되어 있지 않을 경우 자동 매핑이 이루어짐.

  • 자동 매핑
    JNI_OnLoad() 함수가 없으면 DVM은 자동으로 라이브러리 내에 JNI_Native 함수들을 비교해 매핑 작업 수행 후 매핑된 함수 호출합니다. 매핑 작업으로 인해 성능 저하의 원인이 됨.
  • 수동 매핑
    JNI_OnLoad() 함수가 구현되어 있어 구현된 정보에 맞는 함수 호출합니다.
    개발자가 직접 연결해주는 작업이 필요하며, 로딩 속도 향상 시킬 수 있음.

 

Android API Framwork

Android OS의 전체 기능 세트는 Java 언어로 작성된 API를 통해 액세스할 수 있습니다. 이러한 API는 핵심 모듈식 시스템 구성 요소 및 서비스 재활용을 단순화하여 Android 앱을 제작하는 데 필요한 빌딩 블록을 구성하며, 이러한 빌딩 블록에는 다음이 포함됩니다.

  • View System : 목록, 그리드, 텍스트 상자, 버튼 및 삽입 가능한 웹브라우저를 포함하여 앱의 UI를 빌드하는 데 사용 가능
  • Resource Manager : 현지화된 문자열, 그래픽 및 레이아웃 파일과 같은 코드가 아닌 리소스에 대한 액세스 제공
  • Notification Manager : 모든 앱이 상태 표시줄에 사용자 지정 알림을 표시할 수 있도록 지원
  • Activity Manager : 앱의 수명 주기를 관리하고 공통 탐색 백 스택 제공
  • Content Providers : 앱이 주소록 앱과 같은 다른 앱의 데이터에 액세스하거나 자신의 데이터를 공유할 수 있도록 지원

 

Applications

시스템 앱(Android 가본 앱)과 유저 앱(사용자가 설치한 앱)으로 나누어짐.

Contents

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