안드로이드·갤럭시·AOS 애플리케이션 취약점진단/모의해킹 무료 강의 학식(hagsig)
가. 취약점 정의
1. 액티비티(Activity) 컴포넌트란?
- 안드로이드 애플리케이션은 *네 가지 기본요소로 구성되며, 이 기본요소를 컴포넌트(Component)라 부른다.
*네 가지 기본요소(컴포넌트) : Activity, Service, Broadcast Receiver, Content Provider
- 액티비티(Activity)는 UI화면을 담당하는 컴포넌트로, 애플리케이션과 사용자 간의 상호작용할 수 있는 화면을 제공한다.
- 각 컴포넌트는 *인텐트(Intent)를 통해 상호작용하며, 인텐트를 통해 다른 애플리케이션의 액티비티를 호출할 수 있다.
*인텐트 : 애플리케이션 컴포넌트 간에 작업 수행을 위한 정보를 전달하는 통신수단 역할
- 메니페스트(AndroidManifest.xml) 파일에서 <activity> 요소를 통해 액티비티 컴포넌트를 확인할 수 있다.
* AndroidManifest.xml : Android가 앱을 실행하기 위해 알아야 하는 앱의 모든 컴포넌트가 정의되어 있는 파일
2. 인텐트(Intent) 란?
- 어플리케이션 컴포넌트 간에 작업 수행을 위한 정보를 전달하는 통신수단 역할을 한다.
인텐트 설명 예시 |
어떤 컴포넌트에서 다른 컴포넌트를 호출하려면 "다른 컴포넌트를 호출하고 싶다"는 의사표현을 해야하는데, 안드로이드에서는 이러한 "의사표현"의 수단으로 인텐트를 사용한다. |
- 인텐트는 명시적,암시적 두 가지 유형이 있다.
인텐트 유형 | 내용 |
명시적 인텐트 (Explicit Intent) |
인텐트를 충족하는 애플리케이션이 무엇인지 지정한다. 이를 위해 대상 앱의 패키지 이름 또는 서비스의 클래스 이름을 제공해야한다. |
대상에 대한 정보를 알고있어야 하기때문에 일반적으로 앱 안에서 구성 요소를 실행할 때 사용한다. | |
예시) 사용자 작업에 응답하여 새로운 액티비티를 시작하거나 백그라운드에서 파일을 다운로드하기 위해 서비스를 시작하는 것 등 | |
암시적 인텐트 (Implicit Intent) |
특정 구성 요소의 이름을 대지 않지만, 그 대신 수행할 일반적인 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 해준다. |
예시) 사용자에게 지도에 있는 한 위치를 표시하고자 하는 경우, 암시적 인텐트를 사용하여 해당 기능을 갖춘 다른 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있다. |
- 앱이 수신할 수 있는 암시적 인텐트가 어느 것인지 알리려면, <intent-filter> 요소를 사용하여 매니페스트 파일에 선언해야 한다.
- <intent-filter> 내부에서는 action, data, category 세 가지 요소 중 하나 이상을 사용하여 허용할 인텐트 유형을 지정할 수 있다.
인텐트 필터 속성 | 내용 |
action | 인텐트가 수행할 작업을 정의한다. |
data | 작업을 수행할 데이터 또는 해당 데이터의 MIME 유형을 참조하는 URI를 정의한다. |
category | 인텐트를 처리해야 하는 구성 요소의 종류에 관한 추가 정보를 정의한다. |
# 인텐트 필터 사용 예시
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
3. 취약한 액티비티란?
- 기본적으로 다른 애플리케이션에서 액티비티를 실행할 수 없도록 exported 속성이 false로 설정되어 있다.
- exported 속성을 true로 변경할 경우 액티비티를 실행하기 위한 과정을 무시하고 강제 호출 가능이 가능해진다.
예시) 권한이 없는 사용자가 해당 취약점을 이용해 중요정보가 출력되는 액티비티를 강제 호출할 경우 인증 없이 중요정보를 열람할 수 있다.
※ exported 속성에 대한 설정이 존재하지 않을 경우 기본값 false가 적용된다.
#안전한 액티비티 예시
<activity android:name="com.hagsig.tistory"></activity>
<activity android:name="hagsigreceiver" android:exported="false"></activity>
#취약한 액티비티 예시
<activity android:name="hagsigreceiver" android:exported="true"></activity>
※ exported 속성이 설정되어 있지 않으나 <intent-filter>를 사용할 경우 기본값이 true로 설정된다.
#안전한 인텐트 필터 액티비티 예시
<activity android:name="com.hagsig.blog" android:exported="false">
<intent-filter>
<action android:name="hagsigtistoryblog"/>
</intent-filter>
</activity>
#취약한 인텐트 필터 액티비티 예시
<activity android:name="com.hagsig.blog">
<intent-filter>
<action android:name="hagsigtistoryblog"/>
</intent-filter>
</activity>
나. 대응 방안
1. 모든 액티비티에 권한 체크 기능 추가
- 액티비티가 강제 호출되더라도 인증정보가 없거나, 적절한 권한을 소유하지 않았을 경우 앱을 강제 종료하는 기능을 추가한다.
- 루팅 또는 애뮬레이터 환경에서는 모든 액티비티를 강제 실행할 수 있으므로 모든 액티비티에 권한 체크 기능을 추가해야한다.
2. exported 속성을 false로 설정
- 다른 앱과의 연동이 필요하지 않은 경우 exported 속성을 false로 설정하여야 한다.
- <intent-filter> 가 설정되지 않은 경우 exported 속성이 기본값 false로 설정된다.
#안전한 액티비티 export 속성 설정 예시
<activity android:name="hagsigreceiver"></activity>
<activity android:name="hagsigreceiver" android:exported="false"></activity>
- <intent-filter>를 사용할 경우 exported 속성이 기본값 true로 설정되므로, 반드시 false로 설정해주어야 한다.
# 안전한 인텐트 필터를 사용한 엑티비티 예시
<activity android:name="com.hagsig.blog" android:exported="false">
<intent-filter>
<action android:name="hagsigtistoryblog"/>
</intent-filter>
</activity>
3. protectionLevel을 signature로 설정
- 연동이 필요할 경우 exported 속성을 true로 설정한 뒤, protectionLevel을 signature로 설정한다.
- signature 로 설정되는 경우 같은 서명을 사용하는 앱 간에만 액티비티를 호출할 수 있다.
# 보안설정한 액티비티 예시1
<permission
android:name="com.hagsig.permission"
android:protectionLevel="signature"/>
<activity
android:name="com.hagsig.blog"
android:exported="true"
android:permission="com.hagsig.permission">
</activity>
# 보안설정한 액티비티 예시2
<permission
android:name="com.hagsig.permission"
android:protectionLevel="signature"/>
<activity
android:name="com.hagsig.blog"
android:permission="com.hagsig.permission">
<intent-filter>
<action android:name="hagsigtistoryblog"/>
</intent-filter>
</activity>
- permission을 부여하여 사용중일 경우 다른 앱에서 해당 앱의 액티비티를 호출하기 위해 uses-permission을 선언해야 한다.
# 다른 애플리케이션에서의 보안 설정
<uses-permission android:name="com.hagsig.permission"/>
- 위에 적힌 조치방법들을 적용한 뒤, 권한이 없는 사용자가 외부에서 액티비티를 강제 실행하는 경우 "Permission Denial" 메시지가 출력되며 액티비티 실행할 수 없게 된다.
※ 루팅 또는 애뮬레이터 환경에서는 보안설정이 적용된 액티비티도 강제 실행할 수 있으니 주의하길 바란다.
#액티비티 강제 실행 명령어 형식
adb shell am start -n [package name/component name]
#명령어 수행 예시
adb shell am start -n com.android.insecurebankv2/.DoLogin
#명령어 수행 결과
Starting: Intent { cmp=com.android.insecurebankv2/.DoLogin }
Exception occurred while executing 'start':
java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=com.android.insecurebankv2/.DoLogin }
4. 루팅 또는 애뮬레이터 환경 체크 기능 추가
- 액티비티에 export, protectionLevel 보안설정을 적용하더라도 루팅 또는 애뮬레이터에서는 액티비티를 강제 실행할 수 있다.
- 루팅 또는 애뮬레이터 환경에서 앱이 실행될 경우, 앱이 강제 종료되는 기능을 추가하여 보안 설정한 액티비티가 강제 실행되는것을 방지한다.
다. 취약점 진단 실습
1. 분석 대상 앱 설치
- 실습을 위해 인시큐어뱅크 애플리케이션을 설치한다.
※ 인시큐어뱅크 앱이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.
2023.04.10 - [Mobile App 취약점 진단/AOS App 진단] - 인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)
2. 진단 대상 앱 apk 파일 추출
- 아래의 링크를 참고하여 인시큐어뱅크 앱으로부터 apk 파일을 추출한다.
안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리
3. JADX를 이용하여 APK파일 분석
- 아래의 링크에 접속하여 jadx-gui-x.x.x-with-jre-win.zip 파일을 다운로드한 뒤, 압축을 해제한다.
https://github.com/skylot/jadx/releases/tag/v1.4.7
- jadx-gui-x.x.x.exe 를 실행한 뒤 위에서 추출한 인시큐어뱅크 apk파일을 연다음, *AndroidManifest.xml 파일을 열람한다.
* AndroidManifest.xml 파일 경로 : InsecureBankv2.1.0.apk → 리소스 → AndroidManifest.xml
4. android:exported="true" 설정 여부 확인
- 텍스트 검색 기능으로 exported 속성이 true로 설정된 액티비티가 존재하는지 *검색한다.
*검색어 : android:exported="true"
- 검색된 결과 중 <application> 요소 안에 보안설정이 되지 않은 <activity>가 존재하는지 확인한다.
5. 취약한 액티비티 강제 실행
- adb를 통해 위에서 확인한 취약한 액티비티를 강제 실행하여 중요정보가 노출되는 액티비티가 있는지 확인한다.
# 취약한 액티비티 강제실행 명령어 형식
# adb shell am start -n [package name/component name]
adb shell am start com.android.insecurebankv2/.LoginActivity
adb shell am start com.android.insecurebankv2/.PostLogin
adb shell am start com.android.insecurebankv2/.DoTransfer
adb shell am start com.android.insecurebankv2/.ViewStatement
adb shell am start com.android.insecurebankv2/.ChangePassword
6. 보안설정이 적용된 액티비티 강제 실행
- 액티비티에 export, protectionLevel 보안설정이 적용되더라도 루팅 또는 애뮬레이터 환경에서는 강제 실행이 가능하다.
- 각 액티비티에 권한 체크 기능이 적용되어져 있지 않을 경우 강제 실행을 통해 중요정보가 노출되거나 계정정보를 변조하는 화면이 실행될 수 있으므로, 모든 액티비티를 강제 실행하여 2차 피해로 이어질 취약점이 존재하는지 확인한다.
라. 참고자료
- 안드로이드 공식 홈페이지 참고자료
https://developer.android.com/guide/topics/manifest/permission-element?hl=ko
- 안드로이드 퍼미션 정리(changhee09 블로그)
- 안드로이드 퍼미션 정리(킵고잉 블로그)
https://develop-writing.tistory.com/57
- 안드로이드 4대 컴포넌트 설명 정리(cloud0 블로그)
- 안드로이드 4대 컴포넌트 설명 정리(윤재박 블로그)
https://valuenetwork.tistory.com/119
- 안드로이드 인텐트 설명 정리(NEWGENERATION, 보경&승환)
- 안드로이드 인텐트 설명 정리(커니의 안드로이드 이야기)
https://androidhuman.tistory.com/262
- 안드로이드 인텐트 설명 정리(커니의 안드로이드 이야기)
- 안드로이드 인텐트 설명 정리(안드로이드 공식 홈페이지)
https://developer.android.com/guide/components/intents-filters?hl=ko#java
'Mobile App 취약점 진단 · 모의해킹 > AOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
[AOS 취약점 진단] 12강 - 취약한 콘텐츠 프로바이더 점검 (0) | 2024.01.21 |
---|---|
[AOS 취약점 진단] 11강 - 취약한 브로드캐스트 리시버 점검 (0) | 2024.01.21 |
DDMS.bat 실행 오류 해결방법(No suitable Java found) (0) | 2024.01.04 |
[AOS 취약점 진단] 09강 - 메모리 내 중요정보 노출 확인(am dumpheap) (0) | 2023.12.09 |
[AOS 취약점 진단] 09강 - 메모리 내 중요정보 노출 확인(DDMS) (0) | 2023.12.09 |