为什么 FreeBSD 要求终端程序以 root 身份启动?

为什么 FreeBSD 要求终端程序以 root 身份启动?

在 FreeBSD 上,所有图形终端程序(例如 xterm、rxvt)似乎都安装了 setuid root 或使用 setuid root 包装器。

在 Linux 上,我用过的任何发行版都不会出现这种情况。

为什么 FreeBSD 需要终端程序的 setuid 可执行文件或包装器?这似乎是引入权限升级漏洞的好方法。

答案1

原来xterm是一个set-uid程序。原因之一是需要能够写入文件utmp以记录谁正在使用什么设备。另一个原因是xterm需要获取用作其标准输入/输出的伪 tty 设备的所有权,并且需要将该所有权设置为访问它的用户。

虽然大多数其他 Unix/类 Unix 操作系统不再使用 setuid 或 setgid 位来实现相同的目标,而是使用不同且更安全的方法,但 FreeBSD 看起来保留了原始解决方案。

答案2

除非有一些临时错误报告/修复(在端口的变更日志中未找到),FreeBSD 不要求 xterm 设置 uid,并且未将其与 xterm 一起使用自2011年起。港口维护者的评论说

- Don't set suid bit. In our implementation, grantpt() and unlockpt() don't
  actually have any use, because PTY's are created on the fly and already have
  proper permissions upon creation (see src/lib/libc/stdlib/ptsname.c) [1]

指的是所做的更改在2008:

  The pts(4) driver also implements this feature, which means
  posix_openpt() will now return PTY's that are created on the fly.

鉴于这个问题2014年听起来好像OP正在研究一个旧系统。或者(这种情况确实发生了),OP的系统可能已被某人修改,添加setuid 位。

根据平台(及其年龄),xterm 将使用 setuid 或 setgid 进行这些操作:

  • 打开伪终端
  • 更新 utmp(或 utmpx)

最初,BSD(和其他)伪终端实现要求应用程序找到特殊设备,然后使用以下命令打开它setuid 权限。 Unix98 取消了第一部分(查找特殊设备),开始1999年。到 2005 年左右,大多数伪终端实现已经消除了使用安装应用程序的需要设定值。不管出于什么原因,它在 FreeBSD 中被忽视了。

同样,应用程序可能需要组权限(通过设置gidlast) 更新和使用的 utmp(或 utmpx)文件whoxterm已规定为此目的使用 utempter 库自2000年以来。 xterm 的 FreeBSD 端口使用此功能,因此它也不需要 setgid。

其他程序可以安装为设定值或者设置gid对于相同的操作,但到 2014 年,任何终端程序都不太可能需要的setuid 权限用户。当在其他程序(例如 urxvt)中使用时,它可能被其维护者忽视了。

答案3

好点,我没有注意到情况仍然如此,但是。有一些方法可以限制它造成的损害,也许他们正在研究这种新辣椒。但我想说,对于所有 X (Xorg) 应用程序,首先必须引入 Wayland,然后我们才能真正讨论运行 X 的计算机上的安全性。像 xterm 能够宣布终端这样的小问题,可以在五分钟内解决。 Xorg 是一个巨大的安全漏洞。

相关内容