Unix(BSD Unix, MacOSX) 与 Linux 登录 setuid 位差异

问题描述 投票:0回答:3

在 Unix 下(例如 BSD Unix、MacOSX),登录程序设置了 setuid 位。在 Linux 中登录没有设置 setuid 位。 问题是关于

/bin/login
.

这两种架构决策之间有什么区别?为什么 Linux 不必这样做? 它如何解决权限问题?

我在某个地方看到过这是一个 CS 问题,但我找不到答案。所以请随时提供帮助。

提前致谢!

linux macos unix operating-system computer-science
3个回答
3
投票

在Linux中,您通常有一堆

getty
(文本控制台)进程和/或一个以root权限运行的显示管理器(图形)登录进程。创建用户会话时,这些正在调用
/bin/login
,仍然具有 root 权限。
login
然后通过更改 UID/GID 和
execv
-ing 登录 shell 或启动图形会话来删除权限。


0
投票

Linux 也使用 SUID 位作为密码。 我使用 Centos/Fedora 和 Ubuntu 以及所有这些发行版,使用 SUID 位作为 passwd 程序。


0
投票

在早期的 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
)。

© www.soinside.com 2019 - 2024. All rights reserved.