我正在为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;
}
答案 0 :(得分:2)
我认为没有办法直接提升另一个进程的权限。执行此类操作的规范方法是exec
setuid-root二进制文件,然后在重新exec
程序之前确定是否授予程序权限。考虑su
或sudo
。当然,像这样的setuid-root程序可以与原始根进程通信,以确定授予root是否安全。请记住,可能存在许多危险的角落案件。