谷歌改善 Chrome 記憶體安全:通過 heap scanning 演算法減少 C++ 程式碼庫安全漏洞

MissD發表於2022-06-07

據外媒報導,谷歌 Chrome 團隊正在研究通過 heap scanning 技術來提高 C++ 程式碼庫記憶體安全。據悉,該技術會對記憶體造成消耗,除非使用較新的 Arm 硬體。

眾所周知,谷歌、微軟是快速程式語言 C++ 的主要使用者和貢獻者,C++ 主要被用於 Chromium、Windows 核心和 Android 等專案。但由於其記憶體安全保證問題,人們開始對使用 Rust 語言越來越感興趣。

儘管存在安全漏洞隱患,但谷歌不能簡單地用記憶體更安全的 Rust 來替換掉 Chromium 現有的 C++ 程式碼,起碼在短期內,將 Chrome 中的 C++ 大規模轉換到 Rust 是不可能的。

好在,谷歌正在研究通過 heap scanning 演算法來提高 C++ 的記憶體安全性。當然,這種方式也有個問題,由於這種技術非常消耗記憶體,因此目前只是實驗性的。

谷歌 Chrome 安全團隊的 Anton Bikineev、Michael Lippautz 和 Hannes Payer 表示,儘管大家認為 C++ 之外的其他語言或有著更強的記憶體安全保證,但在可預見的未來,Chrome 等大型程式碼庫將依舊會使用 C++。

考慮到這種情況,Chrome 工程師已經找到了讓 C++ 更安全的方法,如緩衝區溢位和 use-after free(UAF),以減少與記憶體相關的安全漏洞(這些漏洞佔所有軟體安全漏洞的 70%)。

當然,C++ 不能保證總是使用其結構的最新資訊訪問記憶體,因此谷歌 Chrome 團隊一直在探索使用“記憶體隔離”(memory quarantine)和 heap scanning 來阻止對仍可訪問記憶體的重複使用。

“記憶體隔離”(memory quarantine)和 heap scanning 的工作原理是,通過隔離和堆掃描確保記憶體時間安全,以證明不再有(懸空的)指標引用記憶體之前,避免重複使用記憶體。為了避免更改 C++ 使用者程式碼或其語義,會擷取提供 new 和 delete 的記憶體分配器。

谷歌表示,呼叫 delete 時,記憶體實際上處於隔離狀態,無法被應用程式重新用於後續的新呼叫。在某個時候會觸發堆掃描,它像垃圾收集器一樣掃描整個堆,以查詢對隔離記憶體塊的引用。沒有來自常規應用程式記憶體的傳入引用的塊會被傳輸回分配器,在那裡它們可以重新用於後續的分配。

由於 UAF 構成了影響瀏覽器的大多數高嚴重性問題,近日 Chrome 102 就剛剛修復了一個關鍵的 UAF,在 8 個高危漏洞裡面有 6 個是 UAF。

所謂 heap scanning 記憶體中的 UAF 訪問,是由“懸空指標”(dangling pointers)引起的,即當應用程式使用的記憶體返回到底層系統,但指標指向過期物件時,就會發生懸空指標。通過懸空指標進行訪問會導致 UAF,這在大型程式碼庫中很難發現。

為了檢測 UAF,Google 已經使用瞭如 MiraclePtr 這類 C++ “智慧指標”,這也會對效能造成影響,還使用了編譯器、C++ 清理器、程式碼模糊器及一款名為 Oilpan 的垃圾收集器的靜態分析。

如果 heap scanning 突破實驗階段,谷歌後期可能會增加該演算法專案投入,但能否採用將取決於使用最新 Arm 硬體的裝置。

報導稱,谷歌已經嘗試通過 ARM v8.5A 中的相對記憶體標記擴充套件(MTE)進行硬體輔助記憶體標記,以減少效能消耗。通過用 MTE 基準測試的實驗結果顯示,記憶體消耗顯著降低。儘管如此,接下來 MTE 會否被更廣泛地採用,以不會產生不可接受的效能影響的方式進行堆掃描,這仍然是未來的事情。

Chrome 安全團隊表示“C++ 允許編寫高效能應用程式,但這需要付出安全性的代價。硬體記憶體標記可能會修復 C++ 的一些安全漏洞,同時仍然允許高效能。”“我們期待著看到硬體記憶體標籤在未來得到更廣泛的採用,並建議在硬體記憶體標籤上使用heap scanning(堆掃描)”。

參考連結:https://www.zdnet.com/article...'t%20just%20rip%20and%20replace%20Chromium's%20existing,expensive%20on%20memory%20and%20for%20now%20only%20experimental.

相關文章