在 Unix 下(例如 BSD Unix、MacOSX),登录程序设置了 setuid 位。在 Linux 中登录没有设置 setuid 位。 问题是关于
/bin/login
.
这两种架构决策之间有什么区别?为什么 Linux 不必这样做? 它如何解决权限问题?
我在某个地方看到过这是一个 CS 问题,但我找不到答案。所以请随时提供帮助。
提前致谢!
在Linux中,您通常有一堆
getty
(文本控制台)进程和/或一个以root权限运行的显示管理器(图形)登录进程。创建用户会话时,这些正在调用 /bin/login
,仍然具有 root 权限。 login
然后通过更改 UID/GID 和 execv
-ing 登录 shell 或启动图形会话来删除权限。
Linux 也使用 SUID 位作为密码。 我使用 Centos/Fedora 和 Ubuntu 以及所有这些发行版,使用 SUID 位作为 passwd 程序。
在早期的 Unix 中(可以追溯到版本 7 甚至更早),当您登录并想要更改用户时,您输入命令
login
。 shell 然后 /bin/sh
会隐式 exec
登录,您可以作为新用户登录。我怀疑这是为了避免失去拨号连接。 (或者也许不会失去您的 GeCOS 连接?)
我检查了 NetBSD 9.3,这与
/bin/csh
、/bin/ksh
配合得很好。和/bin/tcsh
。它起作用的 shell 也拒绝运行 login
除非您位于登录 shell 中。它不适用于 /bin/sh
或 /usr/pkg/bin/bash
。它不起作用的 shell 会执行 /bin/login
,但不执行它,因此 login
的行为更像 su
。
Linux 在某些时候发现了一个竞争条件,涉及到
ttyname()
以某种方式能够在 /tmp 中找到硬链接到虚拟 tty 的内容,然后可以将其更改为由其他用户(可能是 root)拥有。我怀疑如果使用 fchown() 而不是 ttyname() 和 chown(),这不会成为问题。我怀疑如果 /dev
是可信的并且 ttyname()
只搜索 /dev
,这也不会成为问题。
NetBSD 实现意味着,由于
login
更改了 tty 所有权,因此,一旦您返回到该 shell,不正确的 shell 的 tty 就会由其他用户拥有。我怀疑这样做的主要影响是 write
输出和新的本地邮件通知将发送给错误的用户,并且您将无法更改它(使用 mesg
)。