2023-2024-1 20232816《Linux内核原理与分析》第十二周作业


LINUX CAPABILITY 系统安全实验

一、预备知识

在操作系统中,有许多只允许超级用户使用的操作,比如配置网卡,备份所有用户文件,关闭计算机等,但如果要进行这些操作就必须先成为超级用户的话,那就违背了最小权限原则。
Set-UID程序允许用户暂时以root权限进行操作,即使程序中所进行的权限操作用不到root权限的所有权利,这很危险:因为如果程序被入侵了的话,攻击者可能得到root权限。
Capabilities将root权限分割成了权利更小的权限。小权限被称作capability。如果使用capabilities,那么攻击者最多只能得到小权限,无法得到root权限。这样,风险就被降低了。
在kernel版本2.6.24之后,Capabilities可以分配给文件(比如程序文件),线程会自带程序文件被分配到的capabilities。

(一)Linux capability

Linux capability是 Linux 内核的一个功能,它提供了对进程特权的细粒度控制。能力允许进程执行特权操作,而无需完全获取 root(超级用户)权限。通过授予特定的能力给进程,可以在安全性和权限控制方面提供更灵活的设置。
Linux capability系统通过将特权操作划分为独立的能力集合来实现,每个能力都代表了一项特定的权限。这样,可以将特权分配给需要的进程,而不必将完整的 root 权限授予它们。一些常见的能力包括:

CAP_NET_BIND_SERVICE:允许绑定到低于 1024 的特权端口。
CAP_SYS_ADMIN:允许执行系统管理任务,如挂载文件系统、修改网络设置等。
CAP_DAC_OVERRIDE:允许忽略文件访问权限。
CAP_CHOWN:允许更改文件和目录的所有者。
CAP_SETUIDCAP_SETGID:允许修改进程的有效用户 ID 和有效组 ID

要为进程分配或撤销能力,可以使用工具如 setcap 或 getcap。此外,能力还可以通过使用特殊权限位(如文件的 setuid 位和 setgid 位)与二进制程序关联。
请注意,使用能力需要小心谨慎,因为错误的配置可能导致安全漏洞。在分配能力时,请确保只授予进程所需的最小权限,并对系统进行充分的安全审计和测试。
可以使用命令 man 7 capabilities 来获取详细信息。
在这里插入图片描述

(二)SET-UID(设置用户标识)

SET-UID(设置用户标识)是 Linux 系统中的一种特权机制,它允许用户以其他用户的身份执行程序。这种特权机制在实现许多系统工具和服务时发挥着重要作用。本文将介绍 SET-UID 的基本概念、原理和安全性考虑。
在 Linux 中,每个用户都有一个唯一的用户标识(User Identifier,UID),用于标识用户的身份。SET-UID 是一种权限设置,允许程序在执行时暂时切换为其他用户的身份,通常是超级用户(root)或其他有特权的用户。通过 SET-UID,普通用户可以执行具有特权操作的程序,而无需直接获得特权。
当一个程序具有 SET-UID 权限时,它在执行时会继承该程序所有者的 UID,并具有与所有者相同的权限。这意味着程序可以访问仅特权用户才能执行的操作,例如读取敏感文件、修改系统配置和执行系统级任务。
尽管 SET-UID 提供了灵活的特权执行机制,但在使用时需要注意安全性。以下是一些安全性考虑:
a. 最小特权原则:为了减少潜在的安全风险,应仔细评估程序所需的最小特权,并将 SET-UID 限制在必要的范围内。
b. 输入验证和过滤:程序在切换为特权用户之前,应对输入进行充分的验证和过滤,以防止恶意输入导致的安全漏洞。
c. 错误处理和日志记录:在 SET-UID 程序中,错误处理和日志记录非常重要。任何特权操作的失败都应该得到适当的处理,并进行详细的日志记录,以便进行审计和故障排除。
d. 审计和访问控制:对 SET-UID 程序的使用应进行充分的审计和访问控制。只允许可信任的用户或进程执行 SET-UID 程序,并定期审查其使用情况。
SET-UID 是 Linux 中实现特权操作的重要机制之一。通过合理使用 SET-UID,可以提供更细粒度的权限控制,并确保系统安全。然而,使用 SET-UID 也需要小心谨慎,以避免潜在的安全漏洞和滥用风险。在实际应用中,应根据具体需求和安全性考虑来决定是否使用 SET-UID,并采取适当的措施来保护系统和数据的安全。

二、实验准备

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

$ cd
$ wget http://labfile.oss.aliyuncs.com/libcap-2.21.tar.gz
$ tar xvf libcap-2.21.tar.gz
$ sudo rm /usr/include/sys/capability.h
$ sudo rm /lib/libcap.so*
$ cd /home/shiyanlou/libcap-2.21/
$ sudo make
$ sudo make install

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)感受一下Capabilities

首先,以普通用户登录并运行以下命令

$ ping -c 3 www.baidu.com

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

$ sudo su

显示当前目录下文件详细信息:文件所有者具有读取写入执行的所有权限,同组用户具有读取执行的权限、其他用户具有读取执行的权限.
我们将其关闭后,我们现在再ping百度看会发生什么

$ ping www.baidu.com
ping: icmp open socket: Operation not permitted

在这里插入图片描述

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

接着我们进行修改密码, seed 用户的密码是 dees

$ sudo su seed
$ sudo chmod u-s /usr/bin/passwd
$ passwd
$ sudo setcap cap_chown,cap_dac_override,cap_fowner=ep /usr/bin/passwd
$ passwd

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

(三)调整权限

切换到 /home/shiyanlou/libcap-2.21/libcap 目录下,编辑 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

$ sudo make
$ sudo make install    

在这里插入图片描述
在这里插入图片描述在 /home/shiyanlou/libcap-2.21/libcap 目录下新建一个 use_cap.c 文件,并分配cap_dac_read_search给它。
以普通用户登录并运行程序。描述并解释你的观察。

#include <fcntl.h>
#include <sys/types.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/capability.h>
#include <sys/capability.h>
int main( void )
{
    if ( open( "/etc/shadow", O_RDONLY ) < 0 )
        printf( "(a) Open failed\n" );

    if ( cap_disable( CAP_DAC_READ_SEARCH ) < 0 )
        return(-1);
    if ( open( "/etc/shadow", O_RDONLY ) < 0 )
        printf( "(b) Open failed\n" );

    if ( cap_enable( CAP_DAC_READ_SEARCH ) < 0 )
        return(-1);
    if ( open( "/etc/shadow", O_RDONLY ) < 0 )
        printf( "(c) Open failed\n" );

    if ( cap_drop( CAP_DAC_READ_SEARCH ) < 0 )
        return(-1);
    if ( open( "/etc/shadow", O_RDONLY ) < 0 )
        printf( "(d) Open failed\n" );

    if ( cap_enable( CAP_DAC_READ_SEARCH ) == 0 )
        return(-1);
    if ( open( "/etc/shadow", O_RDONLY ) < 0 )
        printf( "(e) Open failed\n" );

}

使用以下命令编译运行

$ gcc -c use_cap.c
$ gcc -o use_cap use_cap.o -lcap
$ ./use_cap

在这里插入图片描述

三、实验问题

1.熟悉cap功能

    CAP_DAC_READ_SEARCH:忽略文件读及目录搜索的DAC访问限制

    CAP_DAC_OVERRIDE:忽略文件的DAC访问限制

    CAP_CHOWN:修改文件属主的权限

    CAP_SETUID:允许改变进程的用户ID

    CAP_KILL:允许对不属于自己的进程发送信号

    CAP_NET_RAW:允许使用原始套接字

2、当我们想动态调整基于ACL访问控制权限的数量时,应该怎么做?与capabilities比较哪种更加便捷?

    ACL访问控制是通过查询访问控制列表来获得访问主体权限的访问控制的。我们通过修改访问控制列表中用户的访问权限来动态调整基于ACL访问控制权限的数量。

    ACL方式与capabilities相比,capabilities更便捷。

    Linux提供了直接修改进程权能的系统调用sys_capset(),进程可以通过sys_capset()调用来直接修改除init进程以外的任何进程的各权能集。而ACL需要调整访问控制列表中文件的安全域和权限等进行权限调整。两种方式相比起来,capabilities更便捷。

3、当程序(以普通用户运行)禁用cap A时,它遭到了缓冲区溢出攻击。攻击者成功注入恶意代码并运行。他可以使用cap A么? 如果线程删除了cap A呢,可以使用cap A么?

  当程序(以普通用户运行)禁用cap A时,它遭到了缓冲区溢出攻击。导致cap A没有成功禁用,攻击者成功注入恶意代码并运行,则可以使用capA。

   如果线程删除了capA,那么capA已经成功禁用,则攻击者不可以使用capA。

4、问题如上,改用竞态条件攻击。他可以使用cap A么? 如果线程删除了cap A呢,可以使用cap A么?

   改用竞态条件攻击,程序禁用cap A,竞态攻击者抢占资源,可以获得capA使用权限。

   如果线程删除了capA,竞态攻击者依然可以抢占资源,获得capA的使用权限。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值