【发布时间】:2016-04-17 09:19:18
【问题描述】:
我有一个 C 二进制文件,我在 Android 中使用 root 用户 (su -c binary_path) 运行。
在二进制文件尝试 exec*() 另一个二进制文件之前一切正常。它实际上适用于大多数设备,但在某些设备上我收到 EACCES 错误。
C 二进制文件实际上是使用这个来启动的:
execlp("su","su","-c",binary_path,NULL);
在某些时候,二进制文件会尝试进行这些调用(简化):
fork();
...
// child here
execlp("sh","sh","-c",script,NULL);
在不同的 Android 6.0 设备、Nexus 9 和 S7 上进行了实际测试。 Nexus 9 正常,S7 失败。
所以我检查了以下所有权限和安全上下文,发现没有区别:
/system/bin
/system/bin/sh
/system/bin/ls
<library_path>
/su/bin/su
还检查了二进制文件是否在 UID/GID = 0 的情况下在两个设备上运行。
在 logcat 中,我没有看到任何针对缺少权限或违反安全策略的审核。
编辑:刚刚验证了二进制文件运行的安全上下文:
$ps -Z
u:r:init:s0 root ...
无论 exec() 是否有效,两种设备都相同。
EDIT2:在失败的设备上,/proc/kmsg 在尝试 exec() 时包含此内容:
Restricted making process. PID = 8868(<binary>) PPID = 8340(<binary>)
没有来自 selinux 的 avc,并且在 AOSP 源代码中找不到此文本。
【问题讨论】:
-
用你的java应用来运行C代码?
-
二进制文件是从一个从 Java 应用程序调用的共享库中启动的。再次澄清一下,二进制文件被授予 root 权限就好了,并且可能会调用 exec() 这将在某些设备上失败,而不是全部。
-
也许是对 Manifest 的明确许可?尝试添加 WRITE_EXTERNAL_STORAGE
-
该应用已拥有此权限。二进制文件位于 /data/local 下,根据需要设置了所有权限,也尝试了 777,没有区别。
标签: android process permissions exec root