在没有 setuid 的情况下临时运行 setuid 二进制文件?

在没有 setuid 的情况下临时运行 setuid 二进制文件?

当前正在设置 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 将 视为!历史引用。

相关内容