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.jpg


相关先容


(1)虚拟文件系统

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


2.jpg


VFS为所有的文件系统提供了统一的接口  ,对每个详细文件系统的会见要通过VFS界说的接口来实现 。VFS笼统了几个主要的结构:super_block  ,dentry  ,inode  ,file  ,通过这些结构将一个真实的文件舷笼统到内存中  ,从而通过管理这些工具对文件系统举行操作 。


(2)Overlay文件系统

OverlayFS是一个面向Linux的文件系统服务  ,着实现一个面向其他文件系统的团结挂载 。它于2014年被合并到Linux内核的3.18版本 。OverlayFS的主要机制涉及到两个文件系统  ,提供统一名称的目录时  ,目录会见合并 。除此之外  ,OverlayFS泛起其中一个所爆发的工具  ,“上层”文件系统优先 。OverlayFS与其他笼罩型文件系统差别  ,OverlayFS合并的目录子树纷歧定是来自差别的文件系统 。效果如下图所示:


3.jpg


其挂载文件的基本下令如下:

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结构体界说如下图所示:

 

4.jpg


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

 

5.jpg


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


6.jpg


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


7.jpg


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


8.jpg


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


9.jpg


并且设置current->flags为PF_SUPERPRIV  ,即在目今历程上设置超等权限  ,并返回ture 。以是通过挂载overlay文件系统  ,目今历程具备了超等权限 。


 (2)权限逃逸

该误差是在setxattr()函数中爆发的  ,当对文件扩展属性的capabilitiy举行设置时  ,权限校验不彻底 。下面是"SSD Secure Disclosure"披露的Exp执行情形  ,挪用路径如下图所示:


10.jpg


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


11.jpg


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


12.jpg


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


13.jpg


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


14.jpg


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


15.jpg


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


16.jpg


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


17.jpg


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


18.jpg


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


19.jpg


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


20.jpg


误差使用剖析


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

 

21.jpg


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


22.jpg


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


23.jpg


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

 

24.png


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


25.jpg


CLONE_NEWNS和CLONE_NEWUSER界说:


26.jpg


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


27.jpg


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


28.jpg


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


29.jpg


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


30.jpg


补丁跟踪


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


31.jpg


参考链接:

[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清静研究、工控系统清静研究、云清静研究 。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等 。


adlab.jpg