CodeQL 文档

内容提供程序中缺少读写权限

ID: java/android/incomplete-provider-permissions
Kind: problem
Security severity: 8.2
Severity: warning
Precision: medium
Tags:
   - security
   - external/cwe/cwe-926
Query suites:
   - java-security-extended.qls
   - java-security-and-quality.qls

单击以在 CodeQL 存储库中查看查询

Android 清单文件使用 provider 元素为应用程序指定内容提供程序。 provider 元素指定应用程序使用该提供程序访问资源所需的显式权限。您可以使用 android:readPermissionandroid:writePermissionandroid:permission 属性指定权限。如果您未指定执行操作所需的权限,应用程序将隐式拥有执行该操作的权限。例如,如果您仅指定 android:readPermission,则应用程序必须拥有读取数据的显式权限,但不需要写入数据的权限。

建议

为防止权限绕过,您应创建同时指定 android:readPermissionandroid:writePermission 属性,或指定 android:permission 属性的 provider 元素。

示例

在以下两个(错误)示例中,提供程序仅配置了读取或写入权限。这允许恶意应用程序通过请求访问不受限制的操作来绕过权限检查。

<manifest ... >
    <application ...>
      <!-- BAD: only 'android:readPermission' is set -->
      <provider
          android:name=".MyContentProvider"
          android:authorities="table"
          android:enabled="true"
          android:exported="true"
          android:readPermission="android.permission.MANAGE_DOCUMENTS">
      </provider>
    </application>
</manifest>
<manifest ... >
    <application ...>
      <!-- BAD: only 'android:writePermission' is set -->
      <provider
          android:name=".MyContentProvider"
          android:authorities="table"
          android:enabled="true"
          android:exported="true"
          android:writePermission="android.permission.MANAGE_DOCUMENTS">
      </provider>
    </application>
</manifest>

在以下(正确)示例中,提供程序配置了完全权限,保护其免受权限绕过。

<manifest ... >
    <application ...>
      <!-- Good: both 'android:readPermission' and 'android:writePermission' are set -->
      <provider
          android:name=".MyContentProvider"
          android:authorities="table"
          android:enabled="true"
          android:exported="true"
          android:writePermission="android.permission.MANAGE_DOCUMENTS"
          android:readPermission="android.permission.MANAGE_DOCUMENTS">
      </provider>
    </application>
</manifest>
<manifest ... >
    <application ...>
      <!-- Good: 'android:permission' is set  -->
      <provider
          android:name=".MyContentProvider"
          android:authorities="table"
          android:enabled="true"
          android:exported="true"
          android:permission="android.permission.MANAGE_DOCUMENTS">
      </provider>
    </application>
</manifest>

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私