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安全研究、工控系統安全研究、云安全研究。研究成果應用于產品核心技術研究、國家重點科技項目攻關、專業安全服務等。