本文共 1603 字,大约阅读时间需要 5 分钟。
用户命名空间 提供了普通权限映射root权限的能力,但这个root权限只是在子命名空间中的虚构,需要配合其他的命名空间。本身不具有操作父命名空间真实root资源的能力。
我个人感觉应该是利用chroot来进行切换根目录后进行利用。
正常用户都需要在user ns中映射自己的用户,不映射默认uid = 65534。映射之后存在文件资源访问限制的机制,如上图。user ns提供了上层构建内核系统的能力。
chr.c
#includeint main(){char *argv[ ]={"ls", "-al", "/etc/passwd", NULL};char *envp[ ]={"PATH=/bin", NULL}; int ret = chroot("./newroot");printf("error %d \n",ret);chdir("/");execve("/bin/ls", argv, envp);}
gcc chr.c -o chr
lier@lier-virtual-machine:~/qemu$ sudo chroot newroot/ /bin/lsa.out bin lib linuxrc ns.c sbin usrlier@lier-virtual-machine:~/qemu$ sudo ./chrerror 0 ls: /etc/passwd: No such file or directorylier@lier-virtual-machine:~/qemu$ unshare --user -r /bin/bashroot@lier-virtual-machine:~/qemu# ./chrerror 0 ls: /etc/passwd: No such file or directoryroot@lier-virtual-machine:~/qemu# exitexitlier@lier-virtual-machine:~/qemu$ ./chrerror -1 -rw-r--r-- 1 root root 2287 Nov 14 10:12 /etc/passwdlier@lier-virtual-machine:~/qemu$
可以看到,成功的利用映射的root切换根目录。命令找不到参数,因为新的目录里缺少一个参数。
user命名空间应该就是基于用户账户的权限隔离方式。同一个文件在不同的命名空间读到的内容可能不同,要么就干脆不能读。某用户启动的进程启父命名空间拥有子命名空间的所有权限。主要是针对子命名空间的root账户而言,因为父命名空间中的root账户创建的内容,本层的其他账户本身不可写。
子命名空间中能不能执行可执行文件,完全取决于可执行文件可执行属性其他组的标志是否允许。
cgroup 通过控制族群、层级的概念限制进程对资源的访问。
进程task_struct 和 cgroup存在多对多的概念,通过struct css_set结构联系。
每个cgroup存在susys子系统,用来描述被限制的资源。
转载地址:http://knjvb.baihongyu.com/