zoukankan      html  css  js  c++  java
  • 2019-2020-1 20199310《Linux内核原理与分析》第十一周作业

    1.问题描述

    在一个capability系统中,当一个程序运行时,对应的线程会初始化一系列capabilities(令牌)。当线程尝试访问某个对象时,操作系统会检查该线程的capabilities,并决定是否授权访问。本实验将感受linux capability在访问控制上的一些优势。

    2.解决过程

    2.1 环境搭建

    libcap 库能够使用户级别的程序与 capability 特性做交互,一些linux发行版不包括这个库,在环境中已经有 /usr/include/sys/capability.h 这个文件,为了避免老版本的影响,我们还是删掉以前的,然后重新下载一个。



    在本实验中,主要需要用到以下命令:
    setcap: 给一个文件分配capabilities
    getcap: 显示文件所带的capabilities
    getpcaps: 显示线程所在的capabilities

    2.2 capability

    Set-UID程序允许用户暂时以root权限进行操作,即使程序中所进行的权限操作用不到root权限的所有权利,这很危险:因为如果程序被入侵了的话,攻击者可能得到root权限。Capabilities将root权限分割成了权利更小的权限。小权限被称作capability。如果使用capabilities,那么攻击者最多只能得到小权限,无法得到root权限。这样,风险就被降低了。
    首先,以普通用户登录并运行以下命令:

    命令成功运行,如果你查看/bin/ping的属性会发现它是一个root所有的Set-UID程序。如果ping中包含漏洞,那么整个系统就可能被入侵。问题是我们是否能移除ping的这些权限。让我们关闭程序的suid位:


    现在再ping网易网站:

    它会提示你操作不被允许。这是因为ping命令需要打开RAW套接字,该操作需要root特权,这就是为什么ping是Set-UID程序了。但有了capability,我们就可以杯酒释兵权了,让我们分配cap_net_raw给ping。


    取消下列程序的Set-UID并不影响它的行为。
    这一步证明一开始无法修改密码,但是在分配了cap之后就可以成功修改密码:seed 用户的密码是 dees。


    接着我们分配了cap之后就可以成功修改密码。

    通过阅读 /usr/include/linux/capability.h 文件了解capability的其他功能:





    2.3 调整权限

    跟使用ACL的访问控制相比,capabilities有其它优势:它可以动态调整大量线程的权限,这对于遵守最小权限原则是很有必要的。当线程中某个权限不再需要时,它应当移除所有相对应的capabilities。这样,即使线程被入侵了,攻击者也得不到已经被删除的capabilities。使用以下管理操作调整权限:
    Deleting:线程永久删除某个capability
    Disabling:线程会暂时停用某个capability。
    Enabling:对应Disabling,启用capability。
    切换到 /home/shiyanlou/libcap-2.21/libcap 目录下,编辑 cap_proc.c文件。

    $ exit
    $ cd /home/shiyanlou/libcap-2.21/libcap
    $ sudo vi cap_proc.c
    

    为了让程序操作cap变得简单,添加以下三个函数到 /home/shiyanlou/libcap-2.21/libcap/cap_proc.c 中。

    * Disable a cap on current process */
    int cap_disable(cap_value_t capflag)
    {
        cap_t mycaps;
    
        mycaps = cap_get_proc();
        if (mycaps == NULL)
            return -1;
        if (cap_set_flag(mycaps, CAP_EFFECTIVE, 1, &capflag, CAP_CLEAR) != 0)
            return -1;
        if (cap_set_proc(mycaps) != 0)
            return -1;
        return 0;
    }
    /* Enalbe a cap on current process */
    int cap_enable(cap_value_t capflag)
    {
        cap_t mycaps;
    
        mycaps = cap_get_proc();
        if (mycaps == NULL)
            return -1;
        if (cap_set_flag(mycaps, CAP_EFFECTIVE, 1, &capflag, CAP_SET) != 0)
            return -1;
        if (cap_set_proc(mycaps) != 0)
            return -1;
        return 0;
    }
    /* Drop a cap on current process */
    int cap_drop(cap_value_t capflag)
    {
        cap_t mycaps;
    
        mycaps = cap_get_proc();
        if (mycaps == NULL)
            return -1;
        if (cap_set_flag(mycaps, CAP_EFFECTIVE, 1, &capflag, CAP_CLEAR) != 0)
            return -1;
        if (cap_set_flag(mycaps, CAP_PERMITTED, 1, &capflag, CAP_CLEAR) != 0)
            return -1;
        if (cap_set_proc(mycaps) != 0)
            return -1;
        return 0;
    }
    

    运行以下命令编译安装libcap。



    整个程序运行完毕。

    2.4 课后问题

    问题一、当我们想动态调整基于ACL访问控制权限的数量时,应该怎么做?与capabilities比较哪种更加便捷?
    ACL访问控制即通过查询访问控制列表来获得访问主体权限的访问控制。当我们想动态调整基于ACL访问控制权限的数量时,我们通过修改访问控制列表中用户的访问权限来进行调整。ACL方式与capabilities相比,capabilities更便捷。Linux提供了直接修改进程权能的系统调用sys_capset(),进程可以通过sys_capset()调用来直接修改除init进程以外的任何进程的各权能集。而ACL需要调整访问控制列表中文件的安全域和权限等进行权限调整。
    问题二、当程序(以普通用户运行)禁用cap A时,它遭到了缓冲区溢出攻击。攻击者成功注入恶意代码并运行。他可以使用cap A么?如果线程删除了cap A呢,可以使用cap A么?
    当程序(以普通用户运行)禁用cap A时,它遭到了缓冲区溢出攻击。导致cap A没有成功禁用,攻击者成功注入恶意代码并运行,可以使用capA。如果线程删除了capA,则capA已经成功禁用,攻击者不可以使用capA。
    问题三、问题如上,改用竞态条件攻击。他可以使用cap A么?如果线程删除了cap A呢,可以使用cap A么?
    改用竟态条件攻击,程序禁用cap A,竟态攻击者抢占资源,可以获得capA使用权限。如果线程删除了capA,竟态攻击者依然可以抢占资源,取得capA的使用权限。

    3.总结

    本文主要学习了capabilities如何移除root特权程序中的不必要的权利,在以往的UNIX系统上,为了做进程的权限检查,把进程分为两类:特权进程(有效用户ID是0)和非特权进程(有效用户ID是非0)。特权进程可以通过内核所有的权限检查,而非特权进程的检查则是基于进程的身份(有效ID,有效组及补充组信息)进行。从linux内核2.2开始,Linux把超级用户不同单元的权限分开,可以单独的开启和禁止,称为capability。可以将能力赋给普通的进程,使其可以做root用户可以做的事情。

  • 相关阅读:
    0929作业
    0909上机作业
    熟悉的LINUX操作
    博客搭建成功啦!
    感谢管理员,通过了我的博客邀请。哈哈
    Asp.net常用的51个代码(非常实用)
    CSS命名规范:
    常用的JavaScript验证正则表达式
    Linq to sql 查询句法
    Web.config配置文件详解
  • 原文地址:https://www.cnblogs.com/louhao-20199310/p/11956055.html
Copyright © 2011-2022 走看看