【问题标题】:setgid() fails - operation not permittedsetgid() 失败 - 不允许操作
【发布时间】:2012-06-19 03:14:06
【问题描述】:

我在 C 中创建了一个 setuid 程序。可执行文件如下所示:

-r-s-r-s--- 1 root users 13073 Jun 15 21:56 server

我以userA/users 执行程序并尝试将uid/gid 设置为userB/otherUserssetgid() 失败,不允许操作。 userA 不属于otherUsers 如何更改有效gid?


[编辑]这是我所做的一个小总结。我的 C 程序以 userA 身份执行,将 uid 和 gid 设置为 userB 并创建一个文件。与预期不同,该文件属于组 root,因为 setgid() 失败。

[userA@node uid]$ id
uid=11945(userA) gid=544(users) groups=544(users)
[userA@node uid]$ id userB
uid=11946(userB) gid=10792(otherUsers) groups=10792(otherUsers)
[userA@node uid]$ cat uid.c 
#include <stdio.h>
#include <unistd.h>

int main() {
  setuid(11946);
  setgid(10792);

FILE *f = fopen("userB_file", "w");
fclose(f);

return 0;
}
[userA@node uid]$ ls -l uid
-r-sr-sr-x 1 root root 7130 Jun 17 14:16 uid
[userA@node uid]$ ./uid 
[userA@node uid]$ ls -l userB_file 
-rw-r--r-- 1 userB root 0 Jun 17 14:19 userB_file

【问题讨论】:

  • 您确定setgid()users 组中用户的权限运行吗?这将导致它因“不允许操作”而失败,因为读取和 exec/setuid privs 不会扩展到世界/其他。
  • 我不明白。我必须以 root 身份运行我的程序吗?我认为将所有者设置为 root 就足以更改 uid/gid。我将无法以 root 身份运行该程序。
  • Unix 权限是所有者/组/{world,other}。您已经为所有者(root)和组(用户)阅读并执行了 exec+setuid。您没有发布代码,但如果调用 setgid() 的内容既不是 root 用户也不是在用户组中,则会给出您报告的错误。
  • 我只是用 userB/otherUsers 的 id 调用 setuid() 和 setgid()。程序本身由用户 A 执行。我应该添加一些示例代码吗?

标签: c linux permissions setuid


【解决方案1】:

我怀疑您在调用setgid 之前调用了setuid。一旦您调用setuid 将uid 更改为root 以外的其他值,您就丧失了将gid 更改为任意值的权限。您必须先拨打setgid,然后拨打setuid

【讨论】:

  • 这很简单!妈的,你说的太对了。我更改了顺序,当然,它有效!谢谢。顺便说一句:我在问题中添加了我原来的 C 程序。
  • 其实没那么明显。 setgid 的手册页和 setuid 的手册页中都没有报告。
  • @Bemipefe:权限模型的结果应该很明显,当您是普通的非特权用户时,您无法将组 ID 更改为您想要的任何内容。
  • @R.. 我指的是 setgid 函数必须在 setuid 函数之前调用。此规则也适用于以 root 用户身份运行的进程。
  • @Bemipefe:那个“规则”只是一个事实的结果,即只有 root 可以将 gid 更改为任意组。致电setuid 后,您不再是 root。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2019-01-25
  • 2023-01-27
  • 2020-09-14
  • 2012-12-06
  • 2012-05-03
相关资源
最近更新 更多