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


8827太阳集团积极防御尝试室(ADLab)


ADLab成立于1999年,,,, ,,,,是中国安全行业最早成立的攻防技术钻研尝试室之一,,,, ,,,,微软MAPP打算主题成员,,,, ,,,,“黑雀攻击”概想首推者。。。。。 。 。。截止目前,,,, ,,,,ADLab已通过CVE累计颁布安全缝隙近1100个,,,, ,,,,通过 CNVD/CNNVD累计颁布安全缝隙1000余个,,,, ,,,,持续维持国际网络安全领域一流水准。。。。。 。 。。尝试室钻研方向涵盖操作系统与利用系统安全钻延注智能终端安全钻延注物联网智能设备安全钻延注Web安全钻延注工控系统安全钻延注云安全钻延祝。。。。 。 。。钻研成就利用于产品主题技术钻延注国度沉点科技项目攻关、专业安全服务等。。。。。 。 。。


adlab.jpg