【问题标题】:How can I get root to work for system app in Android?如何让 root 为 Android 中的系统应用程序工作?
【发布时间】:2016-08-22 16:45:20
【问题描述】:

我需要将系统应用程序中的 nfs 共享挂载到 sdcard 或 mnt 文件夹,但 mount 仅在授予 root 访问权限的情况下工作。我怎样才能做到这一点? (这不仅仅是一个程序,没有root就无法运行。例如,我还需要root才能使用dd在我的系统上闪现自定义恢复)

我下载了 AOSP Marshmallow 源代码,将 su 及其所需的所有内容添加到 /system/xbin 文件夹。当我尝试运行su 时,它会打印出"Permission denied",但通过adb shell root 可以正常工作(我可以在xbin 文件夹中运行它)。我需要添加哪些权限才能以 root 身份运行我的系统应用程序?谢谢。

使用平台密钥构建和签名的系统和系统应用。我正在测试的应用在Manifest.xml 中具有sharedUid=android.uid.system 属性

【问题讨论】:

  • 你需要安装 supersu 或者同等的。
  • supersu 已安装,但没有 apk。我不希望其他应用获得root权限,我只希望某些平台应用获得root权限。

标签: android linux


【解决方案1】:

su 由 AOSP 提供,对它进行了限制,以确保您是调用它的 root 或 shell 用户。这张支票在https://android.googlesource.com/platform/system/extras/+/master/su/su.c#85

您始终可以将系统 UID (AID_SYSTEM) 添加到此检查中;但是,这会通过向具有系统 UID 的所有应用程序/进程授予一揽子 root 权限来构成安全风险。如果您接受这些风险并想要一个简单的解决方案,我只会将系统用户添加到 su.c 中的这一行。

我建议重新评估您的用例,并可能编写一个本机守护程序/服务,该服务为应用程序公开一个函数以仅执行所需的操作。然后,您可以使用更高级别的 android 权限以及本机守护程序本身的 POSIX 功能来强制执行这些操作。

【讨论】:

  • 哦,抱歉,我忘了把这个添加到我的帖子中 - 我已经将 AID_SYSTEM 添加到 su 文件中,但之后我在 setgid 和 setuid 函数上收到错误“不允许操作”。只有已经以 root 身份运行的应用和服务才能毫无问题地运行此功能。
  • 这方面有什么进展吗?
【解决方案2】:

唯一适合我的解决方案是由init 作为根进程启动的服务器二进制文件。我编写了简单的服务器二进制文件,可以从 java 端通过LocalSocket 连接,我可以向它发送一些命令。为了在系统启动时启动服务器二进制文件,我在init.rc 脚本中添加了下一行:

service suservice /system/bin/suservice
   class core
   user root
   group root
   socket suservice stream 0600 system system

在 java 方面,我编写了一个简单的库,该库通过回调接口工作,并从该服务接收数据,如果出现错误则出错。

现在只有以 system:system 开头的应用程序可以使用此本地套接字来运行 root 命令。用户应用收到Permission denied 已过期。

附:现在根本不需要运行或保留su 二进制文件,因为服务器二进制文件已经以root 身份运行。我现在可以从系统中完全删除 su 二进制文件了。

【讨论】:

  • 嗨,您的解决方案为我指明了正确的方向。我已经设置了所有内容,但在 Java 端收到“权限被拒绝错误”。知道为什么吗?出于测试目的,我已将套接字权限设置为“0666 系统系统”,以便我可以将我的应用程序作为常规应用程序进行调试。非常感谢!
  • 您好,请先尝试禁用 SELinux,因为它可能会阻止大部分 root 操作。它可以以 root 用户身份通过​​ shell 中的“setenforce 0”命令禁用。如果您在“Permission denied”消息之前在 logcat 中看到“[audit]”消息 - 这是 SELinux 中的问题,您需要为“suservice”添加 SELinux 权限,重新编译您的内核并重新刷新它。
  • 刚刚意识到我的套接字权限以某种方式保持为 0600。需要从恢复模式闪存启动。但我现在看到了一个不同的错误。 “拒绝连接”。我的 SELinux 处于许可状态,并且没有“[审计]”相关消息。猜猜SElinux不是问题。 Netstat 显示我的套接字处于活动状态,“unix 2 [] STREAM 9238 /dev/socket/tcpdump_nc”。
  • 对不起,我想我只是在撒谎。检查 kmsg 后,我看到几行带有“审计”相关消息的行。要尝试修改我的内核...
  • 嗨,我又回来了...所以我向套接字文件添加了 SELinux 权限,但 [audit] 消息似乎现在在 kmsg 中消失了。但我仍然看到同样的“连接被拒绝”错误。我在这里发布了我的问题。 stackoverflow.com/questions/42124623/…。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2018-06-24
  • 1970-01-01
  • 2013-08-05
  • 2013-03-17
  • 2015-08-17
相关资源
最近更新 更多