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