如果它们是可调试的,setuid 设置为 root 的实用程序如何安全?

信息安全 linux Unix 用户管理
2021-08-11 17:55:05

今天我在 Uni 听说了一件打破了我关于用户权利分离的心智模式的事情。也就是说,我听说:

我可以自由调试我有权运行的所有程序,即使是那些将 setuid 设置为 root 的程序。

例如,这意味着我可以su在调试器下运行。我试过了,它奏效了:

gdb su

这对我来说是令人兴奋的。我可以向您介绍我以前关于用户权限管理的心智模型,以便您可以纠正我的错误并向我解释事情的真相?

直到今天,我还一直相信:

  • 根据定义,在我的用户帐户下运行的任何东西都是“我的”。也就是说,我可以用这样的程序自由地做任何我想做的事情,特别是我可以调试它,这意味着我可以读取和修改这样的程序存储在其内存中的所有数据,甚至可以在它运行时对其进行修补。
  • setuid设置为其他用户的程序- 为简单起见,假设它是 root - 以超过我的用户帐户权限的权限运行,但作为回报,他们应该只做他们设计要做的事情:除此之外,这是一个安全漏洞。因此,这些程序虽然可以我的帐户运行,但仍然拥有它们的帐户运行- 所以从权限管理的 POV 来看,它们就像由它们的所有者运行一样运行 - 所以我无法读取它们的内存或中断他们的执行,所以我不能让他们屈服于我的意志,所以特别是我不能调试他们。

第二点显然是错误的。但是,根据我(显然是错误的)心智模型,这意味着,如果我——例如——在su下运行gdb,我可以捕捉到su决定密码是否正确的那一刻,修改这个su记忆片段以迫使它相信这个基本问题的答案是肯定的,然后恢复执行,瞧,我现在拥有根权限。好吧,二进制作者可能会尝试混淆他们的代码以使这变得困难,但是一个熟练和坚持不懈的人总是可以克服这一点,而且这并不适用,su因为它是开源的。

我的心智模型哪里错了?它与现实的矛盾在哪里?

1个回答

通常,当 su 运行时,它会运行 setuid(以 root 身份)。当您使用 gdb 启动它时,setuid 位不会生效(因为它正在被 ptrace 跟踪),因此即使您说服它输入了正确的密码,它也无权实际为您提供新的 UID。这样做的原因是为了减轻您描述的确切攻击。