2016-10-06 13 views
0

Я испытываю очень странное поведение от 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, она явно не имеет этого набора.

Заранее спасибо.

ответ

0

Я решил это - по-видимому, проблема была связана с липкой безопасности, не установленной в исполняемом файле.