|
过程如下:
- 假设 man 程序文件被用户 man 所拥有,并且已经被设置了它的 set-user-ID 位,当我们 exec 它的时候,我们有如下情况:
– real user ID = 我们的用户 UID
– effective user ID = man 用户 UID
– saved set-user-ID = man 用户 UID
- man 程序会访问需要的配置文件和 man 手册页.这些文件由 man 用户所拥有,但是由于 effective user ID 是 man,文件的访问就被允许了.
- 在 man 为我们运行任何命令的时候,它会调用 setuid(getuid())) (getuid() 返回的是 real user id).
因为我们不是 superuser 进程,这个变化只能改变 effective user ID. 我们会有如下情况:
现在 man 进程运行的时候把我们得 UID 作为它的 effective user ID. 这也就是说,我们只能访问我们拥有自己权限的文件.也就是说,它能够代表我们安全地执行任何 filter.
– real user ID = 我们的用户 UID(不会被改变)
– effective user ID = 我们的用户 UID
– saved set-user-ID = man 的用户 UID(不会被改变)
- 当 filter 做完了的时候,man 会调用 setuid(euid).
这里,euid 是 man 用户的 UID.(这个 ID 是通过 man 调用 geteuid 来保存的) 这个调用是可以的,因为 setuid 的参数和 saved set-user-ID 是相等的.(这也就是为什么我们需要 saved set-user-ID). 这时候我们会有如下情况:
– real user ID = 我们的用户 UID(不会被改变)
– effective user ID = man 的 UID
– saved set-user-ID = man 的用户 UID(不会被改变)
- 由于 effective user ID 是 man,现在 man 程序可以操作它自己的文件了.
通过这样使用 saved set-user-ID,我们可以在进程开始和结束的时候通过程序文件的 set-user-ID 来使用额外的权限.然而,期间我们却是以我们自己的权限运行的.如果我们无法在最后切换回 saved set-user-ID,我们就可能会在我们运行的时候保留额外的权限.
(编辑:网站开发网_盐城站长网 )
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|