获取平台签名后也无法读取系统文件
Posted
技术标签:
【中文标题】获取平台签名后也无法读取系统文件【英文标题】:Cannot read system files even after obtaining platform signature 【发布时间】:2014-02-12 04:35:34 【问题描述】:我已经构建了一个自定义的 android ROM。我已经使用平台签名对我的应用程序进行了签名,并在清单文件中添加了android:sharedUserId="android.uid.system"
。我的应用被授予所有“签名”和“系统”级别权限,但未授予对系统文件的访问权限。
Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.ACCESS_SURFACE_FLINGER")== PackageManager.PERMISSION_GRANTED)); // true
Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.READ_FRAME_BUFFER")== PackageManager.PERMISSION_GRANTED)); // true
Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.INJECT_EVENTS")== PackageManager.PERMISSION_GRANTED)); // true
Log.w("PC", String.valueOf(new File("/dev/graphics/fb0").canRead())); // false
Log.w("PC", String.valueOf(new File("/data/misc/wifi/wpa_supplicant.conf").canRead())); // false
文件的权限是:
ls -l /dev/graphics/fb0
crw-rw---- root graphics 29, 0 2014-02-12 09:43 fb0
ls -l /data/misc/wifi/wpa_supplicant.conf
-rwxrwx--- wifi wifi 282 2014-02-11 19:04 wpa_supplicant.conf
有什么方法可以访问这些文件吗?
【问题讨论】:
您是如何获得平台签名的? 我已经构建了一个自定义的 android ROM。 那么,要运行您的应用程序,您是否必须向用户提供自定义 Android ROM? 是的。我将为我的用户提供自定义 ROM。 【参考方案1】:我已经找到了解决方案。除了平台签名和android:sharedUserId="android.uid.system"
,您还需要在清单文件的<application />
部分添加android:process="system"
。
【讨论】:
这似乎是一个解决方案,这似乎令人惊讶,因为它不是进程,而是用户 ID 对 unix 级权限很重要。 我同意你的观点,克里斯。就连我也对这个发现感到惊讶。我已经多次验证了它,令人惊讶的是它的工作原理。【参考方案2】:每个 Android 应用都使用唯一的 Linux UID/GID 运行。显然,您既不是这些文件的所有者,也不是该组的成员。最简单的做法是将文件权限更改为世界可读。不确定在那种情况下这些文件的安全含义是什么。您应该可以通过 adb shell 中的 su 来完成。永久的方法是在构建时更改文件权限。如果您的应用程序包含在您的自定义 rom 中,您可以设置 GID。查看 system/core/include/private/android_filesystem_config.h 以获得默认 UID/GID 权限。
【讨论】:
但是要更改普通用户没有权限的权限,afaik设备必须root 我不想将权限更改为世界可读!我没有将我的应用程序包含在自定义 ROM 中,我希望用户根据需要安装我的应用程序。我读过将android:sharedUserId="android.uid.system"
添加到清单中会使应用程序成为根组的成员。但不幸的是,它没有用。我还能尝试什么?
我会尝试找出拥有这些文件的应用程序正在使用哪个 UID 运行,并将您的 sharedUserId 设置为该 UID,而不是依赖于属于根组。此外,请务必确保您使用平台密钥签署您的应用程序。听起来你是;但如果做得不对,就什么都做不了。
我想成为root用户的另一个原因是我想获取端口***.com/a/2695160/925202
好吧,android_filesystem_config.h 文件包含以下内容: tatic const struct android_id_info android_ids[] = ... ... "root", "system", "radio", "蓝牙”,“图形”,“输入”,AID_ROOT,,AID_SYSTEM,,AID_RADIO,,AID_BLUETOOTH,,AID_GRAPHICS,,AID_INPUT,,你试过android:sharedUserId="android.uid.root " ?【参考方案3】:
您的系统用户不是没有图形/wifi 组权限。系统用户不是超级用户,有限制。
我不知道您正在构建什么平台,但在我的平台中,我无法默认要求 wifi 和图形权限。您需要创建权限。
在您的 android_filesystem_config.h 中,您可以看到 AID_GRAPHICS 和 AID_WIFI 已经定义,这意味着已经完成了一半的工作(如果您想创建全新的权限,则必须将它们添加到此文件中)。 AID 定义也映射到同一文件中结构中的“变量”。 这是我的代码的 sn-p:
static const struct android_id_info android_ids[] =
"root", AID_ROOT, ,
"system", AID_SYSTEM, ,
"radio", AID_RADIO, ,
"bluetooth", AID_BLUETOOTH, ,
"graphics", AID_GRAPHICS, ,
第二步是将它们添加到platform.xml。可能依赖于平台,但我可以在 /frameworks/base/data/etc 中找到我的 platform.xml。 这是权限定义的示例
<permission name="android.permission.GRAPHICS" >
<group gid="graphics" />
</permission>
android.permission.GRAPHICS 只是一个示例,您可以随意调用它。 在权限资源中,您定义要授予调用此权限的任何人的 gid。您在此处使用的 gid 需要与 android_filesystem_config.h 文件中定义的 gid 相同。
现在您已经创建了一个权限,您可以在您的应用程序 AndroidManifest.xml 中调用它
<uses-permission android:name="android.permission.GRAPHICS" />
您现在应该拥有图形组权限并且能够读取 /dev/graphics/fb0
【讨论】:
如果将来有人看到这个答案,则需要在 frameworks/base/core/res/AndroidManifest.xml 中进行额外的更改。在这里参考我的回答***.com/a/49565570/553094以上是关于获取平台签名后也无法读取系统文件的主要内容,如果未能解决你的问题,请参考以下文章