从作为root

时间:2016-04-17 09:19:19

标签: android process permissions exec root

我有一个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源代码中找不到此文本。

1 个答案:

答案 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&);
};

因此在三星设备上失败而没有其他设备。