版权声明:欢迎提问:[email protected] https://blog.csdn.net/include_heqile/article/details/83144902
SUID
叫做设置-用户-ID(set-user-ID
)
SGID
叫做设置-用户-ID(set-group-ID
)
这里我来说一下他们两个到底有什么作用
比方说,现在有一个可执行文件,它的所有者是root
,而且设置了该文件的设置-用户-ID位,然后当该程序由一个进程运行时,则该进程具有root
权限,不管执行此文件的进程的实际用户ID是什么,意思就是,即使以普通用户的身份去执行这个程序,它依然是以root
权限来运行的,这个就是SUID
的作用了
再来说一下SGID
,其实和上面的SUID
是一样的,只不过是把执行设置了SGID
位的可执行文件的进程的有效组ID设置为了文件的组所有者ID
现在我们有一个可执行程序a.out
,源文件如下:
#include <sys/fcntl.h>
#include "ourhdr.h"
#include "my_err.h"
int main(int argc, char *argv[])
{
if(argc != 2)
err_quit("usage: a.out <pathname>");
//R_OK常数用于测试读许可权
if(access(argv[1], R_OK) < 0)
err_ret("access error for %s", argv[1]);
else
printf("read access OK\n");
//以只读方式打开
if(open(argv[1], O_RDONLY) < 0)
err_ret("open error for %s", argv[1]);
else
printf("open for reading OK\n");
exit(0);
}
现在我们查看它的所有者:
我们来找一个当前用户无法读取的文件:
只有root
和root组
用户可以读取该文件。我们尝试使用a.out
进行读取
用户和a.out
均无访问权限
然后我们切换至root
用户,将a.out
的所有者改成root
,并激活其SUID
位:
现在我们切换回普通用户,再使用a.out
访问/etc/sudoers
文件:
可以将看到,用户被禁止访问(R_OK
判断结果),但是我们的程序中的open
函数却可以打开此文件