AndroidManifest.xml 분석
안드로이드 단말기에 설치되어 있는 모바일 앱을 분석하려면 설치되어 있는 APK 파일을 로컬 컴퓨터로 추출해야 한다.
추출한 APK 파일을 디컴파일을 하면 여러 개의 디렉토리와 AndroidManifest 파일이 존재한다. 해당 파일은 앱의 패키지 이름, 사용자에게 요구한 권한, 노출된 컴포넌트 등 앱의 전반적인 구조를 쉽게 확인할 수 있다.
파일의 분석이 완료되면 메인 액티비티의 Oncreate 메소드를 따라가서 분석하면 된다.
package="com.example.helloworld"가 안드로이드 앱의 패키지 이름이며, 패키지 이름은 앱마다 가지는 고유한 이름이다. 자바 소스(src)에 패키지 이름을 보면 실질적으로 동작하는 소스 코드가 존재한다. src에서 android.support 패키지는 API이다.
<activity>는 액티비티 컴포넌트로 액티비티의 이름이 .MainActivity이다. 앞의 점이 붙는데, 점은 패키지 이름이 생략된 형태로 볼 수 있다.
예를 들면, .MainActivity와 com.example.helloworld.MainActivity는 동일하다.
안드로이드 컴포넌트는 액티비티, 브로드캐스트, 컨텐트 프로바이더, 서비스 컴포넌트가 존재한다. 각 컴포넌트는 인텐트로 통신하는데, 인텐트는 각 컴포넌트에게 전달할 메시지를 의미한다.
안드로이드 시스템에서 컴포넌트들이 통신하는 방법은 인텐트를 이용해 통신한다. 예를 들면, app1, app2, app3 등 앱이 있다고 가정하자. 인텐트가 app3으로 전송하려고 하면 이 인텐트가 모든 컴포넌트(액티비, 서비스, 브로드캐스트 리시버, 프로바이더)에게 전달한다.
액티비티 컴포넌트 안을 보면 인텐트 필터가 존재하는데, 앱을 실행할 때 가장 먼저 실행되는 컴포넌트를 의미한다. 모든 앱은 인텐트가 존재한다.
안드로이드 앱을 설치하거나 앱을 실행할 때 사용자에게 권한을 요구하는 경우가 있다. 보통 권한은 앱을 실행하는데 필요한 요소로 앱을 설치하거나 AndroidManifest.xml 파일에서 확인할 수 있다.
권한을 확인하여 해당 앱이 어떤 기능을 수행하는지 확인할 수 있으며 너무 많은 권한이 존재하면 악의적인 기능을 수행할만한 권한이 있는지 확인해봐야 한다.
○ REBOOT : 리부팅할 수 있는 권한
○ WRITE_CALENDAR : 캘린더 쓸 수 있는 권한
○ READ_CONTACTS : 주소록 읽을 수 있는 권한
○ WRITE_CONTACTS : 주소록 쓸 수 있는 권한
○ WRITE_SMS : SMS 쓸 수 있는 권한
○ WAKE_LOCK : 알람 허용 권한
○ CALL_PHONE : 통화할 수 있는 권한
○ FLASHLIGHT : 플래시라이트 권한
○ STATUS_BAR : 상태표시줄 출력 권한
○ VIBRATE : 진동 권한
○ RECEIVE_BOOT_COMPLETED : 부팅 완료 권한
○ RECEIVE_MMS : MMS 읽을 수 있는 권한
○ RECEIVE_SMS : SMS 읽을 수 있는 권한
○ READ_CALENDAR : 캘린더 읽을 수 있는 권한
○ ACCESS_WIFI_STATE : WIFI 상태 접근 권한
○ SYSTEM_ALERT_WINDOW : 기기관리자 창을 가리기위해 사용되는 권한
○ BATTERY_STATS : 배터리 상태 확인 권한
○ READ_PHONE_STATE : 스마트폰 상태 확인 권한
○ CHANGE_WIFI_STATE : WIFI 상태 변경 권한
○ BLUETOOTH : 블루투스 권한
○ CALL_PRIVILEGED : 긴급 통화할 수 있는 권한
○ CAMERA : 카메라 권한
○ WRITE_EXTERNAL_STORAGE : SD 카드 쓰기 권한
○ CONTROL_LOCATION_UPDATES : 위치정보 갱신 권한
○ CHANGE_NETWORK_STATE : 통신상태 변경 권한
○ KILL_BACKGROUND_PROCESSES : 백그라운드로 동작중인 프로세스 종료 권한
○ READ_CALL_LOG : 통화 기록 확인 권한
○ WRITE_CALL_LOG : 통화 기록 쓰기 권한
○ ACCESS_NETWORK_STATE : 네트워크상태 변경 권한
○ ACCESS_COARSE_LOCATION : 코스 로케이션 접근
○ ACCESS_FINE_LOCATION : 파인로케이션 액세스(GPS) INTERNET : 인터넷 권한
○ WRITE_SETTING : 앱에서 시스템 읽기 및 쓰기 권한
○ GET_TASKS : 프로세스 정보를 얻는 권한
○ READ_SMS : 저장소에 저장되어 있는 SMS를 읽을 수 있는 권한
○ SEND_SMS : SMS 전송 권한
메인 액티비티의 OnCreate 메소드 분석
모든 안드로이드 앱마다 메인 액티비티가 존재한다. 메인 액티비티의 Oncreate 메소드는 가장 먼저 실행되는 메소드이므로 앱의 전반적인 흐름을 파악하는데 가장 중요한 요소이다.
public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
-> 앱에 존재하는 액티비티 사용
requestWindowFeature(1);
-> 모바일 앱 실행 시 풀스크린으로 사용자에게 제공
this.webview = new WebView(this);
-> 웹뷰 클래스 생성
-> AndroidManifest.xml 파일에 INTERNET 권한이 존재해야 사용 가능
this.progressbar = new ProgressBar(this, null, 16241852);
-> 프로그레스바(현재 진행 상황 확인) 클래스 생성
this.progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams(-1, 5, 0, 0));
-> setLayoutParms는 컴포넌트의 레이아웃 설정
this.progressbar.setProgressDrawable(getResources().getDrawable(2120537708));
-> 프로그레스바 설정
-> 2120537708 : R.java(WebActivity > src > com.test.app.id_500000)에 존재
-> R.java를 검색해보면 BAR 변수에 숫자가 저장되어 있으며 모든 변수들은 res에 있는 파일 이름(bar.xml)을 의미
this.webview.addView(this.progressbar);
this.webview.getSettings().setJavaScriptEnabled(true);
-> setJavaScriptEnabled 메소드 : 자바스크립트 활성화
this.webview.getSettings().setLoadWithOverviewMode(true);
-> setLoadWithOverviewMode : 안드로이드 화면에 웹뷰 사이즈를 조절
this.webview.getSettings().setDomStorageEnabled(true);
-> setDomStorageEnabled : 웹뷰의 디폴트 설정으로 로컬 저장 기능 활성화
this.webview.setScrollBarStyle(32553422);
-> setScrollBarStyle : 스크롤바의 스타일 설정
this.myWebViewClient = new MyWebViewClient();
-> 웹뷰로 데이터를 처리하는 클래스
this.webview.setWebViewClient(this.myWebViewClient);
this.myWebChromeClient = new MyWebChromeClient();
-> WebChromeClient : 브라우징 처리
this.webview.setWebChromeClient(this.myWebChromeClient);
-> WebChromeClient 객체 설정
this.webview.loadUrl("http://test.com");
-> loadUrl : 앱 실행 시 자동으로 실행되는 URL
setContentView(this.webview);
-> setContentView : 웹뷰를 사용자에게 보여줌
}
▶ 안드로이드 컴포넌트 취약점 (Android Activity)
▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)
▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)