如果文件的组 ID 不匹配,Linux 是否会清除文件的 set-group-ID 位?

如果文件的组 ID 不匹配,Linux 是否会清除文件的 set-group-ID 位?

我正在翻阅这本令人惊奇的书The Linux Programming Interface。第 15 章第 15.4 节第 304 页写道:

出于这个原因,当一个非特权进程(没有权限的进程)CAP_FSETID如果文件的组 ID 不等于进程的有效组 ID 或任何补充组 ID,则调用chmod()(或)能力) ,则内核始终会清除 set-group-ID 权限位。fchmod()这是一项安全措施,旨在防止用户为其不属于其成员的组创建 set-group-ID 程序。

我怀疑如果是这样的话,非特权进程可以在文件创建期间在mode参数中指定 set-group-ID 标志open()。在这种情况下,内核不会清除 set-group-ID 位。据我了解,内核应该这样做,因为上面提到的原因。为什么这种行为只适用于chmod()

答案1

内核如果与组执行权限结合使用,则清除该标志。您可以使用以下程序对此进行测试:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  if (argc < 2) {
    exit(1);
  }

  if (open(argv[1], O_RDWR | O_CREAT, 02755) < 0) {
    perror("open");
  }
}

创建一个目录,将其更改为您所在的组不是成员,并将其设置为 setgid,以便在那里创建的文件归该组所有。然后运行上面的程序,创建一个可执行文件;你会看到权限最终是 755,而不是 2755。

如果将程序中的权限更改为02644,则生成的文件将具有权限2644;但这并没有给 Linux 带来任何好处。

相关内容