【问题标题】:Permission denied on exec() from a binary running as root从以 root 身份运行的二进制文件的 exec() 权限被拒绝
【发布时间】: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


【解决方案1】:

在 Google 上搜索“Restricted Making process”后,我偶然发现了适用于 S5 和 S6(不是 S7)的三星内核。

if(CHECK_ROOT_UID(current))
    if(sec_restrict_fork())
    {
        PRINT_LOG("Restricted making process. PID = %d(%s) "
                        "PPID = %d(%s)\n",
            current->pid, current->comm,
            current->parent->pid, current->parent->comm);
        return -EACCES;
    }

而 sec_restrict_fork() 包含以下内容:

if (sec_check_execpath(current->mm, "/data/")) {
    ret = 1;
    goto out;
}

因此在三星设备上出现故障,在其他设备上没有。

【讨论】:

  • 祝福你分享这个!
  • 据我所知,这个问题目前还影响到一些非三星设备,例如Nexus 5。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多