setgid不适用于/ tmp /

时间:2017-03-15 13:26:37

标签: c macos libc

我有这个C程序:

#include <sys/stat.h>
#include <stdlib.h>

int main(void) {
    if (chmod("/tmp/foo", 0755 | S_ISGID) < 0) {
            exit(1);
    }
    exit(0);
}

当我像这样运行时:

rm -f /tmp/foo &&
touch /tmp/foo &&
./a.out &&
ls -al /tmp/foo &&

a.out以退出代码0运行,但输出为:

-rwxr-xr-x  1 philipp  wheel  0 Mar 16 06:58 /tmp/foo

为什么未在此处设置groupid标志?权限应为-rwxr-sr-x

以下事情可以解决问题(但我仍然想知道为什么会看到这种效果):

  • 以root身份运行程序
  • 在不同的目录中运行
  • 在Linux上运行
  • 设置set-user-id(S_ISUID
  • 我发誓它可以在早期版本的OSX中使用

我尝试了但没有奏效:

  • chmod g+s /tmp/foo也不起作用
  • 禁用csrutil没有改变任何内容
  • /tmp/的权限更改为不同的权限,例如07774777

所以问题仍然存在:如果不是权限,那么make /tmp/与其他目录的区别是什么?我能看到的唯一区别是:

ls -al /

显示tmp:

lrwxr-xr-x@   1 root  wheel     11 Dec 11 19:28 tmp -> private/tmp

最后的@符号表示目录上设置了一些非unix属性。查询ls -l@ /tmp的人显示:

lrwxr-xr-x@ 1 root  wheel  11 Dec 11 19:28 /tmp -> private/tmp
    com.apple.FinderInfo    32
    com.apple.rootless       0

更新:根据评论反馈和downvote,我认为问题很混乱,所以我完全修改了问题和标题。在修订期间,我发现我错误地比较了我的计划对chmod u+s的影响,这是错误的,我需要与chmod g+s进行比较,我也在我的问题中纠正了这一点。

1 个答案:

答案 0 :(得分:0)

chmod()系统调用将文件的权限设置为您提供的值。这意味着设置S_IRUSR | S_ISGID的权限会清除所有其他权限,包括用户写入和执行。

你可能想要的是:

chmod("/tmp/foo", 0755 | S_ISGID);

0755是用户读取+写入+执行和组/其他读取+执行的八进制模式 - 它比等效常量的输入少得多。)