記憶體安全

記憶體不安全

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

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

記憶體安全性錯誤會對品質和穩定性造成負面影響,並佔使用者裝置上發生的所有當機事件的大部分。因此,記憶體安全錯誤密度高低與使用者體驗不佳有直接關聯。
原生程式碼採用 C、C++ 和彙整等記憶體不安全語言編寫,佔 Android 平台程式碼的 70% 以上,並出現在約 50% 的 Google Play 商店應用程式中。
由於程式碼的複雜度不斷增加,如果不加以控管,記憶體安全性錯誤會隨著時間增加。因此,為生態系統提供可偵測及緩解這類錯誤的工具和技術,對我們的長期成功至關重要。
過去幾年來,我們一直與硬體合作夥伴密切合作,開發 Arm 記憶體標記等硬體技術,並在 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 將成為大多數新原生專案的首選。不過,目前 Android 平台程式碼中超過 70% 的記憶體安全程式碼,都無法使用 Rust 重寫。日後,Rust 將與記憶體安全性工具相輔相成。

記憶體安全性工具

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

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

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