[안드로이드 모의해킹] AndroidManifest.xml 분석하기

직접 연구하여 작성한 자료입니다. 공식 출처가 명시되지 않은 자료의 무단 복제, 사용을 금지합니다.
공격 기법은 학습용, 허가된 환경에서 실습 바랍니다. 실 운영망 대상 공격은 처벌받습니다. (정보통신망법 제48조 1항)

1. AndroidManifest.xml 개요

구글에서 제공하는 공식 문서를 참고하였다.

https://developer.android.com/guide/topics/manifest/manifest-intro.html

AndroidManifest.xml은 아래에서 설명하는 구성요소를 정의하고 어떤 작업을 수행할 지 시스템에 알려주는 제어 파일이다.

각 요소는 XML 형식으로 되어 있으며 Key-Value 관계를 가진다.

포함하는 정보에는 여러가지가 있지만 다음 정보를 필수로 포함해야 한다.

  • 앱의 패키지 이름(일반적으로 코드의 네임스페이스와 일치). Android 빌드 도구는 프로젝트를 빌드할 때 이 이름으로 코드 엔터티의 위치를 확인합니다. 앱을 패키징할 때 빌드 도구가 이 값을 Gradle 빌드 파일의 애플리케이션 ID로 대체합니다. 이는 시스템과 Google Play에서 고유한 앱 식별자로 사용됩니다. 
    • 패키지 이름은 안드로이드에서 앱마다 고유하게 사용되며 같은 패키지 이름을 가진 두 개의 앱이 마켓에 업로드될 수도, 단말기에 설치될 수도 없다.
  • 앱의 구성 요소(모든 액티비티, 서비스, Broadcast Receiver, 콘텐츠 제공자 포함). 각 구성 요소는 Kotlin이나 Java 클래스의 이름과 같은 기본 속성을 정의해야 합니다. 또한 자신이 처리할 수 있는 기기 구성의 종류, 그리고 구성 요소가 어떻게 시작되는지 설명하는 인텐트 필터와 같은 기능을 선언할 수도 있습니다. 
  • 앱이 시스템 또는 다른 앱의 보호된 부분에 액세스하기 위해 필요한 권한. 이것은 다른 앱이 이 앱의 콘텐츠에 액세스하고자 하는 경우 반드시 있어야 하는 모든 권한도 선언합니다.
    • 앱에서 사용하는 모든 권한이 명시되어 있어야 한다. 스마트폰은 일반 PC와 다르게 많은 센서와 기능을 추가로 포함하고 있기 때문에 사용자에게 어떤 권한을 사용할지 분석해야 한다. 이 권한에는 파일 시스템 접근, 인터넷 사용, 위치 정보 수집(GPS) 등이 포함된다.
  • 앱에 필요한 하드웨어 및 소프트웨어 기능으로, 이에 따라 앱을 Google Play에서 설치할 수 있는 기기의 종류가 달라집니다. 

2. AndroidManifest.xml 분석

AndroidManifest.xml 예제

<manifest> 태그에는 앱의 패키지 명, Build 버전, API Level 등이 명시된다. 예제에서는 com.exmple.myapp이 앱의 패키지명이 된다. 지원하는 API Level에 따라 설치가능한 안드로이드 버전이 구분되어 있으며, 지원이 종료된 버전의 경우 API Level에 따라 실행 불가능한 기능이 있거나 설치가 불가능할 수 있다.

Permission

<uses-permission> 태그에는 앱에서 사용하는 권한이 명시된다. 앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한이다. 

<activities> 액티비티는 앱의 동작 단위이다. Manifest에 명시된 액티비티만 앱에서 사용 가능하다.

앱이 가장 처음 시작될 때 실행되는 액티비티 또한 확인할 수 있다. AndroidManifest.xml에서 다음의 내용을 찾아본다.

<intent-filter> - <activity> - <action "android.intent.action.MAIN"/>

해당하는 intent-filter 태그를 감싸고 있는 첫 번째 Activity가 앱의 시작 액티비티이다.

3. AndroidManifest.xml 분석 실습

APK Studio나 Jadx-gui를 이용하여 디컴파일한 apk 파일 내 AndroidManifest.xml로 직접 분석 실습을 진행한다. 앞선 포스트에서 다루었던 DIVA앱을 디컴파일한다.

좌측의 프로젝트 트리에서 rsrc > AndroidManifest.xml에서 확인할 수 있다.

DIVA.apk > AndroidManifets.xml

좌측의 행번호에 따라 설명하면 다음과 같다.

행번호 AndroidManifest.xml 확인가능한 속성
2  <manifest>
packages="jakhar.aseem.diva" 
패키지명(jarkhar.aseem.diva)
11~13 <manifest> - <uses-permission> 앱 권한(android.permission. ~)
21~30 <action android:name="android.intent.action.MAIN"/> 메인 액티비티(MainActivity)
("jakhar.aseem.diva.MainActivity")
31~109 <activity> ~ </activity> 앱에서 사용중인 Activity 및 속성

이외에도 다루지 않은 여러 속성들이 더 있으므로 새로운 태그 및 값은 공식 문서에서 참고하도록 한다.

4. AndroidManifest 취약점 진단 기준

앱을 실행시키지 않은 상태에서의 분석인 "정적분석" 만으로는 취약점인지 여부의 판단을 내리기 어렵다. 하지만 어떤 부분에서 취약점이 발생할 만한 지점인지 정보를 수집하는 단계로 사용할 수 있다. 단일 파일에서 가장 많은 정보를 확인할 수 있으므로 진단을 진행할 방향을 정할 수 있게 도와주기도 한다.

의심가능한 지점은 다음과 같다.

  1. 앱에서 사용하지 않는 권한 사용 및 과도한 권한이 부여된 경우
  2. android:exported, android:sharedUserId 속성이 true로 설정되어 있으나 protectionLevel이 Signature로 설정되지 않은 컴포넌트 존재 여부 확인
  3. android:debuggable 속성이 true로 설정되어 있는 경우
  4. 액티비티 항목을 확인하여 개발 시 포함된 테스트용 기능들이 실수 또는 관리의 목적으로 포함되어 있을 경우(서버정보, DB 정보, DB연결테스트 페이지, 개인정보 등)
  5. 외부로 노출된 Intent 속성들이 있으나 해당 액티비티에서 외부에서 전달된 파라미터의 처리가 적절하지 않은 경우

정적분석 항목만으로는 과도한 권한 부여 여부, 필요한 액티비티인지 여부 등과 같이 앱을 더 자세히 분석하기 전까진 취약 여부를 판단하기 어렵다. 정보를 하나씩 수집하였고, 수집한 정보를 이용하여 발생할 수 있는 취약점을 하나씩 점검해볼 수 있다.

취약점을 판단하기 쉬운 지점이므로 안드로이드 버전 업그레이드에 따른 정책 변경을 통해 Debuggable 옵션이 허용된 경우 앱 배포 시 개발자에게 경고를 띄운다거나, 앱에서 사용하지 않는 특수 권한은 배포 시에 추가되지 않도록 관리하는 과정이 추가되었다. 이러한 업데이트는 안드로이드 Developer 공식 문서나 개발자 포럼에서 확인할 수 있으므로 계속 모니터링해서 어떤 정책의 변화가 있는지 F/U 하는 것이 필요하다.

 

반응형