我有一台主要用作邮件服务器的机器:
$ uname -a Linux myhost.com 2.6.32-279.19.1.el6.x86_64 #1 SMP 星期三 十二月 19 07:05:20 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
并且我希望那些实际上没有登录机器(但使用它进行身份验证和获取邮件)的用户能够更改自己的密码。如果我将 /usr/bin/passwd 放入 /etc/shells(这样 passwd 命令就是一个有效的 shell),并更改用户的 shell 条目,如下所示:
someuser:x:557:557:Some User:/home/someuser:/usr/bin/passwd
然后如果他们通过 ssh 连接到主机,他们会得到如下信息:
$ ssh myhost.com
[电子邮件保护]的密码:<输入当前密码>
上次登录:2013 年 9 月 25 日星期三 16:07:35 来自 some-ip
正在更改用户 someuser 的密码。
正在更改 someuser 的密码。
(当前)UNIX 密码:<再次输入当前密码>
新密码:<输入新密码>
重新输入新密码:<再次输入新密码>
-passwd:所有身份验证令牌已成功更新。
与 myhost.com 的连接已关闭。
效果很好……但是安全吗?有没有什么方法可以利用它并攻破真正的 shell?
谢谢。
PS 在我的环境中,可以合理地假设用户已经拥有 ssh——但如果有另一种“更好”的密码更改方法,我很乐意听听 :)
答案1
允许知名程序 (ssh) 远程访问 suid 程序原则上是不安全的。passwd 设置用户 ID,即提升权限。应谨慎使用 ssh,因为它还将防火墙管理委托给远程用户(端口转发等)。如果 sshd 是您唯一的远程访问选项,您只有一台服务器,并且您坚持使用此服务器作为更改密码和提供邮件的手段,那么请限制 sshd 和邮件的所有选项,并通过删除除您需要的基本服务之外的所有内容来强化其余部分:邮件和密码更改。
passwd 的源代码一直受到严格审查,但您知道 Ken Thompson(unix 的创建者)在 C 编译器中编写的经典登录黑客吗?请阅读 Ken 的 '关于信任的思考'来决定信任谁。
答案2
我喜欢@datasmid 的回答,它提出了一些很好的观点。
在我看来,您所做的相当于允许用户使用 shell 提示符并访问命令passwd
。
如果您觉得这样做很舒服,那么我认为您没有理由不这样做。如果说有什么不同的话,那就是这样做稍微安全一些,因为您不会让用户轻易执行任何其他命令。
passwd
除非passwd
为进入 shell 提供一些准备,否则没有办法脱离命令exec
进入 shell。我不明白为什么会这样。您可能可以passwd
很容易地在源代码中搜索到这一点。
如果攻击者已经拥有本地密码,他们可能会尝试的一件事是,通过输入对提示的passwd
超长回复来溢出缓冲区。在这种情况下,任何事情都有可能发生(通过在具有 XD/NX 支持和堆地址随机化的 CPU 上运行可以减轻风险)。我不知道如果超出其输入缓冲区会发生什么,但这是我首先想到的事情。 是一个 setuid 程序,但我希望(没有检查源代码)它在检查输入之前发现它不是 0 时放弃特权。passwd
passwd
passwd
euid