解决SharedUserId导致的SecurityException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决SharedUserId导致的SecurityException相关的知识,希望对你有一定的参考价值。

参考技术A 解决SharedUserId导致的SecurityException

收到一个谷歌报的异常:

是在显示notification的时候报错的。看意思是当前的包不属于当前的packageId,就很有意思。
因为我们是在原来的包的基础上搞了一个马甲包出来,而我们原来的包使用了SharedUserId,这个玩意儿就很坑,当初不知道为什么引进来的。
关于SharedUserId
android developer官网的说法,这玩意会导致不确定性的行为,强烈建议不要使用它。

来追一下这个原因,按照调用栈来看,这种没有头绪的报错可以直接去找报错位置,然后反推出来
Package com.xxx.xxx does not belong to 10326 这个在 AppOpsManager.checkPackage ,调用者是 NotificationManagerService#isCallerInstantApp() ,我们在这里能发现一丝端倪:

这里使用了getPackagesForUid返回的package[]数组的第0个package,比较这两个是否相同,如果 mAppOps.checkPackage(callingUid, pkg) 传入的这两个参数不匹配的话就直接报错。

所以原因可能是 mPackageManager.getPackagesForUid(callingUid) 返回的包名有多个并且第1个不是自己的包名
所以尝试自己获取比较,如果第0个返回的不是自己的包名,而是其他的包名的话则不去显示Notification。

使用 shareduserid 的安全性

【中文标题】使用 shareduserid 的安全性【英文标题】:security in using shareduserid 【发布时间】:2016-04-20 05:55:22 【问题描述】:

这听起来像是一个模糊的问题,但我不得不问。

我是一名初级 android 开发人员,刚刚了解了 android 中进程间通信的工作原理。 如果在 2 个应用程序中使用相同的 shareduserid,则它们有权访问彼此的数据,这意味着我可以反编译任何 apk,从清单中找出它的 shareduserid 并创建具有相同 shareduserid 的应用程序来访问其数据。

我错过了什么吗?

如果我想在未来创建 2 个应用程序(它们一起工作从而暴露 shareduserid),我应该如何保证我的数据安全?

【问题讨论】:

【参考方案1】:

共享用户 ID 由证书签名强制执行。仅当应用程序使用相同的证书签名时,平台才会授予/分配相同的用户 ID。 Ref.:

android:sharedUserId

将与其他应用程序共享的 Linux 用户 ID 的名称。默认情况下,Android 会为每个应用程序分配其自己的唯一用户 ID。但是,如果此属性为两个或多个应用程序设置为相同的值,它们将共享相同的 ID — 只要它们也由相同的证书签名。具有相同用户 ID 的应用程序可以访问彼此的数据,并且如果需要,可以在同一进程中运行。

【讨论】:

以上是关于解决SharedUserId导致的SecurityException的主要内容,如果未能解决你的问题,请参考以下文章

SharedUserId 访问 SharedPreferences

如何在清单中分配 android:sharedUserId?

android:sharedUserId="android.uid.system" 从 SDCard 获取文件

jenkins配置权限不对导致无法登陆或者空白页面解决办法

安卓去掉shareduserID签名校验

android:sharedUserId作用