Android Application Hacking Project
안드로이드 애플리케이션 해킹 프로젝트
- 안드로이드 시스템의 구성요소 중 하나인 Broadcast Receiver에 생긴 결함에 대처한다.
- 안드로이드 시스템의 Broadcast Receiver에 대한 정보는 아래 포스트를 참고하자.
- Android Overview (안드로이드 개요) (URL)
Vulnerability Analysis (취약점 분석)
- Broadcast Receiver가 수신하는 Broadcast Signal은 악의적인 애플리케이션에서 발생하거나,
공격자에 의해 임의로 생성이 가능하다.
- Broadcast Receiver는 사용자가 받는 알림(메시지, 전화 등)을 중간에 가로채거나,
특정 상황에 발생하는 작업을 우회하여 실행하도록 공격자가 조작할 수 있다.
InsecureBankv2 Application
- 안드로이드 시스템의 Vulnerability(취약점)를 분석하는데 유용한 환경을 제공하는 애플리케이션이다.
주 제 | 개 요 | 대응 방안 |
브로드캐스트 리시버 결함 (Broadcast Receiver Fault) |
- 디바이스에서 이벤트가 발생되면 브로드캐스트 신호를 보내고, 브로드캐스트 리시버가 이를 받아 처리한다. - 공격자가 브로드캐스트 신호를 임의로 발생시켜 악용할 수 있다. - AndroidManifest.xml 파일의 receiver 객체의 android:exported 속성이 true로 되어 있어 외부 애플리케이션으로부터 intent를 받을 수 있다. - ADB 혹은 drozer를 통해 브로드캐스트를 발생시켜 취약점을 확인할 수 있다. |
- AndroidManifest.xml의 리시버 항목의 android:exported 값을 false로 설정 - 각 리시버에 별도의 Permission을 부여하여 권한이 있는 경우에만 접근을 허용 |
취약한 인증 메커니즘 (Weak Authorization Mechanism) |
- 정상적 인증 절차를 우회하여 잘못된 인증으로 접근 권한을 취득한다. - AndroidManifest.xml 파일의 각각의 activity 객체의 android:exported 속성이 true로 되어 있어 다른 액티비티에서 인증 없이 접근할 수 있다. |
- 각각의 액티비티들의 android:exported 속성을 false로 설정하여 같은 앱 혹은 같은 유저 ID를 가진 앱의 컴포넌트에만 접근을 허용 - 별도의 인텐트 필터를 통해 권한을 검증 |
액티비티 컴포넌트 취약점 (Vulnerability of Activity Component) |
- 공격자가 임의의 액티비티를 강제로 호출하여 악용할 수 있다. - ADB 혹은 drozer로 취약한 액티비티를 호출하여 취약성 여부를 진단할 수 있다. |
- 외부에서 특정 액티비티를 강제로 실행하지 못하도록 하기 위해서는 해당 액티비티의 android:exported 속성을 false로 설정해야한다. - 만약 액티비티를 노출해야 하는 경우, 액티비티에 Permission을 추가하여 특정 권한을 가진 경우에만 실행할 수 있도록 설정해야 한다. |
안전하지 않은 콘텐츠 프로바이더 접근 (Access to Insecure Content Provider) |
- 코드상에 콘텐츠 프로바이더의 URI 주소가 노출되어, 공격자는 이 URI를 통해 데이터베이스에 접근할 수 있고 SQL Injection 공격을 할 수 있다. | - 해당 프로바이더의 android:exported 속성을 false 설정한다. |
애플리케이션 패칭 | - 배포된 apk파일을 디컴파일하여 생성한 smali 소스코드의 특정 부분을 공격자가 임의로 수정한다. (리패킹을 이용한 앱 위변조 공격) |
-Proguard와 같은 도구를 통해 하이레벨 소스코드를 난독화하거나 디컴파일을 근본적으로 방지하는 바이너리 난독화 솔루션을 통해 해커의 공격을 사전 차단한다. |
안드로이드 키보드 캐시 이슈 | - 사용자가 중요 정보를 클립보드에 저장하면 공격자는 Cliper와 같은 도구를 통해 이 정보를 탈취할 수 있다. | - 중요 정보는 마스킹 처리한다. - EditText 뷰의 값을 복사 및 붙여넣기 할 수 없도록 android:editable 속성을 false로 지정한다. |
ADB (Android Debug Bridge)
- AVD에 명령어를 전달해주는 Bridge 역할을 하는 프로그램이다.
- Android SDK에 포함되어 있어 추가적인 설치가 필요하지 않다.
(android\platform-tools\adb.exe)
ADB Components | Description |
Client | - 안드로이드 개발 시스템에서 실행된다. - 사용자는 ADB 명령어를 입력한 후 Shell에서 Client를 호출한다. |
Server | - 안드로이드 개발 시스템에서의 백그라운드 프로세서이다. - 동작하는 요소인 Server는 Client, Emulator, Device에서 구동되는 ADB Daemon 사이의 통신을 관리한다. |
Daemon | - Emulator나 Device에서 백그라운드 프로세서로 동작하는 인스턴스이다. |
adb devices
- 연결된 안드로이드 디바이스들의 리스트를 출력한다.
adb shell
- 연결된 안드로이드 디바이스에 대해 ADB Shell을 실행한다.
adb logcat [<option>] [<filter-spec>]
- 안드로이드 Device에서 발생하는 로그 메시지를 출력하거나 파일 형태로 저장한다.
* logcat Options
Option | Description |
-b <buffer> | - 로그 버퍼를 지정하여, 해당 버퍼의 메시지만 출력한다. <buffer> radio: radio/telephony 관련 메시지 events: 이벤트와 관련된 메시지 main: 메인 로그 버퍼 (Default) |
-c | - 기록된 로그 메시지를 삭제하고 종료한다. |
-d | - 로그 메시지를 화면에 덤프하고 종료한다. |
-f <filename> | - 로그 메시지를 파일로 저장한다. - <filename>은 /path/filename 형태로 지정한다. - 이때, -d 옵션과 함께 사용하여 로그 메시지가 무한히 저장되는 것을 방지한다. |
-g | - 선택된 버퍼의 크기를 출력하고 종료한다. - 이때, -b 옵션을 함께 사용하여 버퍼를 선택한다. |
-n <count> | - 저장되는 로그 파일의 개수를 지정한다. - -r 옵션을 포함하여 로그 파일 용량을 설정한다. - -f 옵션을 포함하여 파일 이름을 지정한다. - -n 옵션을 지정하지 않는 경우, 4개의 로그 파일이 생성한다. |
-r <kbytes> | |
-s | |
-v <format> |
* Priority of Log Message
- 로그 메시지의 우선순위는 로그 메시지의 맨 앞에 1개의 알파벳 문자로 표현되며, 의미는 아래와 같다.
Priority | Description |
V | Verbose (Normal) |
D | Debug |
I | Info |
W | Warning |
E | Error |
F | Fatal |
S | Slient (Highest Priority) |
adb install <apk-path>
- 설치할 .apk 파일의 경로를 지정하여 해당 애플리케이션을 설치한다.
adb uninstall <package-name>
- package-name에 해당하는 애플리케이션을 삭제한다.
Drozer
- 취약점 자동분석 도구이다.
Reference: 안드로이드 모바일 앱 모의해킹: 가상 뱅킹 앱 인시큐어뱅크를 활용한 모바일 취약점 진단과 대응 방안
(조정원 · 김명근 · 조승현 · 류진영 · 김광수 저, 에이콘, 2017)
Reference: 2022학년도 1학기 홍익대학교 네트워크 보안 강의, 이윤규 교수님