【发布时间】: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