获取平台签名后也无法读取系统文件

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

以上是关于获取平台签名后也无法读取系统文件的主要内容,如果未能解决你的问题,请参考以下文章

QStorageInfo获取磁盘信息(非常详细)

系统重装无法验证数字签名

Spring 云服务器无法从本地文件系统读取

Android apk 系统签名

Win10 无法加载操作系统,因为无法验证文件或某个xx数字签名 蓝屏错误代码0xc0000428

windows提示无法验证数字签名,无法正常进入操作系统