Android开发中关于使用权限的常见错误( 二 )

阅读器应用程序的清单:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycoolreader">        <uses-permission android:name="com.mycoolcam.USE_COOL_CAMERA" />            <application android:label="My Cool Reader">                  <provider android:name=".AllUserNotesContentProvider" android:authorities="com.mycoolreader.notes_provider" android:exported="true" android:permission="com.mycoolcam.USE_COOL_CAMERA" />                  <!-- ... -->        </application></manifest>乍一看,似乎一切都很好且安全,因为只有生态系统中的应用程序才能访问存储在 AllUserNotesContentProvider中的敏感信息 。
但是,如果受害者的设备只安装了阅读器应用程序会发生什么?在这种情况下,Android系统将不知道com.mycoolcam.USE_COOL_CAMERA权限声明的任何内容,因此默认情况下会将权限级别标记为normal 。
为防止出现这种情况,请确保在每个应用程序中也分别声明来自多个应用程序生态系统的每个权限 。
 
权限名称中的错别字
开发人员在权限名称中打错字是非常常见的:
<permission android:name="com.mycoolcam.USE_COOL_CAMERA" android:protectionLevel="signature" /><activity android:name=".CoolCamActivity" android:exported="true" android:permission="com.mycoolcam.USE_COOL_CAM">         <intent-filter>                  <action android:name="com.mycoolcam.LAUNCH_COOL_CAM" />                  <category android:name="android.intent.category.DEFAULT" />         </intent-filter></activity>在以上示例中,com.mycoolcam.USE_COOL_CAMERA的权限的保护等级为signature,而com.mycoolcam.USE_COOL_CAM的将被设置为normal 。这允许任意应用程序使用com.mycoolcam.USE_COOL_CAM进行使用权限声明,从而授予对CoolCamActivity活动的访问权 。
 
组件声明中的错别字
<permission android:name="com.mycoolcam.USE_COOL_CAMERA" android:protectionLevel="signature" /><activity android:name=".CoolCamActivity" android:exported="true" android:uses-permission="com.mycoolcam.USE_COOL_CAMERA">           <intent-filter>                      <action android:name="com.mycoolcam.LAUNCH_COOL_CAM" />                      <category android:name="android.intent.category.DEFAULT" />           </intent-filter></activity>在以上示例中,它没有使用android:permission属性(设置组件的访问级别),而是使用android:uses-permission 。这将允许任何第三方应用程序访问它,因为这意味着该组件没有保护级别 。
 
权限保护不足
某些应用程序并没有完全保护他们使用的权限,这为第三方应用程序利用易受攻击的应用程序并获得权限留下了空间 。
让我们通过一个简单的例子更好地理解这一点 。
AndroidManifest.xml文件:
<uses-permission android:name="android.permission.READ_CONTACTS" /><provider android:name=".ContactsProvider" android:authorities="com.exampleapp.contacts" android:exported="true" />ContactsProvider.JAVA文件:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {    return getContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,                     projection,                     selection,                     selectionArgs,                     sortOrder); }


推荐阅读