c - setuid 或 setgid 失败

标签 c linux

我写了这个函数:

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 = 0

8 和 12 是正确的 ID。当 setuid 后跟 setgid 时,我看到过这样的问题。但不是我的情况。可能是什么问题?

我发现了问题。 id 为 8 的用户已达到其执行进程的限制。

最佳答案

你真的应该修改你的程序来显示系统调用返回的错误。

如果您的进程的 EUID 确实为 0,则该程序只有在没有更改 UID 或 GID 的权限(CAP_SETUOD 和 CAP_SETGID 功能),或者如果您要更改的 UID 已达到其进程限制并且因此不能再有一个进程。

我建议在调用 setuid()setgid() 之前更改您的函数以打印进程的 euid,并打印 errno如果这些调用中的任何一个失败。

关于c - setuid 或 setgid 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25931470/

相关文章:

Linux -grep 命令

c - 当 Linux 在 C 程序中崩溃时获得更好的调试

iphone - 在 Objective-C 类之间共享 C 函数

C读取文本文件并将内容放入结构中

c - 如何将用户定义的宏传递给 xcodebuild?

c++ - 为什么我们需要 memset 始终为零?

检查元素是否存在于C中的结构中

linux - 符号、ELF 以及如何在内存中链接

Python 将标准输出作为列表获取

linux - 控制 Linux 应用程序启动/许可