[操作系统安全]SetUID与Capability权能
![[操作系统安全]SetUID与Capability权能](http://pic.ttrar.cn/nice/%5b%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e5%ae%89%e5%85%a8%5dSetU.jpg)
问题一、解释“passwd”, “sudo” , “ping”等命令为什么需要 setuid位,去掉s位试运行,添加权能试运行。
1、为什么需要setuid位:
首先明确setuid的作用是:执行该设置后,文件执行时将以文件拥有者的身份执行,而非普通用户的身份。若没有该设置,普通用户无法执行root用户的文件和进程。
实验过程:
以普通用户的身份登录操作系统,通过whoami命令查看当前用户:
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/05f9de3051ad40369fb96732a0a10f69.png)
通过which命令查看passwd、sudo、ping文件所在位置:
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/9c633681ddd7492091479ddb5c8434bb.png)
通过ls -all查看这些文件的详细信息:
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/06447f436d35477982fdb8720a6f467e.png)
从上图可以看出passwd、sudo和ping的文件拥有者是root,即超级用户,所属用户组是root,并且都设置了SUID。
常规来讲,当其他的普通用户执行passwd、sudo和ping时,由于不是root,无法执行这些文件。但实际上,由于普通用户设置了SUID,便可以临时以文件拥有者root的身份执行这些文件。所以passwd、sudo和ping等命令需要setuid。
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/7d9b8b0f9c844e79848a7b97cde8ae2d.png)
SUID设置方法
添加suid位:chmod u+s FILE…
删除suid位:chmod u-s FILE…
具体提权
SUID可以让程序调用者以文件拥有者的身份运行该文件,当我们以一个普通用户去运行一个root用户所有的SUID文件,那么运行该文件我们就可以获取到root权限
② 去掉suid位
通过chmod命令移除passwd、sudo和ping文件的setuid:
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/14b9b62f785542049d34f58311d531b8.png)
此时在执行发现普通用户无法执行sudo命令,并且系统提示要求设置suid位,同理,ping和passwd命令也一样无法继续正常使用。![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/2202991464a74003bd0b5dd41acce2ca.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/8bf6d7d1f0904f818cded630c17119f2.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/e96595439603410c97ca7e7b909f64a6.png)
在root权限下将三个命令的suid权限添加回来

此时在普通用户下再次执行sudo、ping和passwd命令,此时已经可以正常使用。
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/5a51b16910784df1819c49af07d2bfef.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/ea366c27695146e6bf9f1798a581d06c.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/8389916cd9ff4eba93ea4e4981b24adf.png)
问题二、指出每个权能对应的系统调用,简要解释功能
通过man capabilities命令可以查看权能及简要功能
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/293b2805063b4058853123eef2a31633.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/b11edb281e714396833f1a88b37d3bbb.png)
使用 sudo find / -name capability.h 查找到路径 /usr/src/linux-headers-5.15.0-46/include/uapi/linux/capability.h ,整理可得下表:
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/bae984563c4543848ffea4ced295613c.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/cb868112523d40caba9293cc445948f4.png)
问题三、查找你Linux发行版系统(Ubuntu/centos等)中所有设置了setuid位的程序,指出其应该有的权能
首先,查看Linux的发行版,通过uname -a命令,可以看出内核版本为5.15.0-67-generic,Ubuntu发行版为18.04。
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/12ab312a99884f7083aa1aa725a3fda6.png)
使用find / -perm /u=s命令
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/ec754f3454e54c65ae87d5eabed1599b.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/9f2a4d33bc2e4a8b8cbe57fc8ca16df0.png)
部分程序的权能:
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/f94d48d3cfcb44759665bec45e885d2a.png)
问题四、实现一个程序其满足以下的功能:
(1)能够永久的删除其子进程的某个权能。
(2)能暂时性的删除其子进程的某个权能。
(3)能让上面被暂时性删除的权能重新获得。
Capabilities机制,是在Linux内核2.2之后引入的。它将root用户的权限细分为不同的领域,可以分别启用或禁用。从而,在实际进行特权操作时,如果euid不是root,便会检查是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
每个进程有三个和能力有关的位图:inheritable(I)、permitted§和effective(E),对应进程描述符 task_struct(include/linux/sched.h)里面的cap_effective, cap_inheritable, cap_permitted。每种能力由一位表示,1表示具有某种能力,0表示没有。
1)cap_effective 当一个进程要进行某个特权操作时,操作系统会检查 cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0。
例如,如果一个进程要设置系统的时钟,Linux的内核就会检查 cap_effective的CAP_SYS_TIME位(第25位)是否有效,
2)cap_permitted 表示进程能够使用的能力。在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集。进程放弃没有必要的能力对于提高安全性大有助益。
例如,ping只需要CAP_NET_RAW,如果它放弃除这个能力之外的其它能力,即使存在安全缺陷,也不会对系统造成太大的损害。
3)cap_inheritable表示能够被当前进程执行的程序继承的能力。
永久删除子进程的权能就移除effective和inheritable、permitted的,暂时性删除就移除effective和inheritable的,恢复暂时性删除的就添加进effective和inheritable。
本程序以ping指令为例进行测试,首先运行程序,并查看当前的权能,此时包括cap_net_raw权能
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/aaf0e4baa38949ac9f643c9d4141fa5b.png)
之后移除掉该权能,查看此时的权能发现移除成功。
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/ecdd4accc9da4690ba446e670b181047.png)
此时执行ping命令,已经没有权限。
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/3fa59fe708464be3af39054156ea7cd0.png)
恢复刚被暂时移除的权限,再查看相关权能,以及执行ping命令,发现恢复成功。
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/ea93338660284b1ebc6ef78aa309bdeb.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/810b882335ff4d30b93560652e18da55.png)
永久删除cap_net_raw权能后,发现少了cap_net_raw+p,表示移除成功,此时再通过3恢复权能发现不能成功,表示已经永久移除。
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/bd31dc0f85dc4791956e741c6fa5e1db.png)
![[操作系统安全]SetUID与Capability权能](https://img-blog.csdnimg.cn/65b1e905104b42e7b745590deb6b2298.png)


