今天我在 Uni 听说了一件打破了我关于用户权利分离的心智模式的事情。也就是说,我听说:
我可以自由调试我有权运行的所有程序,即使是那些将 setuid 设置为 root 的程序。
例如,这意味着我可以su在调试器下运行。我试过了,它奏效了:
gdb su
这对我来说是令人兴奋的。我可以向您介绍我以前关于用户权限管理的心智模型,以便您可以纠正我的错误并向我解释事情的真相?
直到今天,我还一直相信:
- 根据定义,在我的用户帐户下运行的任何东西都是“我的”。也就是说,我可以用这样的程序自由地做任何我想做的事情,特别是我可以调试它,这意味着我可以读取和修改这样的程序存储在其内存中的所有数据,甚至可以在它运行时对其进行修补。
setuid设置为其他用户的程序- 为简单起见,假设它是 root - 以超过我的用户帐户权限的权限运行,但作为回报,他们应该只做他们设计要做的事情:除此之外,这是一个安全漏洞。因此,这些程序虽然可以由我的帐户运行,但仍然在拥有它们的帐户下运行- 所以从权限管理的 POV 来看,它们就像由它们的所有者运行一样运行 - 所以我无法读取它们的内存或中断他们的执行,所以我不能让他们屈服于我的意志,所以特别是我不能调试他们。
第二点显然是错误的。但是,根据我(显然是错误的)心智模型,这意味着,如果我——例如——在su下运行gdb,我可以捕捉到su决定密码是否正确的那一刻,修改这个su记忆片段以迫使它相信这个基本问题的答案是肯定的,然后恢复执行,瞧,我现在拥有根权限。好吧,二进制作者可能会尝试混淆他们的代码以使这变得困难,但是一个熟练和坚持不懈的人总是可以克服这一点,而且这并不适用,su因为它是开源的。
我的心智模型哪里错了?它与现实的矛盾在哪里?