真实有效的用户ID如何工作?


13

当普通用户想要更改passwd文件时,setuid将为该用户提供有效的用户访问权限。用户暂时成为root用户,可以编辑passwd。

但是,您只能正确编辑密码,而不能所有人吗?但是,您的有效用户访问权限是root。那么,为什么不允许您更改除您之外的其他密码?

当使用setuid运行程序时,当有效用户为root时,实际用户身份仍然是您的名字,这实际上意味着什么?

Answers:


13

您无法更改其他密码,因为该程序不允许您这样做。该程序具有更改其所需密码的系统权限,因为它以身份运行root,但是该程序经过专门设计,不向用户提供任何获取其使用这些权限的方式。

用户暂时不是root用户,而是受信任的程序以root用户权限运行。显然,只有专门设计用来限制用户只能执行他们应被允许做的事情的程序才可以安全地设置为setuid。


因此,在打开外壳程序的情况下,将uid设置为0(使用setreuid),这样有效的uid将是root,但真正的uid仍然是我。既然我不认为shell专门内置了某些东西来阻止我,那是否意味着我可以访问整个系统了?
2011年

我想知道堆栈粉碎攻击技术的背景。恶意黑客利用超级用户级别打开外壳的地方。
starcorn 2011年

@starcron:是的。实际上,通过展示如何使用该攻击来创建setuid根shell来演示可能的攻击。
大卫·史瓦兹

2

尽管具有有效的root用户ID,但仅允许您更改密码,因为在更改密码时,将检查真实用户ID而不是有效用户ID。您只能更改有效用户ID,而不能更改真实用户ID。
只有root用户可以更改真实用户ID,以非特权用户身份运行程序。真实用户ID不能更改,因为它是在会话开始时设置的。
这就是为什么只能更改密码的原因,因为真实用户ID不会更改(因为它仍然是您的密码而不是root用户的密码)。


0

Unix上的早期破解是建立与setuid shell脚本的符号链接并调用该链接-i。这导致脚本被称为,sh -i而不是-i按预期执行脚本,而是启动了一个交互式shell,然后该交互式shell提供了全部功能。有效的用户ID可以用于修改passwd任何用户或root本身的文件。防止这种情况的最佳方法是使用SELinux来防止信任脚本或程序在SELinux允许其运行的区域之外进行修改。

另一种技术是在重要文件上保留不可变的位,即使root用户也不能修改一组(除了在单用户模式下)

作为超级用户,您可以邀请用户使用密码登录到系统,并以任何用户的身份出现,但正常的特权进程会尽力防止这种情况的发生。

如果您使用某种类型的网络文件系统,则在该文件空间中,root用户将被视为“ nobody”,而不是root,这将使不受信任的计算机加入受信任的网络(例如大学校园)。


0

仅允许您更改密码,因为set-password程序尽管有权执行任何操作,但它被编程为仅更改密码。它将检查真实的用户ID,以确定要更改的密码。

因为您无法更改您的真实用户ID,所以即使通过调用set-uid程序,该程序也可以使用它来实现安全性。操作系统将安全性放弃给设置的uid根程序。

注意:set uid根程序也可以更改实际用户ID(但这在本用例中没有用)。

警告:设置uid root被认为是有害的(远不理想)。这些天我们应该使用功能(请参阅在gnu / linuxhttp://man7.org/linux/man-pages/man7/capabilities.7.html 上设置文件权限等的不同方法有哪些

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.