【发布时间】:2017-02-15 01:07:40
【问题描述】:
我遇到了来自 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。
最后启动的 shell 也没有 root 权限(在大多数命令/脚本上获得权限被拒绝)。
我查看了 su.te(此代码正在替换现有的 su,只是为了更容易在现有的 AOSP 项目中进行测试),并补充说:
allow su self:capability { setuid setgid };
这也无济于事。
我也尝试添加 setgroups(0, NULL);在 setgid() 之前,但这并没有做任何事情。
还有什么可能遗漏/错误的?
编辑:阅读更多信息,可能 /system 文件夹上设置了 nosuid,但查看 init.rc,它似乎没有专门设置。
提前致谢。
【问题讨论】:
标签: root android-source su