Android 使用 PLATFORM 密钥签名的 APK 未获得系统权限?

Android APK signed with PLATFORM key not given system privileges?

我可以访问 Android 平板电脑的平台密钥和证书。我正在尝试构建一个应用程序并通过执行以下操作以系统级权限安装它:

  1. 使用 platform.pk8 和平台创建一个 Java KeyStore 文件。x509.pem 使用在 [=46 上找到的名为 platform_import_keystore 的 bash 脚本=].

  2. 在AndroidManifex.xml中添加以下内容:

    <uses-permission android:name="android.permission.READ_LOGS"/> android:sharedUserId="android.uid.system"

  3. 在 Android Studio 中使用 Java KeyStore 文件使用 PLATFORM 密钥和证书对 APK 进行签名。

  4. 安装 APK

应用程序运行时,系统拒绝READ_LOGS权限。 为什么我的应用程序 运行 没有系统级权限?

对于系统应用程序,@Mark 提到的在某种程度上是正确的。 我认为你做错了其他事情。 我也用系统应用程序试过这个,只要它是用平台密钥库签名的,它就可以工作。现在这是在 Android 8 和 Android 9 上。您没有提到设备的 AOSP 版本 运行。

这改变了 AFAIK,所以如果它是 AOSP 10+,它的行为可能会有所不同。

其他评论也遗漏了另一个关键的东西 SELinux。 SELinux 不允许用户构建。 Verity 已启用,您无法拥有 root 访问权限。因此,您无法将应用推送到 /system/priv-app/ 或将其推送到 /vendor/app/。 如果没有适当的 SE 策略文件,您将无法访问系统资源。您可以自己查看日志,查看 avc denied 条消息。

我认为总体而言,您所看到的应该符合 AOSP 的安全理念。使用系统密钥签名的应用程序不应获得系统权限。它还需要位于正确的位置,作为特权应用程序或供应商应用程序。此类应用需要列入白名单。 AOSP 源代码中有一个内置脚本甚至可以生成白名单权限(它生成所需的 xml)

有两个 类 系统应用,/system/app//system/priv-app/ 特权应用程序是唯一获得签名级别权​​限的应用程序,根据 android 的较新版本,您需要在 /system/etc/priv_app-permissions_device_name.

中启用白名单

如果您在启用 verity 时对系统或供应商进行任何更改,首先它们会以只读方式挂载,但不知何故,如果您确实进行了更改,设备将自行变砖。这是安全功能。所有自定义开发都需要在 userdebug builds 中以 permissive 模式使用 SELinux 完成,然后需要预定义所有权限,将 SE Policies 微调到最小,只有这样 user build 才能正常运行。用户构建根本不适合 AOSP 开发活动,即使它只是用于测试或试用单个应用程序。

用户构建是最终用户可以使用的生产类型构建,不用于开发。它是 android 最安全的形式,所以如果您有平台密钥,它可能永远不够用。

综上所述,我确定您没有正确的密钥。只需从 system/priv-app/ 中提取一个应用程序并使用 keytool 或类似的方法检查它的签名,然后尝试与您的发布 apk 相匹配。

它有点复杂,有点难以解释 android 中也有权限级别,所以如果您不遵循特定的 approach/path,您将不会能够让它工作。