컨텐츠 프로바이더의 접근에 있어서 권한 검증이 미흡한 경우, 앱 내의 민감한 정보들을 유출할 수 있는 취약점 입니다.

 

우선 컨텐츠 프로바이더란?

앱에서 다른 앱의 데이터가 필요할 때 사용할 수 있도록 해주는 역할을 합니다.

 

예를들어 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)

 

에러가 발생하게 됩니다.

 

 

Posted by ICEB34R