suid其实是进程访问资源的一种控制方式.一般来说,一个进程只能访问执行该进程的用户所拥有的资源,
而如果设置了一个可执行文件的suid,那么就可以访问改可执行文件所有者的资源了.
当执行一个进程时,涉及到四个权限控制uid(执行该程序的用户id), guid(执行该程序的组id), euid
(有效用户id), egid(有效组id).有效**id控制着该进程是否有访问某资源的权限.
例如,以AMD登录,其组为AMD,其uid = 2, gid = 2, 其创建了一个程序testSuid.c和一个常规文件
testSuid.txt, testSuid.c为打开testSuid.txt并读出内容写到标准输出.利用ls命令可以看到如下结
果:
-rwxr-wr-w 1 AMD AMD .... testSuid.c
-rw----r-- 1 AMD AMD .... testSuid.txt
-rwxr-wr-w 1 AMD AMD .... testSuid
这是testSuid.txt的设置为euid = 2 的用户可以读写该文件, 其他用户可以读该文件(euid为非2).
编译正常执行后会成功返回:
this file is created by AMD
当以haha登录后(uid = 3, gid = 3),执行testSuid命令,也可以成功返回
this file is created by AMD
因为此时testSuid.txt设置为其他用户可以读取,所以其他用户读取没有什么问题.
以AMD登录并修改testSuid.txt(chmod 600 testSuid.txt)
-rw------- 1 AMD AMD .... testSuid.txt
这表明只有euid = 2的用户才能读写该文件.这时再以haha登录,执行testSuid,则不能访问成功,查看
errno,是权限拒绝.
整个过程是这样的:
当以AMD执行testSuid时, euid = uid = 2, eguid = uid = 2, 满足testSuid.txt的访问权
限(AMD是testSuid.txt的所有者), 当以haha执行testSuid时,euid = uid = 3, eguid = uid = 3
由于 testSuid.txt设置了其他人可以访问,所以也没有问题.当修改了testSuid.txt为只有所有者可以读
写:
-rw------- 1 AMD AMD .... testSuid.txt
haha执行testSuid就会返回权限拒绝(因为只有euid = 2的用户才可以读写该文件, 但此时euid = 3).
这时,如果设置了testSuid可执行文件的suid位:
chmod 4755 testSuid
-rwsr-wr-w 1 AMD AMD .... testSuid
没有设置可执行文件的suid时,euid = uid, egid = gid.
当设置了可执行文件的suid时,euid = 可执行文件的所有者id, egid = 可执行文件的所有组id
当haha执行testSuid时, 由于设置了suid位, uid = 3, gid = 3, 而euid = 2, egid = 2,所以
可以访问testSuid.txt文件,成功读出内容.
阅读(1250) | 评论(1) | 转发(0) |