android - posix setuid 不同进程

标签 android c linux posix dalvik

我正在为 Android 开发一个应用程序,我需要将 Dalvik VM 提升为 root uid,因为在替代方案中,我需要编写许多由 Java 代码使用 sh 脚本(使用 super 用户,他们需要成为 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;
}

最佳答案

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

关于android - posix setuid 不同进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7107321/

相关文章:

java - UDP 将数据从一台设备发送到另一台设备

android - 不允许加载本地资源 :file:///android_asset phonegap

android - 如何在iphone和android手机上运行本地html文件?

c - C 中的反转位并将二进制转换为十进制

c++ - 外部如何工作?

c++ - 如何用ICU编译sqlite?

linux - Unix sed XML 配置编辑

android - 约束布局的子边距

c - Linux 内核字符驱动程序写入调用未按预期工作

linux - 在 Linux 上静态构建 glew 和 glfw