一、试验任务

使用 Capability 达到最小权限原则并分析 Linux 中基于 Capability 访问控制的设计

二、实验准备 

下载Libcap

  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

实际操作截图如下:

在本实验中,需要熟悉的指令:

setcap//给一个文件分配capabilities
getcap//显示文件所带的capabilities
getpcaps//显示线程所在的capabilities

 三、实验过程

 下面这个实验演示capabilities如何移除root特权程序中的不必要的权利。

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

$ ping -c 3 www.baidu.com

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

接下来关闭程序的suid位:

$ sudo su
# chmod u-s /bin/ping

注意:

a、请先which ping确认ping的真正位置;

b、 #开头说明以root权限运行命令,普通用户下请自行在命令前加sudo

再执行ping百度看会发生些什么:

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

它会提示你操作不被允许。这是因为ping命令需要打开RAW套接字,该操作需要root特权,这就是为什么ping是Set-UID程序了。

实际操作截图如下:

让我们分配cap_net_raw给ping,看看会发生什么:

$ sudo su
# setcap cap_net_raw=ep /bin/ping
# exit
$ ping -c 3 www.baidu.com

分配cap_net_raw给ping后,命令成功运行。

实际操作截图如下:

 取消下列程序的Set-UID并不影响它的行为。

下面的步骤证明一开始无法修改密码,但是在分配了cap之后就可以成功修改密码(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

实际操作截图如下:

调整权限

跟使用ACL的访问控制相比,capabilities有其它优势:它可以动态调整大量线程的权限,这对于遵守最小权限原则是很有必要的。当线程中某个权限不再需要时,它应当移除所有相对应的capabilities。这样,即使线程被入侵了,攻击者也得不到已经被删除的capabilities。

使用以下管理操作调整权限:

a、Deleting:线程永久删除某个capability

b、Disabling:线程会暂时停用某个capability。

c、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

添加以下三个函数到 /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的使用权限。

Linux Capability探索试验相关推荐

  1. Linux第二次试验:Linux下的进程通信实验

    Linux第二次试验:Linux下的进程通信实验 前言 一.实验目的 二.实验工具与设备 三.实验预备知识 三.实验内容和步骤 五.实验代码及步骤截图 六.实验总结 前言 为了帮助同学们完成痛苦的实验 ...

  2. u盘版linux initramfs,探索Linux系统的启动过程

    阅读目录 引言 Linux启动过程概述 Grub加载Linux内核和initramfs 探索initramfs文件的方法 基于systemd的init系统 进入图形界面 这篇文章有点长,我花了大约两个 ...

  3. 删除文件的正确姿势-Linux权限探索

    删除文件的正确姿势 在Linux系统中,要删除一个文件,到底需要用户拥有怎样的权限呢?这里做一个小小的探究. 首先用普通用户登录,在文件夹my下创建出mydir文件夹并进入,然后创建一个文件file ...

  4. linux内核生成img,linux内核探索:定制自己的initrd.img-转载并修改

    1. 什么是initrd.img,它有什么用? initrd.img是Linux启 动过程中很重要的一个文件,如果你编译内核时将一部分功能编译为可加载模块.如果系统的一些设备的驱动编译为可加载模,那么 ...

  5. 读书笔记之基于龙芯的linux内核探索解析

    1.1龙芯处理器简介 中央处理器(cpu)分为复杂指令集计算机(cisc)和精简指令集计算机(risc),cisc具有指令集复杂而庞大,指令字不等长,寻址方式复杂,计算指令操作数可以是内存等特征,典型 ...

  6. Linux深入探索04-Bash shell

    ----- 最近更新[2021-12-30]----- 本文目录结构预览: 一.简介 二.shell 变量 1.查看变量 2.变量类型 3.变量操作 4.系统常见的全局变量 三.shell 选项 1. ...

  7. Linux深入探索01-stty与键盘信号

    ----- 最近更新[2021-12-20]----- 本文目录结构预览: 一.简介 二.stty语法 -三.常见的键映射 四.stty使用 1.查看键映射 2.修改键映射 3.其它设置 五.常见键盘 ...

  8. Linux的capability深入分析(2)

    一)capability的工具介绍 在我们的试验环境是RHEL6,libcap-2.16软件包中包含了相关的capability设置及查看工作,如下: rpm -ql libcap-2.16-5.2. ...

  9. Linux的capability深入分析(1)【转】

    转自:https://blog.csdn.net/wangpengqi/article/details/9821227 一)概述:1)从2.1版开始,Linux内核有了能力(capability)的概 ...

  10. Linux的capability深入分析(1)

    一)概述: 1)从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作. ...

最新文章

  1. 2019年最后的一天_2019最后一天的说说 2019最后一条朋友圈再见2019
  2. 矩阵快速幂(Matrix_Fast_Power)
  3. JS制作常见通知信息(适用于手机通知信息和电脑通知信息)
  4. 文献学习(part23)--双向聚类方法综述
  5. linux5.4无法远程,利用Xmanager_在RedHat5.4下实现Linux远程桌面
  6. 【HDU - 4597】Play Game(博弈dp)
  7. 读书笔记--《MicroPython入门指南》
  8. 【Spring】模块
  9. SQL Tuning 基础概述05 - Oracle 索引类型及介绍
  10. Linux启动hbase的shell命令出现警告_Linux 系统故障排查和修复技巧
  11. UVA10701 Pre, in and post【二叉树遍历】
  12. 深入灵魂的共鸣 (《梦断代码》读后感)
  13. iOS:下载/创建证书
  14. 如何成为一名优秀的程序员
  15. MFC仿360屏幕截图
  16. Arduino检测外部电池电量方法
  17. mysql查询笔记_MySQL学习笔记(一):查询
  18. PCL点云处理与关键点提取
  19. pythonturtle画图库使用技巧_Python画图库turtle使用方法简介
  20. c语言课设菜单,c语言课程设计菜单

热门文章

  1. 数据结构-BF算法和KMP算法
  2. golang mian函数和init函数
  3. 谷歌画面传输框架_Google Chromecast评论-将视频无线传输到电视的竞赛正在进行中
  4. latex 两行 大括号_用laTeX排版大括号的三种方法
  5. go语言加解密算法 md5 sha256
  6. Python 数据科学入门教程:Pandas
  7. python绘制菱形_用python画菱形
  8. java程序员 .net 程序员_Java 程序员 和 .NET 程序员
  9. 移动联通基站定位API以及电信基站定位API
  10. 计算机网络图标不见了,电脑网络图标不见了怎么恢复