AOSP setgid / setuid не имеют никакого эффекта

#root #android-source #su

#root #android-исходный код #su

Вопрос:

Я испытываю очень странное поведение от 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: %dn", 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.

Запущенная оболочка в конце также не имеет прав root (получение разрешений запрещено для большинства команд / скриптов).

Я посмотрел на su.te (этот код заменяет существующий su, просто чтобы упростить тестирование в существующем проекте AOSP) и добавил:

 allow su self:capability { setuid setgid };
  

Что тоже не помогает.

Я также пытался добавлять setgroups(0, NULL); раньше setgid() , но это ничего не дало.

Что еще может отсутствовать / быть неправильным?


РЕДАКТИРОВАТЬ: читая дополнительную информацию, возможно, что в папке / system установлен идентификатор nosuid, но, просматривая init.rc , похоже, что он специально не установлен.

Ответ №1:

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

Комментарии:

1. не могли бы вы объяснить подробнее, пожалуйста?