posix setuid другой процесс - PullRequest
2 голосов
/ 18 августа 2011

Я занимаюсь разработкой приложения для Android, и мне нужно повысить уровень виртуальной машины Dalvik до root uid, потому что в качестве альтернативы мне нужно написать множество небольших приложений, запускаемых кодом Java с использованием сценариев sh (с суперпользователем, они должны быть суперпользователями) и я действительно не хочу этого делать!

Хотя сейчас я пытаюсь использовать capsetp для установки CAP_SETUID в вызывающем процессе, я не знаю, будет ли это широко поддерживаться всеми ядрами Android, поэтому я ищу возможные альтернативы.

Мое альтернативное решение - запустить корневой процесс, который сначала будет использовать seteuid для переключения на нужного пользователя, запустить виртуальную машину Dalvik с приложением (execl) и, используя JNI, вернуться к пользователю root ...

Есть альтернатива?


EDIT

Я пытаюсь этот код, но он не может применить новые возможности (capsetp).

Я частично скомпилировал libcap на Android (отсутствует 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 Ответ

2 голосов
/ 18 августа 2011

Я не думаю, что есть способ повысить привилегии другого процесса напрямую. Канонический способ сделать такие вещи - это exec двоичный файл setuid-root, который затем определяет, следует ли предоставить привилегии вашей программе, прежде чем exec перезапустить вашу программу. Подумайте su или sudo. Конечно, ваша программа setuid-root может взаимодействовать с исходным процессом root, чтобы определить, безопасно ли предоставлять root. Имейте в виду, что может быть много опасных угловых случаев.

...