从打开 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/fstab
nosuid
许多系统使用临时文件系统for /tmp
:文件系统,其内容保留在内存中并且在重新启动时不会保留。 (tmpfs 文件系统可能比依赖磁盘缓存更快,因为它不需要关心数据一致性。)某些设置使用该nosuid
选项挂载它,因为通常不会调用 setuid 临时文件,并且偶尔会出现这种情况成为攻击媒介的一部分(setuid 文件本身/tmp
并不是安全风险,但禁用它们可以限制一些漏洞造成的损害)。
您可以通过首先查找包含目录的安装点来检查目录的安装选项df
:
df /tmp/somefile
然后在 的输出中查找安装点mount
,或者在 Linux 上查找安装点/proc/mounts
。
mount | awk '$3 == "/tmp"'