我写了这个函数:
void setugid(uid_t uid, gid_t gid) {
uid_t euid = geteuid();
gid_t egid = getegid();
if (setgid(gid) < 0 || setuid(uid) < 0)
assert(0);
}断言被执行了。在核心转储中,我发现了以下变量的值:
uid = 8
gid = 12
euid = 0
egid = 08和12是正确的ids。当setuid后面跟着setgid时,我已经看到了这样的问题。但不是在我的案子里。问题是什么?
我发现了这个问题。具有id 8的用户已达到其执行进程的极限。
发布于 2014-09-19 11:29:02
您应该真正修改您的程序,以显示系统调用返回的错误。
如果您的进程的EUID实际上为0,则该程序只有在没有更改UID或GID (CAP_SETUOD和CAP_SETGID功能)的权限,或者您要更改的UID已达到其进程限制,因此不能再有一个进程时,才能失败。
我建议更改函数,在调用setuid()或setgid()之前打印进程的euid,如果其中任何调用失败,则打印errno。
发布于 2014-09-19 14:48:48
我发现了这个问题。具有id 8的用户已达到其执行进程的极限。
https://stackoverflow.com/questions/25931470
复制相似问题