#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. не могли бы вы объяснить подробнее, пожалуйста?