Ubuntu内核OverlayFS权限逃逸误差剖析(CVE-2021-3493)
宣布时间 2021-04-29背 景
凭证官方先容,OverlayFs误差允许Ubuntu下的外地用户获得root权限。这个误差是Ubuntu系统中的特定问题,在该问题中,未准确验证关于用户namespace文件系统功效的应用程序。由于Ubuntu附带了一个允许非特权的Overlayfs挂载的补丁,团结这个补丁挂载Overlayfs可以权限逃逸,抵达权限提升的目的。
影响版本
Ubuntu 20.10
Ubuntu 20.04 LTS
Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Ubuntu 14.04 ESM
误差复现
首先审查内核版本,为受影响版本编译exploit后执行,提权乐成。如下图所示:

相关先容
(1)虚拟文件系统
为支持种种本机文件系统,且在同时允许会见其他操作系统的文件,Linux内核在用户历程(或C标准库)和文件系统实现之间引入了一个笼统层。该笼统层称之为虚拟文件系统(Virtual File System)简称VFS,如下图所示:

VFS为所有的文件系统提供了统一的接口,对每个详细文件系统的会见要通过VFS界说的接口来实现。VFS笼统了几个主要的结构:super_block,dentry,inode,file,通过这些结构将一个真实的文件舷笼统到内存中,从而通过管理这些工具对文件系统举行操作。
(2)Overlay文件系统
OverlayFS是一个面向Linux的文件系统服务,着实现一个面向其他文件系统的团结挂载。它于2014年被合并到Linux内核的3.18版本。OverlayFS的主要机制涉及到两个文件系统,提供统一名称的目录时,目录会见合并。除此之外,OverlayFS泛起其中一个所爆发的工具,“上层”文件系统优先。OverlayFS与其他笼罩型文件系统差别,OverlayFS合并的目录子树纷歧定是来自差别的文件系统。效果如下图所示:

其挂载文件的基本下令如下:
mount -t overlay overlay -o lowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work merged。
其中“lower1:lower2:lower3”体现差别的lower层目录,差别的目录使用“:”脱离,条理关系依次为lower1 > lower2 > lower3(注:多lower层功效支持在Linux-4.0合入,Linux-3.18版本只能指定一个lower dir),然后upper和work目录划分体现:upper层目录和文件系统挂载后,用于存放暂时和间接文件的事情基目录(work base dir),最后的merged目录就是最终的挂载点目录。若一切顺遂,在执行以上下令后,overlayfs就乐成挂载到merged目录下了。
(3)capabilitiy
为了举行权限检查,Linux系统将历程分为了两类:privileged历程(effective UID为0)和 unprivileged 历程(effective UID为非0)。privileged历程可以绕过所有的内核权限检查,而unprivileged 历程要举行严酷的权限检查。从2.2版本的内核最先,linux对权限举行了细分,分为多种差别的权限,称之为capability。capability可以作用在历程上,也可以作用在程序文件上。现在,Linux系统上实现了37种capability。
每个历程都有五个capability荟萃:Permitted,Inheritable,Effective,Ambient,Bounding。文件的capability生涯在文件的扩展属性security.capability中。文件有三个capabilitiy荟萃:Permitted,Inheritable,Effective。文件的capability和历程的capability一起来决议在执行execve后,历程的capability。
误差原理
(1)OverlayFS挂载
通常情形下,挂载文件系统是需要特权的,可是在Ubuntu系统中,通俗用户便可以挂载OverlayFS。以5.4.0版本内核主线代码为例,ovl_fs_type结构体界说如下图所示:

以Ubuntu20.04的内核补丁linux_5.4.0-26.30.diff为例,补丁如下图所示:

添加了fs_flags数据域,并设置为FS_USERNS_MOUNT,体现将允许一个通俗用户在低权限用户命名空间中mout一个overlayfs文件系统。当去mount一个overlayfs文件系统时,挪用路径如下图所示:

会挪用到do_new_mount()函数,该函数是建设一个新的mount,并将其放入namespace树中,实现代码如下图所示:

行2792,获取要挂载的文件系统类型,这里是overlay。然后就是举行capabilitiy校验,如下图所示:

由于fs_flags被设置为FS_USERNS_MOUNT,进入ns_capable()函数,最后通过磨练后,如下图所示:

并且设置current->flags为PF_SUPERPRIV,即在目今历程上设置超等权限,并返回ture。以是通过挂载overlay文件系统,目今历程具备了超等权限。
(2)权限逃逸
该误差是在setxattr()函数中爆发的,当对文件扩展属性的capabilitiy举行设置时,权限校验不彻底。下面是"SSD Secure Disclosure"披露的Exp执行情形,挪用路径如下图所示:

这里pathname为“./ovlcap/merge/magic”,行468,挪用cap_convert_nscap()函数,将要设置的cap转换到nscap中,如下图所示:

进入cap_convert_nscap()函数,举行相关检测后,若是是capabilitiy版本2,则直接挪用ns_capable()举行磨练,凭证注释可知,若是user有超等权限,直接写入并返回。

毫无疑问,这里一定是磨练通过的。打印要害内存,如下图所示:

寄存器rax为0x1,体现返回ture。由于目今会见的inode属于overlay文件系统的。从cap_convert_nscap()函数准确返回后,随即进入vfs_setxattr()函数,这是第一次进入。接下来就是分发到overlay文件系统对应的ovl_xattr_set()函数中,挪用路径如下图所示:

看ovl_xattr_set()函数的部分实现代码,获取upperdentry和realdentry,如下图所示:

获取后,打印upperdentry和realdentry内存,如下图所示:

凭证overlay文件系统特征,这里的upperdentry和realdentry应该是“./ovlcap/upper”目录下的magic的目录项,打印内存可知,如下图所示:

确定真实的dentry后,第二次挪用vfs_setxattr()函数,如下图所示:

此时的dentry是属于ext3文件系统的,打印内存可知,如下图所示:

到此可知,现实上是对ext3文件系统下的“./ovlcap/upper/magic”举行设置cap。权限逃逸历程如下图所示:

误差使用剖析
"SSD Secure Disclosure"官方已经披露了相关Exp,详细剖析如下:

这里界说后面挂载overlay文件系统的文件夹名称:

并自界说xmkdir函数建设这些文件夹:

然后获取目今用户的uid和gid:

建设新的user namespace,由于overlayfs mount需要CAP_SYS_MOUNT能力,因此需要新建一个NEWUSER的namespace,这样就具有CAP_SYS_MOUNT,

CLONE_NEWNS和CLONE_NEWUSER界说:

用目今用户的uid和gid等改写/proc/self下的对应文件,并且用该权限下的namespace挂载overlayfs,前面简介说了,由于ubuntu的补丁保存,该操作是正当的。

对应目录下可以看到我们修改了的文件,通过/proc/self/exe可以找到目今历程的二进制实体(文件):

继续回到exp中,下面结构了一个cap,改cap界说的permitted为0xffffffff,并且开启Effective,然后将/proc/self下的文件拷贝到merge文件夹下,凭证overlay文件系统特征,这个拷贝历程现实是建设./ovlcap/upper/magic文件,最后挪用setxattr()函数,将cap设置到./ovlcap/merge/magic上面。

凭证前文误差原理先容,权限逃逸后,此时属于ext3文件系统的./ovlcap/upper/magic文件的capabilitiy为all+ep,便可以使用capabilitiy举行权限提升,接着启动./ovlcap/upper/magic历程,该历程的capabilitiy已具备all+ep,然后举行setuid(0)和setgid(0)提权操作,这是被允许的。

补丁跟踪
误差成因在上面已经先容了,这里的补丁也很彻底,将cap_convert_nscap放入了vfs_setxattr中,即每次进入vfs_setxattr()函数时,都先举行权限校验,判断capabilitiy和命名空间的权限是否匹配。

参考链接:
[1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3493
[2] https://access.redhat.com/security/cve/cve-2021-3493
[3] https://ubuntu.com/security/CVE-2021-3493
[4] https://github.com/briskets/CVE-2021-3493
[5] https://cve.report/CVE-2021-3493.pdf
[6] https://blog.csdn.net/qq_15770331/article/details/96699386
[7] https://lwn.net/Articles/671641/
[8] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1793458/comments/4
[9] https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial/commit/?id=98a3740920f8f3362c1ac50598af2dc632f5051a
耀世娱乐起劲防御实验室(ADLab)
ADLab建设于1999年,是中国清静行业最早建设的攻防手艺研究实验室之一,微软MAPP妄想焦点成员,“黑雀攻击”看法首推者。阻止现在,ADLab已通过CVE累计宣布清静误差近1100个,通过 CNVD/CNNVD累计宣布清静误差1000余个,一连坚持国际网络清静领域一流水准。实验室研究偏向涵盖操作系统与应用系统清静研究、智能终端清静研究、物联网智能装备清静研究、Web清静研究、工控系统清静研究、云清静研究。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等。



京公网安备11010802024551号