Я испытываю очень странное поведение от setgid/setuid. Они не возвращают код ошибки, но не настраивают разрешения процесса.AOSP setgid/setuid не имеют эффекта
Это KitKat, SELinux отключен (тоже с разрешающим).
Пример кода:
int main(int argc, char **argv)
{
if (setgid(0) || setuid(0))
{
fprintf(stderr, "su: unable to setgid/setuid!\n");
}
else
{
fprintf(stderr, "su: getgid: %d, getuid: %d\n", getgid(), getuid());
char *args[argc + 1];
args[0] = "sh";
args[argc] = NULL;
int i;
for (i = 1; i < argc; i++)
{
args[i] = argv[i];
}
execv("/system/bin/sh", args);
}
}
Выход в том, что getgid/getuid еще 1000, а не 0.
Запущенный оболочки в конце также не имеет прав суперпользователя (получение разрешения отказано в большинство команд/скриптов).
Я посмотрел на su.te (этот код заменяет существующий су, только чтобы сделать его проще тестировать в существующем AOSP проекта), и добавил:
allow su self:capability { setuid setgid };
Который не помогает ,
Я также попробовал добавить setgroups (0, NULL); перед setgid(), но это ничего не делало.
Что еще может быть отсутствует/не так?
РЕДАКТИРОВАТЬ: Если вы прочитали дополнительную информацию, возможно, что в папке/system установлена nosuid, но, просматривая init.rc, она явно не имеет этого набора.
Заранее спасибо.