內存安全

記憶體不安全

記憶體安全錯誤,即使用本機程式語言處理記憶體時出現的錯誤,是 Android 程式碼庫中最常見的問題。它們佔 60% 以上的高嚴重性安全漏洞和數百萬用戶可見的崩潰的原因。

記憶體安全錯誤會影響使用者體驗、成本和安全性。
圖 1 :記憶體安全錯誤及其對品質、安全性和成本的負面影響

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

記憶體安全錯誤會對品質產生負面影響

潛在的記憶體安全錯誤可能會導致不確定的結果,具體取決於系統的狀態。這種不可預測的行為會導致崩潰並給我們的用戶帶來煩惱。

每天,我們都會觀察到來自最終用戶設備的數百萬次本機崩潰,並且隨著GWP-ASan的引入,我們已將其中大部分追溯到記憶體安全錯誤。
此資料點驗證了記憶體安全錯誤的品質和密度之間的相關性,並且與我們的 Chrome 同事觀察到的情況一致(請參閱 Chrome GWP-ASan 錯誤熱點清單)。

記憶體安全錯誤會對安全性產生負面影響

記憶體安全漏洞一直是造成 Android 安全漏洞的主要原因,這可以追溯到第一個 Android 版本。

記憶體安全錯誤會對安全性產生負面影響。
圖 2 :記憶體安全漏洞對 Android 漏洞的影響

雖然令人鼓舞的是,這不僅僅是 Android 的問題(請參閱ChromeMicrosoft統計數據),但我們需要為用戶的安全採取更多措施。
谷歌的零日計畫團隊追蹤零日漏洞,這些漏洞已在針對用戶的實際攻擊中被用作零日漏洞。這些不是假設的錯誤,而是在攻擊用戶時積極使用的漏洞。記憶體安全錯誤(記憶體損壞和釋放後使用)佔絕大多數。

記憶體安全漏洞會增加成本

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

低階供應商程式碼中的高密度記憶體安全錯誤(通常進行自訂修改)顯著增加了修復和測試成本。然而,在開發週期的早期檢測這些錯誤可以降低這些成本。

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

記憶體安全

從 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 記憶體安全工具概況

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