본문으로 바로가기

안드로이드·갤럭시·AOS 애플리케이션 취약점진단/모의해킹 무료 강의 학식(hagsig)

 

가. 취약점 정의

1. 액티비티(Activity) 컴포넌트란?

- 안드로이드 애플리케이션은 *네 가지 기본요소로 구성되며, 이 기본요소를 컴포넌트(Component)라 부른다. 

*네 가지 기본요소(컴포넌트) : Activity, Service, Broadcast Receiver, Content Provider

 

- 액티비티(Activity)는 UI화면을 담당하는 컴포넌트로, 애플리케이션과 사용자 간의 상호작용할 수 있는 화면을 제공한다.

 

- 각 컴포넌트는 *인텐트(Intent)를 통해 상호작용하며, 인텐트를 통해 다른 애플리케이션의 액티비티를 호출할 수 있다.

*인텐트 : 애플리케이션 컴포넌트 간에 작업 수행을 위한 정보를 전달하는 통신수단 역할

 

- 메니페스트(AndroidManifest.xml) 파일에서 <activity> 요소를 통해 액티비티 컴포넌트를 확인할 수 있다.

* AndroidManifest.xml : Android가 앱을 실행하기 위해 알아야 하는 앱의 모든 컴포넌트가 정의되어 있는 파일

안드로이드 4대 컴포넌트
메니페스트(AndroidManifest.xml) 파일에서 <activity> 요소

 

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 이해도

 

- 위에 적힌 조치방법들을 적용한 뒤, 권한이 없는 사용자가 외부에서 액티비티를 강제 실행하는 경우 "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)

 

인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)

1. 인시큐어뱅크 앱 이란? - 모바일 뱅킹 취약점 진단을 위한 테스트 용도로 제작된 애플리케이션이다. - 안드로이드 앱 취약점 진단을 실습할 수 있는 환경을 제공한다. - 2019년 이후로 업데이트

hagsig.tistory.com

 

2. 진단 대상 앱 apk 파일 추출

- 아래의 링크를 참고하여 인시큐어뱅크 앱으로부터 apk 파일을 추출한다.

안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리

 

안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리

1. apk 파일이란? - 안드로이드(Android) OS에 애플리케이션(Application, App)을 설치할 수 있는 파일이다. - 윈도우 OS의 설치파일(exe, msi)같은거라 생각하면 쉽다. 2. apk 파일을 추출해야하는 이유 - 취약

hagsig.tistory.com

 

3. JADX를 이용하여 APK파일 분석

- 아래의 링크에 접속하여 jadx-gui-x.x.x-with-jre-win.zip 파일을 다운로드한 뒤, 압축을 해제한다.

https://github.com/skylot/jadx/releases/tag/v1.4.7

 

Release 1.4.7 · skylot/jadx

Features [core] Inline lambdas by instance field (#1800) [plugins] Allow to load classes using input stream or byte array in jadx-input plugin (#1457) Bug Fixes [core] Restore missing type param...

github.com

 

- 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

 

Android 개발자  |  Android Developers

이 애플리케이션이나 다른 애플리케이션의 특정 구성요소 또는 기능에 대한 액세스를 제한하는 데 사용될 수 있는 보안 권한을 선언합니다. 권한 작동 방식에 관한 자세한 내용은 소개의 권한

developer.android.com

 

- 안드로이드 퍼미션 정리(changhee09 블로그)

https://velog.io/@changhee09/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%8D%BC%EB%AF%B8%EC%85%98Permission

 

[안드로이드] 퍼미션(Permission)

안드로이드 - 퍼미션이란 무엇인가?

velog.io

 

- 안드로이드 퍼미션 정리(킵고잉 블로그)

https://develop-writing.tistory.com/57

 

안드로이드 퍼미션 개념 정리

퍼미션은 AndroidManifest.xml에 들어가는 설정입니다. 안드로이드는 컴포넌트를 이용한 앱과 앱 사이의 연동이 빈번합니다. 이러한 연동에서 어떤 앱이 을 부여했다면 그 앱을 이용하는 다른 앱은

develop-writing.tistory.com

 

- 안드로이드 4대 컴포넌트 설명 정리(cloud0 블로그)

https://velog.io/@cloud0/Android-4%EB%8C%80-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

Android 4대 컴포넌트란 무엇인가?

안드로이드의 4대 컴포넌트는 액티비티, 서비스, 콘텐트제공자, 방송수신자 이렇게 4가지를 말합니다. 어플리케이션을 만들때 주요 구성요소이자 안드로이드의 사실상의 모든 구성요소입니다.

velog.io

 

- 안드로이드 4대 컴포넌트 설명 정리(윤재박 블로그)

https://valuenetwork.tistory.com/119

 

Android Component란 무엇인가?

Android Developer 홈페이지의 공식 문서를 읽다보면 Component에 대한 언급이 자주 등장 합니다. 그 만큼 android에서 기초가 되고 중요한 요소들이라는 것을 알 수 있는데요, Android Component에 대한 공부를

valuenetwork.tistory.com

 

- 안드로이드 인텐트 설명 정리(NEWGENERATION, 보경&승환)

https://newgenerationkorea.wordpress.com/2015/07/09/%EC%9D%B8%ED%85%90%ED%8A%B8intent%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/

 

인텐트(Intent)란 무엇인가?

안드로이드 어플리케이션을 구성하는 네 가지 기본 요소에는 Activity, Service, Broadcast Receiver, Content Provider가 있다.  인텐트(Intent)란 이러한 어플리케이션 구성요소(컴포넌트) 간에 작업 수행을 위

newgenerationkorea.wordpress.com

 

- 안드로이드 인텐트 설명 정리(커니의 안드로이드 이야기)

https://androidhuman.tistory.com/262

 

내가 누군지 말해줘! - 인텐트 필터 (Intent Filter)

관련글 2009/09/05 - 안드로이드 어플리케이션의 구성요소 2009/10/11 - 어플리케이션 컴포넌트의 실행 : 인텐트(Intent) 암시적 인텐트(Implicit Intent)를 처리하려면 인텐트 객체에 들어 있는 여러 정보를

androidhuman.tistory.com

 

- 안드로이드 인텐트 설명 정리(커니의 안드로이드 이야기)

https://androidhuman.tistory.com/entry/%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%8B%A4%ED%96%89-%EC%9D%B8%ED%85%90%ED%8A%B8Intent

 

어플리케이션 컴포넌트의 실행 : 인텐트(Intent)

관련글 2009/09/05 - 안드로이드 어플리케이션의 구성요소 어플리케이션이 한 가지의 액티비티만으로 이루어지는 경우는 거의 없습니다, 대부분 여러개의 액티비티, 서비스 등으로 구성되어 각 컴

androidhuman.tistory.com

 

- 안드로이드 인텐트 설명 정리(안드로이드 공식 홈페이지)

https://developer.android.com/guide/components/intents-filters?hl=ko#java

 

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com