CVE
Note
MCL
poc
DirtyCred
** RESERVED ** This candidate has been reserved by an organization or individual that will use it when announcing a new security problem. When the candidate has been publicized, the details for this candidate will be provided.
affact kernel [v3.17
, v?
)
以下 code 都是以 linux kernel v5.16.15
為例
Dirty Cred 是一個提權漏洞,能夠繞過 kernel 中 cred 的檢查機制,使用時需搭配能夠寫入 heap 相關的漏洞。
越界寫入,寫到了本來不應該寫入的位置。
單純的 OOB
無法利用,原因是我們需要有寫入,否則只有 read 也只能洩漏資料
對於 free 掉的記憶體,卻還是拿來使用
對於同一塊記憶體 free 兩次,導致 free list 連續兩塊是同樣地址,導致下次 malloc 取出的 chunk 同時也存在於 free list 中
struct file
描述了 file 的基本訊息,其中 struct cred
是表示 file 的權限,如果能夠修改到,等同可以串改整個 file 的權限。
file 結構只保存已經被打開的 file 的訊息,因此沒有 open 權限的不會有 file 結構
存放 task 中的權限訊息,例如 SUID
SGID
SBIT
,如果能夠修改到這個結構,等同可以串改整個 task 的權限。
(Todo)
主要解決 buddy system 一次都是要 1 個 page 大小的問題,在原先 buddy system 上再多上 slab 機制,讓小於 page 大小 的空間都由 slab 去分配。
可以把它想成 slab 的縮小版,專門用於 memory 比較小的設備,ex: IoT,因此內容比較精簡,但更容易記憶體碎片化
slab 的加強版,解決了 slab 的問題,為目前 linux 預設的 slab allocator
此攻擊手法的關鍵點在於把 unprivileged credential 換成 privileged credential
,至於如何做到,需要根據搭配的漏洞加以構造 payload。
將原先指向 unprivileged 的 struct cred
透過修改 pointer 的方式,改指向 privileged 的 struct cred
,但 page 是 4k(0x1000) 對齊,所有只有 1/16 的成功率。
privileged credential
上,那就只要 free 掉要攻擊的 unprivileged credential
然後換成 privileged credential
就好unprivileged credential
上,那需搭配 invalid write 的漏洞接下來的手法就和 UAF 如出一轍
此外還有個重點,因為 Dirty Cred 需要在檢查 cred
與寫入 data 之間,將 unprivileged credential 換成 privileged credential
,而此步需要花時間做,因此若能延長這中間的時間,勢必可以提高攻擊成功機率。
userfaultfd 是 linux 提供給 user space 處理 page fault 的機制,因此我們可以自行造成 page fault,並且自己處理,那麼就能自行拖延時間了。
但在 linux kernel v4.13
做了一點修改,在 Dirty Cred 所需要用的的 vfs_writev()
中
,將權限檢查移到了從 user space 拿資料之後,導致無法再利用。
在 linux kernel v5.11
開始,禁止了 userfaultfd,因為他們認為在 page fault 本該就是 kernel space 該處理的事情,拉到 user space 會有安全上的疑慮。 reference
當 process 對檔案進行寫入時,會將 inode 上鎖,防止另一個 process 也要寫入,但是權限的判斷是不會上鎖的,因此可以有如下操作:
struct file
FUSE 是一個 unix 類的介面,可以讓沒有權限編 kernel 的使用者建立自己的檔案系統,那麼使用者就能註冊一個 handler,來指定對文件的操作。
Dirty Cred 並不是屬於程式邏輯的 bug,而是利用 race condition。利用時需要搭配其餘與 heap 相關的漏洞才能達成,所以利用層面廣,但是也是有些限制在的。
目前可利用的 structure 如下圖,其中星號是有 struct file
,十字架是有 struct cred
目前搭配 CVE 如下圖,其中星號是有同時有 double free
和 UAF
,十字架是有 OOB
如果是攻擊 file,就在權限檢查後將
struct file
換掉,變成去寫入另一個檔案
如果是攻擊 cred,將struct cred
換掉後,變成privileged cred
即可