Я занимаюсь разработкой приложения для 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;
}