我遇到了来自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 };这也无济于事。
我还尝试在setgid()之前添加setgroups(0,NULL);,但没有任何效果。
还可能遗漏/错误什么?
编辑:阅读更多信息,可能是/system文件夹上设置了nosuid,但是通过init.rc查看,它似乎并没有特别设置。
提前谢谢。
发布于 2016-10-12 05:49:14
我已经解决了这个问题--显然这个问题是因为没有在可执行文件上设置粘性安全位。
https://stackoverflow.com/questions/39893422
复制相似问题