【问题标题】:posix setuid different processposix setuid 不同的进程
【发布时间】:2011-08-18 12:21:55
【问题描述】:

我正在为 Android 开发一个应用程序,我需要将 Dalvik VM 提升为 root uid,因为在替代方案中,我需要编写许多由 Java 代码使用 sh 脚本启动的小型应用程序(使用超级用户,他们需要是root),我真的不想这样做!

虽然我现在正在尝试使用 capsetp 将 CAP_SETUID 设置为调用进程,但我不知道这是否会被所有 Android 内核广泛支持,因此我正在寻找可能的替代方案。

我的后备解决方案是启动一个根进程,该进程首先使用 seteuid 切换到正确的用户,使用应用程序 (execl) 启动 Dalvik VM,然后使用 JNI 切换回根用户...

还有其他选择吗?


编辑

我正在尝试此代码,但它无法应用新功能 (capsetp)。

我已经在 Android 上部分编译了 libcap(缺少 cap_file 的东西,但我不需要它),但此代码在标准发行版 (Ubuntu) 上不起作用。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#ifndef __user
#define __user
#endif
#include <linux/capability.h>
#include <sys/capability.h>

int main(int argc, char** argv)
{
    cap_t caps;
    cap_value_t cap_list[1];

    pid_t process_id = atoi(argv[1]);

    caps = cap_get_pid(process_id);
    if (caps == NULL)
    {
        perror("Failed to get capabilities");
        exit(-1);
    }

    printf("%s\n", cap_to_text(caps, NULL));

    cap_list[0] = CAP_SETUID; 

    if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
    {
        perror("Failed to add new capability");
        exit(-1);
    }

    if (capsetp(process_id, caps) == -1)     
    {
        perror("Failed to apply capabilities");
        exit(-1);
    }

    cap_free(&caps);

    return 0;
}

【问题讨论】:

  • 我认为您对用户和权限的工作方式存在一些严重的误解,在您尝试编写任何以 root 身份运行的内容之前需要解决这些误解...
  • 我确切地知道用户和权限是如何工作的,但我需要在运行时将非 root 进程设为 root(自然是从 root 进程),我正在寻找一种方法。
  • 为什么需要这么多的root权限?它应该在你心中升起警告标志。
  • 我需要访问uinput和fb0设备,需要使用java处理一个shell(使用pty)等等。实际上,我使用(编写)了许多由 java(使用 su)以 root 身份启动的小型 c 应用程序,并使用 unix 套接字完成它们的工作,但实际上它们是其中的五个,并且继续增加,使得所有这些都变得非常复杂:\

标签: android c linux posix dalvik


【解决方案1】:

我认为没有办法直接提升另一个进程的权限。执行此类操作的规范方法是 exec 一个 setuid-root 二进制文件,然后确定是否在重新exec 处理您的程序之前授予您的程序权限。想想susudo。当然,像这样的 setuid-root 程序可以与原始 root 进程通信以确定授予 root 权限是否安全。请记住,可能存在许多危险的极端情况。

【讨论】:

  • 嗯,那个解决方案是我的后备解决方案,但最后,我会继续使用很多小应用程序来处理必要的东西。我已经使用 exec 进行了一些测试,但 dalvikvm/java 应用程序不稳定(访问相机或传感器时发生崩溃,只有少数测试):\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2010-11-19
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多