posix setuid不同的过程

时间:2011-08-18 12:21:55

标签: android c linux posix dalvik

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

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

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

任何替代方案?


修改

我正在尝试使用此代码,但无法应用新功能(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;
}

1 个答案:

答案 0 :(得分:2)

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