分组:和20233809黄雅琦
实验楼
Linux Capability探索实验
1.重新下载一个libcap库
2.在一个capability系统中,当一个程序运行时,对应的线程会初始化一系列capabilities(令牌)。当线程尝试访问某个对象时,操作系统会检查该线程的capabilities,并决定是否授权访问。
capabilities如何移除root特权程序中的不必要的权利
事例1:
ping命令需要打开RAW套接字,该操作需要root特权。但有了capability,我们就可以杯酒释兵权了,分配cap_net_raw给ping就不需要root权限即可运行:
事例2:
证明一开始无法修改密码,但是在分配了cap之后就可以成功修改密码
3.一个线程具有3组capability设置:允许(permitted P),可继承(inheritable I),和有效(effective E)。允许组由允许线程使用的cap组成,但其中的cap可能还没有激活。有效组由线程当前可以使用的cap组成。有效组是允许组的子集。线程可以随时更改有效组的内容只要不越过允许组的范围。可继承组是在程序运行exec()调用后计算新子线程的cap组用的。
当一个线程fork新线程的时候,子线程的cap组从父线程拷贝。当在一个线程中运行一个新程序时,它的新cap组将根据以下公式计算:new后缀指新计算值,p前缀指线程,f前缀指文件cap。I,P,E分别指代 inheritable,permitted,effective,是一个cap位一个cap位计算的。
pI_new = pI
pP_new = fP | (fI & pI)
pE_new = pP_new if fE = true
pE_new = empty if fE = false
为了让程序操作cap变得简单,添加以下三个函数到 /home/shiyanlou/libcap-2.21/libcap/cap_proc.c
。
在 /home/shiyanlou/libcap-2.21/libcap
目录下新建一个 use_cap.c
文件,并分配cap_dac_read_search给它。
问题1: 当我们想动态调整基于ACL访问控制权限的数量时,应该怎么做?与capabilities比较哪种更加便捷?
回答1:
要动态调整基于ACL访问控制权限的数量,可以使用ACL的管理工具来添加或删除特定的权限。
与ACL相比,capabilities更加便捷,因为它们将权限直接与对象关联起来,而不需要维护一个单独的ACL列表。通过在对象上分配或撤销capabilities,可以更加灵活地管理权限,而无需修改ACL列表。
问题2: 当程序(以普通用户运行)禁用cap A时,它遭到了缓冲区溢出攻击。攻击者成功注入恶意代码并运行。他可以使用cap A么? 如果线程删除了cap A呢,可以使用cap A么?
回答2:
当程序禁用了cap A时,即使遭到了缓冲区溢出攻击并成功注入恶意代码,攻击者也无法直接使用cap A。这是因为即使恶意代码能够运行,但它仍受到程序本身所拥有的权限限制。
如果线程删除了cap A,那么攻击者可能会获得cap A的权限,并且可以使用它来执行特权操作。因此,即使程序禁用了cap A,但如果攻击者能够成功删除该权限,他们仍然可以利用它来执行特权操作。
问题3: 问题如上,改用竞态条件攻击。他可以使用cap A么? 如果线程删除了cap A呢,可以使用cap A么?
回答3:在这种情况下,如果攻击者成功利用竞态条件攻击获取了cap A的权限,那么他可以使用cap A来执行特权操作。
如果线程删除了cap A,那么攻击者可能会利用竞态条件攻击来在cap A被删除之前获取该权限,然后使用它来执行特权操作。
总结:跟使用ACL的访问控制相比,capabilities有其它优势:它可以动态调整大量线程的权限,这对于遵守最小权限原则是很有必要的。当线程中某个权限不再需要时,它应当移除所有相对应的capabilities。这样,即使线程被入侵了,攻击者也得不到已经被删除的capabilities。