記憶體安全

記憶體不安全

記憶體安全錯誤是在原生程式設計語言中處理記憶體時發生的錯誤,也是 Android 程式碼集中最常見的問題。這些漏洞占高嚴重性安全漏洞的 60% 以上,並導致數百萬次使用者可見的異常終止。

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

記憶體安全性錯誤會對品質和穩定性造成負面影響,並佔使用者裝置上發生的所有當機事件的大部分。因此,記憶體安全錯誤密度高低與使用者體驗不佳有直接關聯。
使用 C、C++ 和彙整等記憶體不安全語言編寫的原生程式碼,佔 Android 平台程式碼的 70% 以上,並出現在約 50% 的 Google 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) 強烈建議您在開發期間使用記憶體安全性工具。
我們與生態系統密切合作,增加記憶體安全性工具的使用率,並將這些工具整合至持續整合和測試程序。
我們希望隨著時間的推移,每部裝置都能通過完整的 Compatibility Test Suite (CTS) 執行,並使用記憶體安全性工具,證明沒有發現這類錯誤。舉例來說,Arm v9 平台必須提供啟用記憶體標記功能的 CTS 執行作業,而 Arm v8 平台則可要求提供使用 HWASAN 和 KASAN 執行的 CTS。

Rust 是平台程式碼的新程式設計語言

Android 12 導入了 Rust 做為平台語言。Rust 提供的記憶體和執行緒安全性,效能等級與 C/C++ 相似。我們預期 Rust 將成為大多數新原生專案的首選。不過,在 Rust 中,重新編寫所有記憶體不安全的程式碼 (目前代表超過 70% 的 Android 平台程式碼)。日後的 Rust 將會與記憶體安全工具互補。

記憶體安全工具

Android 支援多種工具,可協助偵測記憶體安全性錯誤。下圖列出可用的 Android 記憶體安全性工具分類。

記憶體安全性錯誤會對安全性造成負面影響。
圖 3:Android 記憶體安全性工具總覽

我們的工具涵蓋各種部署情境和目標。以下說明文件將說明各項工具,並提供在產品中使用這些工具的參考資料。