应用程序创建的线程如何被视为与应用程序的 ContentProvider 不同的应用程序?

2024-01-02

我有一个应用程序,当收到通知时ContentObserver更改为ContentProvider,尝试在后台线程上查询提供程序。这会导致SecurityException被抛出:



8-10 15:54:29.577    3057-3200/com.xxxx.mobile.android.xxx W/Binder﹕ Caught a RuntimeException from the binder stub implementation.
  java.lang.SecurityException: Permission Denial: reading com.xxx.mobile.android.mdk.model.customer.ContentProvider uri content://com.xxx.mobile.android.consumer.xxx/vehicle from pid=0, uid=1000 requires the provider be exported, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:539)
           at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:452)
           at android.content.ContentProvider$Transport.query(ContentProvider.java:205)
           at android.content.ContentResolver.query(ContentResolver.java:478)
           at android.content.ContentResolver.query(ContentResolver.java:422)
  

应用程序创建的线程如何最终具有与应用程序的 ContentProvider 不同的 UID?

通过放置异常断点android.content.ContentProvider我看到UserHandle.isSameApp(uid, mMyUid) is false and UserHandle.isSameUser(uid, mMyUid) is true。我还看到提供商的 UID 是 10087。


uid值为1000属于Android系统。 Android 的许多功能都涉及将请求代理到系统线程进行处理。如果在此期间抛出异常,错误将包括系统的 uid,而不是原始请求者。

对于其他点:

UserHandle.isSameApp(uid, mMyUid) is false

UserHandle.isSameUser(uid, mMyUid) is true

通过查看这些最容易解释source https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/UserHandle.java。在支持多用户的 Android 设备上,每个用户都由一系列 UID 定义。isSameApp为 false,因为 ids 的模数不匹配:

 public static final boolean isSameApp(int uid1, int uid2) {
        return getAppId(uid1) == getAppId(uid2);
}

 public static final int getAppId(int uid) {
        return uid % PER_USER_RANGE;
}

同样,这两个 id 属于同一用户,因为它们位于同一范围内:

 public static final boolean isSameUser(int uid1, int uid2) {
        return getUserId(uid1) == getUserId(uid2);
 }

public static final int getUserId(int uid) {
        if (MU_ENABLED) {
            return uid / PER_USER_RANGE;
        } else {
            return 0;
        }
}

请注意,此逻辑是有缺陷的,因为它意味着所有 Android 系统 uid(

另请注意,如果第二个用户安装了超过 1000 个应用程序(!),则应用程序可能会被误认为是系统应用程序(两者都uid % PER_USER_RANGE将返回 1000)。但这并不重要,因为强大的沙箱会阻止任何事情too bad从发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用程序创建的线程如何被视为与应用程序的 ContentProvider 不同的应用程序? 的相关文章

随机推荐