Linux 核心垃圾收集器中的競爭條件可能導致權限提升

谷歌零號專案團隊的 Jann Horn 曾發現 Spectre 和 Meltdown 漏洞,並發布了利用 Linux 核心垃圾收集器漏洞(CVE-2021-4083)的技術。 該漏洞是由於清理 unix 套接字上的檔案描述符時的競爭條件造成的,並且可能允許本地非特權用戶在核心層級執行其程式碼。

這個問題很有趣,因為競爭條件發生的時間窗口估計太小,無法創建真正的漏洞利用,但該研究的作者表明,如果漏洞利用創建者俱有以下能力,即使是這種最初持懷疑態度的漏洞也可能成為真正的攻擊源必要的技能和時間。 Yann Horn 展示如何借助精細操作,減少同時呼叫 close() 和 fget() 函數時發生的競爭條件,形成完全可利用的釋放後使用漏洞,並實現對已釋放資料的存取核心內部的結構。

在同時呼叫 close() 和 fget() 的同時關閉檔案描述子的過程中會出現競爭條件。 對 close() 的呼叫可能發生在執行 fget() 之前,這將使垃圾收集器感到困惑,因為根據引用計數,文件結構不會有外部引用,但仍會附加到文件描述符,即垃圾收集器會認為它對該結構具有獨佔存取權,但實際上,在很短的時間內,檔案描述符表中的剩餘條目仍然會指向正在釋放的結構。

為了增加進入競爭條件的可能性,使用了多種技巧,這使得在引入特定於系統的最佳化時可以將利用成功的機率提高到 30%。 例如,為了將存取具有檔案描述符的結構的時間增加數百納秒,透過在另一個CPU 核心上的活動中亂扔快取來從處理器快取中驅逐數據,這使得從記憶體而不是從記憶體中檢索結構成為可能。快速的CPU快取。

第二個重要功能是使用硬體定時器產生的中斷來增加競爭條件時間。 選擇這個時刻是為了在發生競爭條件時觸發中斷處理程序並中斷程式碼的執行一段時間。 為了進一步延遲控制權的返回,使用epoll在等待佇列中產生了大約50萬個條目,這需要透過中斷處理程序進行搜尋。

利用該漏洞的技術在 90 天的保密期後被揭露。 該問題從內核 2.6.32 開始出現,並於 5.16 月初修復。 此修復包含在核心 2021 中,並且還轉移到了核心的 LTS 分支和發行版中提供的核心套件。 值得注意的是,該漏洞是在分析類似問題 CVE-0920-XNUMX 時發現的,該漏洞在垃圾收集器處理 MSG_PEEK 標誌時表現出來。

來源: opennet.ru

添加評論