幽靈必須死:漏洞利用幽靈'msg_msg'以及VED的防護策略
HardenedVault 寫道 "近年來不少針對Linux系統內核的漏洞利用攻擊方式都會利用一個名為msg_msg的神奇結構體作為利用早期階段的部署展開,比如信息泄漏的攻擊場景,對于系統安全的縱深防御體系越早的檢測和阻斷對于防御的一方越有利,賽博堡壘(HardenedVault)的Linux內核疫苗方案VED(Vault Exploit Defense)的一個2022版本的特性可以針對這種攻擊方法免疫,并測試了主流的公開的漏洞利用。VED 維護了一個 msg_msg 的列表,計算每個 msg_msg 內容的 hash。 使用 msgrcv() 讀取或釋放struct msg_msgseg next, size_t m_ts 和 void *security' 被污染的 msg_msg 將會被 VED 探測到。但是我們的檢查并沒有包含 stuct list_head m_list`, 這意味著如果該指針被污染并被釋放,VED 并不能檢查出來,因為他是由 msg_queue 來維護的。 CVE-2021-22555: Turning \x00\x00 into 10000$ - Exploring struct msg_msg 就是這樣一個例子. 但 VED 使用其他辦法來進行防御。VED 添加了越界讀取的檢查。如果說讀取目標緩存的長度和讀取長度是不匹配的, VED 就能檢查到污染。在漏洞利用中’size_t m_ts’的污染較容易達成越界讀取, 并且實現 KASLR 繞過或者泄漏堆地址。VED 的檢查能夠有效檢查到越界讀取, 但是這個防御也是不完整的,精心制作的 msg 仍可能繞過。比如說, 存在 UAF/double free 漏洞的結構體,msg_msg 結構體,需要泄漏目標結構體, 三者的長度都是一致的,仍可以繞過 VED 的檢查。
這兩個緩解措施均是可被繞過的,VED 目前的版本是基于 LKRG 實現的,檢查的完整性與性能的平衡是需要考慮的。更加嚴密的 msg 是可能的,但是 kprobe 的檢查點數量,計算量需要多的多。另外則是雖然這兩個緩解措施均可被繞過,但是疊加兩者,由于其中的檢查是相互交叉的,比方說完整性檢查包含的 struct msg_msgseg *next, size_t m_ts,和越界檢查。這使得漏洞利用需要依賴于原代碼路徑來實現堆噴,和更依賴同類型的 object 之間的污染,使得 msg 的漏洞利用困難程度上升。當然這些專門的繞過對資深的內核黑客來說不會是多大的問題。VED 也在探索更加完整并且平衡性能損耗的方案。"
http://https://hardenedvault.net/blog/2022-11-13-msg_msg-recon-mitigation-ved/