3

我正在研究在 Java Android 应用程序和/或其自己的 JNI 中获取超级用户权限的可能方法。众所周知的答案似乎是只能从那里运行“su”子shell和命令行命令,这既不简洁也不实用。我愿意接受这个决议,但我仍然想听听关于这个“假设”场景的意见。

阅读附近的 Android 源代码java.com.android.server.am.ActivityManagerServicejava.android.os.Process文件dalvik_system_Zygote.cpp,在我看来,在应用程序启动期间,会检查应用程序记录的 UID 和(一个)GID(s)列表,并且所有这些值都通过套接字传递给 Zygote。Z 随后拾取数据并将其传递setuid()fork()呼叫之后,无需进一步检查。因此,在我看来,如果 Activity Manager 路径被更改,简单的传递--setuid=0并可能传递--setgid=0给 Zygote 套接字应该会导致使用根 UID 运行我的 Activity。

这一切似乎都太简单了,我怀疑在此过程中会出现问题。不幸的是,对于像我这样没有经验的程序员来说,有太多的代码和新东西去尝试。有没有人走这条路,或者有什么明显的原因导致这行不通?

4

1 回答 1

2

我想我刚刚找到了自己问题的答案。归功于@Chris Stratton,他指出我使用了模拟器,还指出了这种情况是多么荒谬。

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

于 2012-07-19T21:56:48.897 回答