AndroidManifest.xml이란 애플리케이션에 대한 필수적인 정보들을 안드로이드 System에 알려주는 설정파일이라고 생각하면 된다. AndroidManifest.xml파일 안에는 애플리케이션 component(Activity, Service, intent, content provider, brodcast Receivers)에 대한 노드를 포함하고 있다. apk파일 압축을 해제하면 AndroidManifest.xml 파일을 확인할 수 있다.
적절한 앱 퍼미션 설정 여부
1. 파일에 명시되어 있는 권한과 실제 App의 기능상 필요한 권한 비교
: APK 파일 내 AndroidManifest.xml 파일에 App이 사용하는 권한이 <user-permission>으로 명시되어 있다.
파일에 명시되어 있는 권한에 위험도가 높은 퍼미션을 사용할 경우 취약한 것으로 식별한다.
위험도가 높은 권한
안드로이드 6.0 Version이후부터 앱에서 필요한 권한이 존재할 때 사용자로부터 권한을 받게되었다.(이전에는 설치할 때 필요한 권한을 요구하는 로직이였음)
ACCESS_COARSE_LOCATION
네트워크(Wi-Fi, 3G, 4G등)을 이용하여 단말기 위치를 식별한다.
ACCESS_FINE_LOCATION
GPS와 네트워크를 이용한다. 때문에 ACCESS_FINE_LOCATION을 사용하면 더 정확한 위치를 알 수 있다.
AUTHENTICATE_ACCOUNTS
앱이 계정 생성, 암호 가져오기 및 설정을 포함하여 AccountManager의 계정 인증자의 기능을 사용할 수 있게한다.
BLUETOOTH
페어링 된 기기와 데이터를 송수신할 때 필요하다.
BLUETOOTH_ADMIN
환경설정에서 해주어야 하는 블루투스 관련 작업을 앱에서 수행할 때 필요하다.
CALL_PHONE
앱에서 전화걸기 권한을 허용한다.
CAMERA
앱에서 카메라 기능을 허용한다.
Change_configuration
앱이 언어 또는 전체 글꼴 크기와 같은 현재 구성을 변경할 수 있도록 허용합니다.
Change_Network_state
앱이 네트워크 연결 상태를 변경할 수 있도록 한다.
Change_Wifi_Multicast_state
앱이 Wi-Fi 멀티캐스트 모드로 들어갈 수 있도록 한다.
Change_Wifi_State
앱이 Wi-Fi 연결 상태를 변경할 수 있도록 한다.
GET_TASKS
API Level 21에서 제거
ACCOUNT_MANAGER
앱이 AccountAuthenticators(계정인증자)를 호출하도록 허용한다.
Modify_Audio_Settings
앱이 전체 오디오 설정을 수정할 수 있도록 한다.
Modify_Phone_State
앱이 전원 켜기, mmi등 전화 상태를 수정할 수 있다.
READ_CALENDAR
앱이 사용자의 캘린더 데이터를 읽을 수 있도록 합니다.
READ_CONTACTS
앱이 사용자의 연락처 데이터를 읽을 수 있도록 허용합니다.
READ_LOGS
앱이 사용자의 통화 기록을 읽을 수 있도록 합니다.
READ_PHONE_STATE
앱이 현재 셀룰러 네트워크 정보, 진행 중인 통화 상태 및 PhoneAccount 장치에 등록된 모든 목록을 포함하여 전화 상태에 대한 읽기 전용 액세스를 허용합니다.
READ_SMS
앱이 SMS 메시지를 읽을 수 있도록 허용합니다.
READ_EXTERNAL_STORAGE
앱이 외부 저장소에서 읽을 수 있도록 허용합니다.
RECEIVE_MMS
앱이 수신 MMS 메시지를 모니터링하도록 허용합니다.
RECEIVE_SMS
앱이 SMS 메시지를 수신하도록 허용합니다.
RECORD_AUDIO
앱이 오디오를 녹음하도록 허용합니다.
SEND_SMS
앱이 SMS 메시지를 보낼 수 있도록 허용합니다.
WRITE_APN_SETTINGS
앱이 apn 설정을 작성하고 사용자 및 비밀번호와 같은 기존 apn 설정의 민감한 필드를 읽을 수 있도록 합니다.
안드로이드 단말기에 모바일 앱을 설치하면 기본적으로 /Data 디렉토리에 APK 파일이 존재한다.
ADB Tool로 APK 파일을 Local PC로 추출 후 취약점 분석 환경에 맞게 Decomplie을 해야한다.
표준적인 진단방법
Apk파일 추출 후 Apktool 도구로 APK파일을 디컴파일
Dex2jar 도구로 APK파일을 (Mobile Application).jar파일로 변환
Jd-gui도구로 jar파일을 자바 소스로 변환된 상태에서 분석해야 한다.
일반적으로 여러 모바일 애플리케이션 분석할때 위의 방법을 사용한다.
Jadx Tool
해당 도구는 반복적인 과정을 한번에 수행할 수 있도록 세 가지의 도구의 기능이 모두 합쳐져 있어 쉽게 소스코드를 변환할 수 있다.
Jadx 도구의 편의성
APK 파일 추출
안드로이드 단말기에 설치되어 있는 모바일 애플리케이션의 APK파일은 기본적으로 /data/app/패키지이름 디렉토리에 저장된다. APK파일을 Local PC로 다운로드 하는 방법은 여러가지 있지만 진단인력은 기본적으로 ADB 도구를 설치하여 사용한다.
※ ADB(Android Debug Bridge)는 Local PC에서 안드로이드 단말기를 제어하기 위한 용도로 사용하며 안드로이드 단말기에 APK파일을 설치, 추출, 삭제, 실행, 종료, 컴포넌트 실행, 포트포워딩 등 다양한 기능을 수행할 수 있다.
※ APK(Android Application Package)파일은 모바일 앱을 설치할 때 사용하는 파일로 zip 형태로 압축되어 있다. 추출한 APK파일을 압축 프로그램으로 열어보면 인증 파일, 리소스 파일, AndroidManifest.xml파일, dex 파일이 포함되어 있다.
디컴파일 된 APK 파일의 정의
META-INF : Mobile Application의 배포자 관련 인증파일
res : 모바일 앱의 리소스 파일
AndroidManifest.xml : 모바일 앱의 전반적인 정보, 권한, 패키지 이름, 컴포넌트 정보이 나열되어 있는 파일
Classes.dex : 달빅(Dalvik) 가상 머신에서 동작하는 실행 파일, 어셈블리어 코드
일반적으로 jd-gui Tool은 검색 및 치환 기능이 부족하다. 또한 Java Class만 보여주므로 AndroidManifest.xml파일은 jar로 만들어도 확인할 수 없다.
Jadx-gui
Jadx-gui 도구를 실행하면 Open file창이 나타난다. 해당 도구가 지원하는 파일의 유형은 다음과 같다.
jadx, apk, dex, jar, class, smali, zip, aar, arsc 파일
파일 이름 입력 폼에 분석할 APK 파일을 지정하고 Open file 버튼을 클릭한다.
APK, Dex, Aar, zip 등 파일을 자바 소스코드로 변환시켜줌
AndroidManifest.xml, 리소스 파일 확인
난독화 해제 지원
함수 선언부 이동
소스코드 하이라이팅
키워드 검색가능
APK 파일을 선택하면 자동으로 Decompile하여 원본 수준의 Java Source Code를 확인할 수 있으며 하단의 AndroidManifest.xml파일의 내용도 확인가능하다.
안드로이드 앱은 소스코드 보호를 하려고 난독화를 적용한다. Jadx-gui 도구에서 100% 완벽한 수준으로 난독화 해제를 할 수 없지만 어느 정도 알아보기 쉽게 해제할 수 있다.
※ 난독화 해제방법 : Tools > Deobfuscation
jadx는 gui, cli 두 가지 형태로 배포하고 있는데 이에대한 구체적인 설명 및 사용법은 Github를 참조하면 알 수 있다.