我能请求Zygote以root权限运行我的应用程序吗?

3
我正在研究在Java Android应用程序及其本身的JNI中获取超级用户权限的可能方法。众所周知,唯一可行的方法似乎是仅能从“su”子shell和命令行命令运行,这既不整洁也不实用。我愿意接受这个解决方案,但仍想听听对于这种“如果”的情况的意见。
通过阅读靠近java.com.android.server.am.ActivityManagerServicejava.android.os.Processdalvik_system_Zygote.cpp文件的Android源代码,我发现在应用程序启动期间,应用程序记录将被检查UID和(一系列)GID,并通过套接字将所有这些值传递给Zygote。然后,Z会在fork()调用后无需进一步检查即将数据传递给setuid()。因此,我认为,如果Activity Manager路径被更改,则简单地通过Zygote套接字传递--setuid=0--setgid=0应该会导致使用root UID运行我的Activity。
这一切似乎太简单了,我怀疑其中会出现问题。不幸的是,对于像我这样经验不足的程序员来说,有太多的代码和新东西需要去尝试。有人走过这条路吗?或者有什么明显的原因为什么这不会起作用吗?

1
不考虑以root身份运行应用程序的问题,那么在模拟器上尝试一下呢?如果您不想重新构建Android(这可能需要一些时间),则可以尝试使用ActivityManager或Zygote上的(Java或本地)调试器来更改通过套接字发送/接收的内容,以进行实验。 - Chris Stratton
哦,我明白了,我的表述可能不太清晰。我当然不想为此重新构建Android系统。我指的是绕过通过Intent启动应用程序和直接从我的应用程序与Zygote通信的便捷方式。我假设Activity Manager也是在没有root权限的情况下执行该操作(或者说实际上我不需要使用该套接字来获取它们)。如果我在这一点上有错误,请纠正我。 - The Vee
2
我非常确定 ActivityManager 需要普通应用程序无法获得的权限,如果它实际上是告诉 Zygote 运行某些内容的用户 ID 的话。否则,你已经发现了一个巨大的安全漏洞,这在过去三年中没有人想到过,虽然不是不可能,但似乎不太可能。 - Chris Stratton
1个回答

2

我想我刚刚找到了自己问题的答案。要感谢@Chris Stratton,他指出了使用模拟器的方法,并指出这种情况是多么荒谬。

关键在于一个地方,它在我没有查看的地方,在通过Zygote套接字发送命令和Zygote二进制本身之间,检查发生的点位于com.android.internal.os.ZygoteConnectionapplyUidSecurityPolicy方法中。如果调用者进程属于root,则可能确实请求生成的UID为零(或任何其他值)。普通用户也可以使用套接字,但请求新的UID或GID会导致ZygoteSecurityException


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接