使用記憶體安全工具提升應用質量和安全性

Android開發者發表於2022-03-21

Android 記憶體安全工具是一個可幫助您提升應用質量和安全性的綜合工具包。通過本文您可以瞭解到我們推出的各種記憶體安全工具及其使用場景,以及瞭解如何通過這些工具來找到並修復問題。

如果您更喜歡通過視訊瞭解此內容,請在此處檢視:

https://www.bilibili.com/vide...

△ 使用記憶體安全工具提升應用質量和安全性

什麼是記憶體安全錯誤

記憶體錯誤是指在使用 C 或 C++ 等原生語言處理記憶體時發生的錯誤。

void BufferOverflow() {
    char *p = new char[10];
    p[20] = 'x'; // ?? 在分配的陣列之外寫入
}

void UseAfterFree() {
    char *p = new char[10];
    delete[] p;
    p[0] = 'x'; // ?? 在陣列已經被釋放之後寫入
}

△ 兩種常見的記憶體安全錯誤

在這個例子中,我們可以看到最常見的兩種錯誤形式,分別是 Buffer Overflow (緩衝區溢位) 和 Use After Free (釋放後使用)。

終端使用者裝置每秒會報告超過 3,000 次與記憶體相關的崩潰,也就是說每個月會發生 77 億次崩潰,並且這些崩潰很容易被使用者感知,導致使用者對這些應用產生糟糕的印象。使用記憶體安全工具可幫助您減少此類錯誤,從而改進使用者體驗。

每年有超過 60% 的 Android 漏洞是由記憶體錯誤造成的,除了 Android 之外的其他大型原生程式碼庫也報告了類似的問題,修復應用中的記憶體錯誤與修復系統中的記憶體錯誤一樣重要。使用者不必關心作業系統如何保護其資料,而您的應用則不應忽視這個問題,使用記憶體安全工具有助於為使用者提供更高的安全保障。

Play 商店中超過 50% 的應用包含有原生程式碼,即便您沒有直接使用原生程式碼來實現應用中的功能,也可能會因為使用第三方 SDK 或庫而間接包含原生程式碼。

使用記憶體安全工具

我們的任務是幫助開發者確保記憶體安全,幫助您避免在使用原生程式碼處理記憶體時造成錯誤和漏洞。因此,我們開發了一套工具以便檢測並幫助開發者提高工作效率,這使得檢測和修復此類錯誤變得比以往更輕鬆。

多年來,我們致力於引入新工具並增強現有工具,現在正式向您介紹這三款工具:

  • HWASan: 基於編譯器的記憶體錯誤檢測工具
  • GWP-ASan: 基於分配器的概率性記憶體錯誤檢測工具
  • Arm MTE: 基於硬體的記憶體錯誤檢測工具

HWASan

HWASan 從 Android 10 開始提供,它可以檢測各類記憶體錯誤包括堆疊、全域性和堆問題。使用該工具需要重新編譯,因為它需要在所有記憶體操作中引入額外的程式碼來執行,所以該工具可能不適合在生產環境中部署。引入 HWASan 大約會使應用的效能降低兩倍,我們建議您在開發和測試階段中使用 HWASan。

使用 HWASan 總共有 3 個步驟:

  • 將 HWASan 刷寫到您的測試裝置上
  • 使用 -fsanitize=hwaddress 引數重新構建您的應用
  • 執行

我們為大多數 Pixel 裝置維護 HWASan 構建,雖然該工具的效能不適合在生產環境中部署,但用於測試是足夠的。在內部我們使用 HWASan 構建來對新的 Pixel 裝置進行 dogfood 測試。如果您想了解更多關於 HWASan 的詳細資訊,請查閱文件指南 HWAddress Sanitizer

GWP-ASan

GWP-ASan 是我們在 Android 11 中引入的一款概率性記憶體錯誤檢測工具,概率性是指隨機保護某些堆分配,這樣能在效能和捕獲錯誤的機率之間取得平衡。這有點像彩票系統,隨著執行程式碼庫的裝置數量增加,檢測到錯誤的機率也會增加。GWP-ASan 不需要重新編譯,其效能非常適合用於生產環境,強烈建議您從開發初期一直到測試和部署到生產環境的各個階段都使用 GWP-ASan。

GWP-ASan 的使用非常簡單:

  • 將 gwpAsanMode 新增到 Android 清單檔案
  • 執行

如果您想了解更多關於 GWP-ASan 的詳細資訊,請查閱文件指南 GWP-ASan

Arm MTE

Arm MTE 是我們與 Arm 合作開發的基於硬體的記憶體錯誤檢測工具,我們將隨著新硬體的推出在未來逐步為開發者提供這款工具。雖然這類硬體技術在一些 Android 裝置上可用,但我們強烈建議應用開發者們去熟悉 HWASan 與 GWP-ASan 以便在各類相容的裝置間更為順暢的過渡。

執行程式碼並查詢問題

啟用記憶體安全工具後應儘可能多地執行程式碼路徑,記憶體錯誤會生成可用於本地除錯的 Logcat 和 Tombstone 跟蹤記錄,在生產環境中,報告將從裝置匯出到 Play 開發者控制檯。我們在 Android 12 中引入了新的 Tombostone API 使開發者能在應用下次啟動時提取到更多的崩潰資訊。我們一直在與 Firebase 合作,致力於在 Crashlytics 中提供對記憶體安全工具的支援。

修復問題

△ 記憶體安全工具提供了包含分配和取消分配回溯的錯誤報告

△ 記憶體安全工具提供了包含分配和取消分配回溯的錯誤報告

使用記憶體安全工具時,錯誤報告會包含有助於除錯的更多資訊,除了令人不愉快的回溯之外,還包含了分配和取消分配的回溯,這對找到錯誤的根本原因很有幫助。我們在內部開發 Android 作業系統時一直在使用這些工具,這幫助我們檢測到了在程式碼庫中隱藏了多年的大量錯誤,這些工具極大地提高了我們檢測錯誤的能力,而且增強的錯誤報告幫助我們縮短了修復時間。

總結

Android 記憶體安全工具可以檢測程式碼庫中的記憶體錯誤,修復此類錯誤可幫助提高質量和安全性。確保記憶體安全的訣竅是使用記憶體安全工具執行程式碼找到錯誤,然後修復這些錯誤。

感謝您閱讀本文章,期待您使用我們所提供的工具提升 Android 生態系統的質量和安全性,如果您遇到任何問題或有任何反饋,請通過 Github Issues 與我們取得聯絡。

歡迎您 點選這裡 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支援!

相關文章