linux - issetugid 的目的?

标签 linux unix solaris setuid

根据 issetugid 的手册页,该调用应该 (1) 警告 uid/gid 更改; (2) 警惕可能污染的环境。函数名称暗示了第三个目的。

第一个问题:目的是什么?

当我查看可用的实现时(例如,在 Linux 系统上作为库,因为 Linux 内核不提供 API),我发现以下内容:

if (getuid() != geteuid()) return 1; 
if (getgid() != getegid()) return 1; 
return 0; 

在 Solaris 上,它看起来如下:

return ((curproc->p_flag & SUGID) != 0);

我有点怀疑,但这部分是因为很难理解像 geteuidgetegid 这样的函数在所有平台上返回什么——例如,BSD、Linux、Unix和 Solaris。

第二个问题:Linux 代码在语义上等同于 Solaris 代码吗?

第三个问题:geteuidgetegid 跨平台实现是否相同?对于具有三个 id 的游戏 - 真实、有效和保存的系统怎么样?

第四个问题:这里唯一重要的是有效 ID 吗?

如果一个进程以 UID = 0 启动并暂时放弃特权,那么 saved id 就会发挥作用。临时删除 root 的进程不需要 exec 并且不应被污染。

第五个问题:临时掉root的进程是不是被污染了?

第六个问题:有效id为保存id的进程是否应该被认为是污染的?

最佳答案

在专为回答一个问题而设计的系统中,要回答六个问题有点多,特别是如果没有人知道所有六个问题的答案,但我会尝试...

1) issetugid() 的目的是让库知道它们是否在以提升的权限运行的程序中使用,这样它们就可以避免冒险行为,例如信任 LD_LIBRARY_PATH、NLSPATH等环境变量,让调用者加载可以滥用提升权限的模块。你可以像这样看到一些关于它的历史讨论ncurses 4.1 security bug thread .

2) 该代码似乎不如 BSD 和 Solaris 版本安全,因为它没有考虑保存的 setid 位。

3) 它们可能在不同的内核上有不同的实现 - 查看平台源代码以找出答案。

4、5 & 6) 不,是,是 - 可以将其 euid 或 egid 更改回更高级别的进程仍然不应信任导致它加载用户提供的代码以利用它们的环境变量。

关于linux - issetugid 的目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16620097/

相关文章:

linux - 在没有 ROOT 权限的 Linux 上安装 OpenCL(AMD SDK 工具包)

perl - 如何在 Solaris 上的 Perl 中监视内存使用情况?

awk - 需要在 solaris 命令中重新排列和求和列

linux - 获取最顶层窗口的 pid 和详细信息

linux - 从目录层次结构中的文件递归搜索和输出字符串

linux - 有没有办法在使用 sdiff 时对差异进行颜色突出显示?

unix - ssh命令-T选项

c++ - 如何在 Unix 上的 C++ 套接字上使用 read() 超时

linux - 可执行文件在 solaris 中工作但在 linux 中不工作

linux - 登录到从 AMI 创建的实例,在 sshd_config 中将 PasswordAuthentication 设置为 yes