cap_setgid能力分析

  • cap_setgid: 允许普通用户使用setgid函数

让我们通过下面的例子了解cap_setgid

  1. 创建用户test,用于测试
$ adduser test
  1. root身份创建文件/tmp/ddd
$ whoami
root
$ echo "123" > /tmp/ddd
$ chmod 640 /tmp/ddd
  1. 编写一个c程序来使用setgid()函数

函数说明:setgid(gid)用来将目前进程的真实组识别码(real gid)设成参数gid值. 如果是以超级用户身份执行此调用, 则real、effectivesavedgid都会设成参数gid

$ su - test
$ tee ~/demo.c <<EOF
#include <unistd.h>
int main ()
{
    gid_t gid = 0;
    setgid(gid);
    system("/bin/cat /tmp/ddd");
    return 0;
}
EOF
  1. test用户执行demo程序
$ whoami
test
$ gcc demo.c -o demo
$ ./demo
/bin/cat: /tmp/ddd: Permission denied

显然默认情况下不具备调用setgid()函数的权限

  1. 切换root用户,授予/home/test/demoCAP_SETGID能力
$ whoami
root
$ setcap cap_setgid=eip /home/test/demo
  1. 切换至test用户再次执行/home/test/demo
$ whoami
test
$ /home/test/demo
123

此时test用户通过执行demo程序,拥有了读取/tmp/ddd文件内容的权限,而test用户依旧不具备该权限:

$ whoami
test
$ cat /tmp/ddd
cat: /tmp/ddd: Permission denied

这是因为通过对/home/test/demo程序授予了cap_setgid的能力,允许程序可以使用setgid()函数。而通过setgid()函数,/home/test/demo修改了进程所属组到root(修改前为test) 进而拥有了对/tmp/ddd文件的读权限。

清理测试用例

$ userdel -r test
Copyright © weiliang 2021 all right reserved,powered by Gitbook本书发布时间: 2024-04-22 16:03:41

results matching ""

    No results matching ""