![在没有 setuid 的情况下临时运行 setuid 二进制文件?](https://linux22.com/image/25362/%E5%9C%A8%E6%B2%A1%E6%9C%89%20setuid%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%B8%B4%E6%97%B6%E8%BF%90%E8%A1%8C%20setuid%20%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%EF%BC%9F.png)
当前正在设置 xpra,它希望使用虚拟驱动程序以非 root 身份运行 X 实例,但系统 Xorg 二进制文件是 SUID。由于系统会自动更新,我不想创建和维护二进制文件的非 SUID 副本。我还试图避免使用像复制执行删除这样的黑客行为,例如在 tmp 目录中(更愿意使其成为一个干净的单行代码,我本能地相信这应该是可能的,尽管可能存在一些微妙的安全漏洞此功能将开放)。符号链接是可以接受的,尽管据我所知它们不提供权限位屏蔽功能。
我当前最好的解决方案是在 bin 目录上进行 nosuid 绑定安装,这似乎可以解决问题,但如上所述,我仍然更喜欢一个不会在系统树/fstab 中留下麻烦的解决方案(例如,一些神奇的环境变量禁用 suid 的方式与 nosuid 挂载的方式相同,或者某些命令行执行绕过 suid 机制的 jutsu)。
有什么想法吗?
答案1
如果X
是动态链接的,您可以像这样调用动态链接器:
/lib/ld.so /path/to/X
(适应ld.so
您的系统(如/lib/ld-linux.so.2
)。
例子:
$ /lib64/ld-linux-x86-64.so.2 /bin/ping localhost
ping: icmp open socket: Operation not permitted
答案2
如果你有strace
, 和它是不是setuid 为 root,然后
strace -e '!all'程序名[论据]
应该管用。 跟踪(1)说(在错误下):
使用 setuid 位的程序在被跟踪时不具有有效的用户 ID 权限。
因为如果非特权用户使用这将是一个安全问题可以跟踪 setuid 程序(因为跟踪允许您检查和修改进程的内存)。而且,在名为 SETUID INSTALLATION 的特殊部分中,它对上述内容做了一些对冲:
如果
strace
将 setuid 安装到 root,则... setuid 和 setgid 程序 将要使用正确的有效权限执行和跟踪。 ...只有受完全 root 权限信任的用户才可以执行这些操作,...
所以,如果strace
将setuid安装到root,那么上面的技巧就不起作用了。但一般情况下不应该是这样。而且,即使是这样,您也可以通过制作一个私有的、非 SUID 的strace
. (我想,即使/bin/strace
自动更新,你也不应该需要更新您的私人副本。)
至于命令,-e
告诉我们strace
什么e通风口进行追踪。
-e all
表示“跟踪所有事件”(这是默认值),因此-e '!all'
表示不跟踪。1 这实际上应该导致strace
除了等待并观察程序(X 程序)运行之外什么也不做。如果它无论如何都会产生不需要的输出,请将输出重定向到/dev/null
. (这假设您不需要查看来自 X 服务器的控制台输出。)
________________
1您可能需要引用!all
以防止 shell 将 视为!
历史引用。