內存安全

內存不安全

內存安全漏洞,即在原生編程語言中處理內存的錯誤,是 Android 代碼庫中最常見的問題。它們佔高嚴重性安全漏洞和數百萬用戶可見崩潰的 60% 以上。

內存安全漏洞會影響用戶體驗、成本和安全性。
圖 1 :內存安全漏洞及其對質量、安全性和成本的負面影響

內存安全漏洞會對質量和穩定性產生負面影響,並且在最終用戶設備上觀察到的崩潰中佔很大比例。因此,高密度的內存安全漏洞與糟糕的用戶體驗直接相關。
以 C、C++ 和 Assembly 等內存不安全語言編寫的本機代碼佔 Android 平台代碼的 70% 以上,並且存在於大約 50% 的 Play 商店應用程序中。
鑑於代碼的複雜性不斷增加,如果無人看管,內存安全錯誤將隨著時間的推移而增加。因此,為我們的生態系統提供可以檢測和緩解此類錯誤的工具和技術對於我們的長期成功至關重要。
在過去的幾年裡,我們一直與我們的硬件合作夥伴密切合作,開發諸如 Arm Memory Tagging 之類的硬件技術,並在 Android 代碼庫中引入了 Rust。
這些技術將加速我們通往內存安全的道路,並將幫助更廣泛的軟件行業解決關鍵問題領域。

內存安全錯誤會對質量產生負面影響

潛在的內存安全漏洞可能會導致不確定的結果,具體取決於系統的狀態。這種不可預測的行為會導致我們的用戶崩潰和煩惱。

每天我們都會觀察到來自最終用戶設備的數百萬本機崩潰,並且隨著GWP-ASan的引入,我們將其中大部分都追溯到內存安全錯誤。
該數據點驗證了內存安全錯誤的質量和密度之間的相關性,並且與我們的 Chrome 同事觀察到的一致(請參閱 Chrome GWP-ASan 錯誤熱點列表)。

內存安全漏洞會對安全性產生負面影響

內存安全漏洞一直是導致 Android 安全漏洞的主要原因,最早可以追溯到第一個 Android 版本。

內存安全漏洞會對安全性產生負面影響。
圖 2 :內存安全漏洞對 Android 漏洞的貢獻

雖然知道這不僅僅是一個 Android 問題令人鼓舞(請參閱ChromeMicrosoft統計數據),但我們需要為用戶的安全做更多的事情。
Google 的Project Zero 團隊將在針對用戶的實際攻擊中使用的零日漏洞作為零日漏洞進行跟踪。這些不是假設的錯誤,而是積極用於攻擊用戶的漏洞。內存安全錯誤(內存損壞和釋放後使用)佔絕大多數。

內存安全漏洞增加成本

使用安全修復程序使設備保持最新狀態可以確保我們的用戶安全,但會給我們的生態系統帶來金錢成本。

低級別供應商代碼中的高密度內存安全錯誤通常具有自定義修改,顯著增加了修復和測試成本。但是,在開發週期的早期檢測這些錯誤可以降低這些成本。

研究表明,及早發現錯誤可以將成本降低多達六倍。然而,考慮到我們生態系統的複雜性、供應商維護的代碼庫的平均數量以及軟件複雜性的不斷增加,節省的成本可能會更高。

內存安全

從 Android 12 開始,我們進行了系統性更改,以降低 Android 代碼庫中內存安全漏洞的密度。我們正在擴展 Android 內存安全工具並引入新要求,以鼓勵我們的生態系統解決此類錯誤。隨著時間的推移,這些應該會為我們的用戶帶來更高的質量和更好的安全性,並為我們的供應商帶來更低的成本。

未來幾年,內存安全可能會成為質量和安全性的差異化因素,Android 計劃引領潮流。

支持內存安全的要求

Android 兼容性定義文檔(CDD) 強烈建議在開發過程中使用內存安全工具。
我們正在與我們的生態系統密切合作,以增加內存安全工具的使用,並將它們集成到持續集成和測試過程中。
隨著時間的推移,我們希望使用內存安全工具確保每台設備都通過完整的兼容性測試套件 ( CTS ) 運行,這表明沒有發現此類錯誤。例如,將要求 Arm v9 平台提供啟用內存標記的 CTS 運行,而要求 Arm v8 平台提供使用 HWASAN 和 KASAN 的 CTS 運行。

Rust 作為平台代碼的新編程語言

Android 12 引入了Rust 作為平台語言。 Rust 以類似於 C/C++ 的性能級別提供內存和線程安全。我們希望 Rust 成為大多數新原生項目的首選。然而,用 Rust 重寫所有內存不安全代碼(目前佔 Android 平台代碼的 70% 以上)是不可行的。向前發展 Rust 將成為內存安全工具的補充。

內存安全工具

Android 支持多種有助於檢測內存安全漏洞的工具。下圖展示了可用的 Android 內存安全工具的分類。

內存安全漏洞會對安全性產生負面影響。
圖 3 :Android 內存安全工具環境

我們的工具涵蓋了廣泛的部署場景和目標。以下文檔描述了每個工具,並提供了在您的產品中使用它們的參考。