dav*_*vid 4 setuid permissions tmp
从启用了 SUID 位 (chmod +s) 的可执行文件打印 getuid() 和 geteuid() 的值,如果该可执行文件位于 /tmp 目录中,则结果似乎是原始调用者 ID 而不是所有者 ID .
将完全相同的代码编译到主目录(并执行 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;
}
Run Code Online (Sandbox Code Playgroud)
可以在文件系统挂载选项中禁用 Setuid 可执行文件,该选项称为nosuid. 对于可以由不受信任的用户user挂载(/etc/fstab自动暗示 中的挂载选项nosuid)或其内容可以由不受信任的用户任意修改的文件系统,例如在可移动媒体上或通过网络从不完全受信任的机器上,总是这样做的。它有时也适用于其他文件系统。
许多系统将tmpfs用于/tmp: 一个文件系统,其内容保留在内存中并且不会在重新启动时保留。(tmpfs 文件系统可以比依赖磁盘缓存更快,因为它不需要关心数据一致性。)一些设置使用nosuid选项挂载它,因为通常没有任何对 setuid 临时文件的调用,这偶尔会成为攻击媒介的一部分(setuid 文件/tmp本身不是安全风险,但禁用它们可以限制一些漏洞造成的损害)。
您可以通过首先使用以下命令查找包含目录的挂载点来检查目录的挂载选项df:
df /tmp/somefile
Run Code Online (Sandbox Code Playgroud)
然后在 的输出中查找挂载点mount,或者在 Linux 中的/proc/mounts.
mount | awk '$3 == "/tmp"'
Run Code Online (Sandbox Code Playgroud)