拋棄硬體抽象層 (HAL)

谷歌開發者_發表於2017-08-01

文 / Android 安全團隊高階軟體工程師 Jeff Vander Stoep

更新對確保安全性至關重要,但對於裝置製造商來說,更新可能難以實施,並且成本高昂。Treble 專案通過將底層供應商實現從 Android 核心框架中剝離出來,使更新變得更簡單。這種模組化的設計允許分別獨立更新平臺和供應商提供的元件。讓更新變得更輕鬆、更快速已經很棒,然而,Treble 加強模組化設計還有一個目的:提高安全性。



隔離 HAL

硬體抽象層 (HAL) 在與裝置無關的程式碼和特定於裝置的硬體實現之間提供了一個介面。HAL 通常打包成共享庫,直接載入到需要與硬體互動的程式中。安全邊界在程式級實施。因此,將 HAL 載入到程式中意味著 HAL 與載入它的程式執行在相同的安全環境中。


傳統的在程式中執行 HAL 的方法意味著程式需要每個程式中 HAL 所需的許可權,包括對核心驅動程式的直接訪問許可權。同樣,程式中的所有 HAL 都有與程式中其他 HAL 相同的一組許可權,包括其他程式中 HAL 所需的許可權。這就導致程式和 HAL 擁有過多的許可權,能夠訪問它們本不應該訪問的許可權和硬體。


640?wx_fmt=png

▲ 傳統的一個程式中載入多個 HAL 的方法。


將 HAL 移到自己的程式中更好地遵循了最低許可權原則。這帶來了兩個特別的好處:

  1. 每個 HAL 都在其自己的沙盒中執行,並且僅被允許訪問它所控制的硬體驅動程式,而授予程式的許可權僅限於完成其作業所必須的許可權。

  2. 類似地,程式喪失了對 HAL 所需的硬體驅動程式、其他許可權和功能的訪問權。


640?wx_fmt=png

▲ 每個 HAL 都執行在自己的程式中。


將 HAL 移到自己的程式中對於確保安全性非常有效,但其代價是客戶端與 HAL 之間的 IPC 開銷增大。對 Binder 驅動程式的改進使得 HAL 和客戶端之間的 IPC 開銷不再高不可攀。通過將 scatter-gather 引入 Binder,不再需要執行序列化/反序列化步驟,將對資料執行的複製操作次數從三次減少到一次,因而提高了每個事務的效能。Android O 還引入了 Binder 域,為供應商和平臺元件提供獨立的通訊流。應用和 Android 框架繼續使用 /dev/binder,但供應商提供的元件現在使用 /dev/vndbinder。平臺和供應商元件之間的通訊必須使用 /dev/hwbinder。在平臺與供應商元件之間禁止其他形式的 IPC。


案例研究:系統伺服器

由核心 Android OS 為應用提供的許多服務現在由系統伺服器提供。隨著 Android 不斷髮展壯大,系統伺服器的責任和許可權使其成為攻擊者眼中的香餑餑。在 Treble 專案中,大約從系統伺服器中剝離出 20 個 HAL,包括用於感測器、GPS、指紋、WLAN 等的 HAL。在此之前,一旦侵入上述任何 HAL,即可獲得系統特權,但在 Android O 中,獲得的許可權將僅限於指定 HAL 所需的許可權子集。


案例研究:媒體框架

在 Android O 中,延續了在 Android Nougat 中加固媒體棧的努力。在 Nougat 中,媒體伺服器被劃分成多個元件,以便更好地遵循最低許可權原則,其中,只有音訊伺服器才享有音訊硬體訪問權,只有相機伺服器才享有相機硬體訪問權,等等。在 Android O 中,大多數直接硬體訪問已從媒體框架中完全移除。例如,用於音訊、相機和 DRM 的 HAL 已分別從音訊伺服器、相機伺服器和 DRM 伺服器中移除。



減少和隔離核心的攻擊面

640?wx_fmt=png

Linux 核心是 Android 上安全模型的主要執行者。試圖躲避沙盒機制的行為常常涉及攻擊核心。對 Android 核心漏洞的分析表明:核心漏洞絕大多數發生在硬體驅動程式中,並且針對漏洞的攻擊也絕大部分通過硬體驅動程式進行。


解除系統伺服器和媒體框架的特權非常重要,因為它們直接與已安裝的應用互動。移除對硬體驅動程式的直接訪問使得 Bug 難以侵入,為 Android 的安全模型增加了一層防禦機制。


檢視全文及文中連結,請點選文末“閱讀原文”。


推薦閱讀:

Google現已推出Android版Motion Stills

什麼?Android O 圖示能自適應了?!

Google如何識別侵入式移動應用?

【視訊】Material Design設計規範的誕生


640?wx_fmt=gif

相關文章