나의 성장기 보안/코딩$

안드로이드 진단 - AndroidManifest.xml파일

App 진단
@2021-10-25 14:50:01

AndroidManifest파일 분석

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 설정의 민감한 필드를 읽을 수 있도록 합니다.
WRITE_CALENDAR 앱이 사용자의 캘린더 데이터를 쓸 수 있도록 허용합니다.
WRITE_CONTACTS 앱이 사용자의 연락처 데이터를 쓸 수 있도록 합니다.
WRITE_EXTERNAL_STORAGE 앱이 외부 저장소에 쓸 수 있도록 합니다.
WRITE_SETTINGS 앱이 시스템 설정을 읽거나 쓸 수 있도록 합니다.
WRITE_SYNC_SETTINGS 앱이 동기화 설정을 쓸 수 있도록 허용합니다.
USE_FINGERPRINT API LEVEL 28에서 더 이상 사용하지 않음 USE_BIOMETRIC을 대신 요청

https://developer.android.com/reference/android/Manifest.permission

 

Manifest.permission  |  Android Developers

 

developer.android.com

위의 Site를 참조할 경우 현재 지원하는 User Pemission에 대한 설정을 볼 수 있다.


Android 4대 컴포넌트(BroadCast Receiver)

BroadCastReceiver는 4대 컴포넌트 중에 하나이다.

BroadCastReceiver의 역할은 단말기 안에서 이루어지는 수많은 일들을 대신해서 알려준다.

예를들어 배터리부족, SMS문자메시지, 전화가온다거나 하는 일들을 방송알림 해준다.

 

System이 보내고 앱이 받는 경우가 일반적이나, 앱이 앱에게 보내는 것도 가능하다. 즉, 앱간 통신수단으로 사용할 수 있다.

BroadCastReceiver를 구현하기 위해 2가지 방법이 존재한다. 코드상에서 BroadCastReceiver를 등록하는 동적인방법과 Manifest.xml에 <Receiver></Receiver>의 형태로 등록하는 정적인 방법이 존재한다.

 

1. 정적으로 Receiver 구현하기

Manifest.xml에 우선 BroadCastReceiver를 등록한다.

폴더 구조를 맞춰 작성한 후 .receiver.MyBroadCastReceiver 형식으로 name을 선언한다. 또한 BroadCastReceiver가 Action이벤트를 받도록 <Action> 태그를 등록한다.

현재 디렉토리의 Receiver폴더 하위의 MyBroadCastReceiver호출
Reciver가 Action 이벤트를 받도록 <action>태그 정의

 

그 후 BroadCastReceiver를 상속받아 onReceive()메서드를 오버라이딩한다.

onReceive()메서드는 intent-filter를 통해 걸러진 intent를 받아들이는 곳이다.

걸러진 intent의 Action값을 토스트로 띄우도록 코드를 짠다.

onReceive Method 정의 후 필터링된 Action값을 토스트로 띄움

그 후 sendBroadCast를 인위적으로 발생시켜 해당 intent가 intent필터를 걸쳐 잘 걸러져서 BroadCastReceiver가 받는지 확인

 

2. 동적으로 Receiver 구현