我有一个C二进制文件,我在Android中使用root用户(su -c binary_path)运行。
一切正常,直到二进制文件尝试执行*()另一个二进制文件。它实际上适用于大多数设备,但在某些设备上我得到了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 ok,S7失败了。
所以我检查了以下所有权限和安全上下文,发现没有区别:
/system/bin
/system/bin/sh
/system/bin/ls
<library_path>
/su/bin/su
同时检查二进制文件是否在UID / GID = 0下运行,两台设备都为true。
在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源代码中找不到此文本。
答案 0 :(得分:2)
搜索&#34;限制制作流程&#34;在Google上,我偶然发现了三星内核的S5和S6(不是S7)。
if (sec_check_execpath(current->mm, "/data/")) {
ret = 1;
goto out;
}
sec_restrict_fork()包含:
class Foo {
public:
bool std::operator==(const Foo&, const Foo&);
};
因此在三星设备上失败而没有其他设备。