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用户可以做的事情。
2019-2020-1 20199310《Linux内核原理与分析》第十一周作业的更多相关文章
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 《Linux内核原理与分析》第一周作业 20189210
实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...
- 2018-2019-1 20189221《Linux内核原理与分析》第二周作业
读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- .Net微服务实践(二):Ocelot介绍和快速开始
目录 介绍 基本原理 集成方式 快速开始 创建订单服务 创建产品服务 创建网关 运行验证 最后 上篇.Net微服务实践(一):微服务框架选型 我们对微服务框架整体做了介绍,接下来我们从网关Ocelot ...
- 一位萌新Google冲浪的开始
这一切的开始可能都来源于对 百度 各方面的不满吧(确实不咋滴) 于是开始对Google感冒,上必应https://cn.bing.com/去搜了下“国内如何上Google”,上面也是众说纷纭,莫衷一是 ...
- STM32F103ZET6的中断管理
1.STM32的中断 STM32的中断管理是属于内核部分的,所以中断管理的寄存器也是属于内核组,不属于芯片外设,在查看相关资料的时候,需要查看相对应的内核手册. STM32F103ZET6是Corte ...
- HTML、PHP、CSS、JS之间的关系
23:02:06 2019-08-05 自己要搭建网站 虽然可以下载大佬的界面 但至少要懂一点web开发的知识 我现在感觉像个憨憨 啥都不明白 转载自:知乎 https://www.zhihu.com ...
- Redis 笔记(六)—— ZSET 常用命令
常用命令 命令 用例和描述 ZADD ZADD key-name score member [score member ...] —— 将带有分值的成员添加到 HSET 中 ZREM ZREM key ...
- Unity 游戏框架搭建 2019 (二十七、二十八)弃用的代码警告解决&弃用的代码删除
在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...
- MTK Android Camera运行流程
Android Camera 运行流程 总体架构1.CameraService服务的注册2.Client端的应用层到JNI层Camera App-JNI3.Client到Service的连接4.HAL ...
- [go]map基本使用和底层原理
1.map基本使用 map声明 var m4 map[int]int //只是声明 没有开辟空间 m4[1]=100 //报错 log.Println(m4) 创建 //1 m3:=make(map[ ...
- k8s yaml示例
Kind选择 https://kubernetes.io/zh/docs/concepts/workloads/controllers/ Pod示例 apiVersion : v1 #版本v1 kin ...
- 使用 Python 查看局域网内存活主机
1 安装 (如果误用了 pip insatll nmap的话,要先 pip uninstall nmap) pip install python-nmap Nmap 是一款用于网络发现和安全审计的网络 ...