외로운 Nova의 작업실

insecurebankv2 - 취약한 인증 메커니즘 취약점 본문

Mobile App Penetesting/Android App Vulnerability

insecurebankv2 - 취약한 인증 메커니즘 취약점

Nova_ 2023. 5. 7. 20:03

- 취약점 소개

취약한 인증 메커니즘은 정상적인 인증 절차를 우회하여 비정상적인 인증으로 접근권한을 획득하는 취약점입니다.

 

- 취약점 진단 과정

매니페스트파일을 보면 액티비티의 속성중 exported=true 항목이 있는 액티비티들이 있습니다. 이 경우 다른 액티비티에서 인증없이 접근할 수 있습니다. 아래는 매니페스트 파일입니다.

<manifest versionCode="1"
          versionName="1.0"
          package="com.android.insecurebankv2"
          platformBuildVersionCode="22"
          platformBuildVersionName="5.1.1-1819727">
  <uses-sdk minSdkVersion="15"
            targetSdkVersion="22">
  </uses-sdk>
  <uses-permission name="android.permission.INTERNET">
  </uses-permission>
  <uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE">
  </uses-permission>
  <uses-permission name="android.permission.SEND_SMS">
  </uses-permission>
  <uses-permission name="android.permission.USE_CREDENTIALS">
  </uses-permission>
  <uses-permission name="android.permission.GET_ACCOUNTS">
  </uses-permission>
  <uses-permission name="android.permission.READ_PROFILE">
  </uses-permission>
  <uses-permission name="android.permission.READ_CONTACTS">
  </uses-permission>
  <uses-permission name="android.permission.READ_PHONE_STATE">
  </uses-permission>
  <uses-permission name="android.permission.READ_EXTERNAL_STORAGE"
                   maxSdkVersion="18">
  </uses-permission>
  <uses-permission name="android.permission.READ_CALL_LOG">
  </uses-permission>
  <uses-permission name="android.permission.ACCESS_NETWORK_STATE">
  </uses-permission>
  <uses-permission name="android.permission.ACCESS_COARSE_LOCATION">
  </uses-permission>
  <uses-feature glEsVersion="0x20000"
                required="true">
  </uses-feature>
  <application theme="@16974105"
               label="@2131165248"
               icon="@2130903040"
               debuggable="true"
               allowBackup="true">
    <activity label="@2131165248"
              name="com.android.insecurebankv2.LoginActivity">
      <intent-filter>
        <action name="android.intent.action.MAIN">
        </action>
        <category name="android.intent.category.LAUNCHER">
        </category>
      </intent-filter>
    </activity>
    <activity label="@2131165271"
              name="com.android.insecurebankv2.FilePrefActivity"
              windowSoftInputMode="0x34">
    </activity>
    <activity label="@2131165268"
              name="com.android.insecurebankv2.DoLogin">
    </activity>
    <activity label="@2131165275"
              name="com.android.insecurebankv2.PostLogin"
              exported="true">
    </activity>
    <activity label="@2131165278"
              name="com.android.insecurebankv2.WrongLogin">
    </activity>
    <activity label="@2131165269"
              name="com.android.insecurebankv2.DoTransfer"
              exported="true">
    </activity>
    <activity label="@2131165277"
              name="com.android.insecurebankv2.ViewStatement"
              exported="true">
    </activity>
    <provider name="com.android.insecurebankv2.TrackUserContentProvider"
              exported="true"
              authorities="com.android.insecurebankv2.TrackUserContentProvider">
    </provider>
    <receiver name="com.android.insecurebankv2.MyBroadCastReceiver"
              exported="true">
      <intent-filter>
        <action name="theBroadcast">
        </action>
      </intent-filter>
    </receiver>
    <activity label="@2131165267"
              name="com.android.insecurebankv2.ChangePassword"
              exported="true">
    </activity>
    <activity theme="@16973839"
              name="com.google.android.gms.ads.AdActivity"
              configChanges="0xfb0">
    </activity>
    <activity theme="@2131296479"
              name="com.google.android.gms.ads.purchase.InAppPurchaseActivity">
    </activity>
    <meta-data name="com.google.android.gms.version"
               value="@2131427332">
    </meta-data>
    <meta-data name="com.google.android.gms.wallet.api.enabled"
               value="true">
    </meta-data>
    <receiver name="com.google.android.gms.wallet.EnableWalletOptimizationReceiver"
              exported="false">
      <intent-filter>
        <action name="com.google.android.gms.wallet.ENABLE_WALLET_OPTIMIZATION">
        </action>
      </intent-filter>
    </receiver>
  </application>
</manifest>

여기서 PostLogin, DoTransfer, ViewStatement 액티비티는 export가 true로 설정되어 있습니다. 이를 통해 로그인 없이 해당 액티비티에 접근이 가능합니다. drozer를 사용하여 접근해보겠습니다.

dz> run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.PostLogin
dz> run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.DoTransfer
dz> run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ViewStatement

이렇게 로그인 과정없이 불러내서 인증을 우회할 수 있습니다.

 

- 취약점 대응 방안

exported 속성을 false로 변경하여 같은 앱 혹은 같은 유저 id를 가진 앱의 컴포넌트만 불러올 수 있게합니다. 또한 만약 true로 설정할 경우 별도의 인텐트 필터로 검증해야합니다. 

Comments