SUID 位不适用于 /tmp 目录中的可执行文件

SUID 位不适用于 /tmp 目录中的可执行文件

从打开 SUID 位(chmod +s)的可执行文件打印 getuid() 和 geteuid() 的值,似乎会得到原始呼叫者 ID 而不是所有者 ID如果可执行文件位于 /tmp 目录中

当将完全相同的代码编译到主目录(并执行 chmod +s)时,这似乎按预期工作。

我进行了很多搜索,但找不到任何有关此类行为的参考。

有谁知道为什么会发生这种情况?

这个来源很简单:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
    printf("%d\n%d\n", getuid(), geteuid());
    return 0;
}

答案1

可以在文件系统挂载选项中禁用 Setuid 可执行文件,该选项称为nosuid.对于可以由不受信任的用户安装(自动暗示的user安装选项)或其内容可以由不受信任的用户任意修改的文件系统,例如在可移动介质上或通过网络从不完全受信任的计算机上,始终执行此操作。有时也对其他文件系统执行此操作。/etc/fstabnosuid

许多系统使用临时文件系统for /tmp:文件系统,其内容保留在内存中并且在重新启动时不会保留。 (tmpfs 文件系统可能比依赖磁盘缓存更快,因为它不需要关心数据一致性。)某些设置使用该nosuid选项挂载它,因为通常不会调用 setuid 临时文件,并且偶尔会出现这种情况成为攻击媒介的一部分(setuid 文件本身/tmp并不是安全风险,但禁用它们可以限制一些漏洞造成的损害)。

您可以通过首先查找包含目录的安装点来检查目录的安装选项df

df /tmp/somefile

然后在 的输出中查找安装点mount,或者在 Linux 上查找安装点/proc/mounts

mount | awk '$3 == "/tmp"'

相关内容