我正在翻阅这本令人惊奇的书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 带来任何好处。