拋棄硬體抽象層 (HAL)
文 / Android 安全團隊高階軟體工程師 Jeff Vander Stoep
更新對確保安全性至關重要,但對於裝置製造商來說,更新可能難以實施,並且成本高昂。Treble 專案通過將底層供應商實現從 Android 核心框架中剝離出來,使更新變得更簡單。這種模組化的設計允許分別獨立更新平臺和供應商提供的元件。讓更新變得更輕鬆、更快速已經很棒,然而,Treble 加強模組化設計還有一個目的:提高安全性。
隔離 HAL
硬體抽象層 (HAL) 在與裝置無關的程式碼和特定於裝置的硬體實現之間提供了一個介面。HAL 通常打包成共享庫,直接載入到需要與硬體互動的程式中。安全邊界在程式級實施。因此,將 HAL 載入到程式中意味著 HAL 與載入它的程式執行在相同的安全環境中。
傳統的在程式中執行 HAL 的方法意味著程式需要每個程式中 HAL 所需的許可權,包括對核心驅動程式的直接訪問許可權。同樣,程式中的所有 HAL 都有與程式中其他 HAL 相同的一組許可權,包括其他程式中 HAL 所需的許可權。這就導致程式和 HAL 擁有過多的許可權,能夠訪問它們本不應該訪問的許可權和硬體。
▲ 傳統的一個程式中載入多個 HAL 的方法。
將 HAL 移到自己的程式中更好地遵循了最低許可權原則。這帶來了兩個特別的好處:
每個 HAL 都在其自己的沙盒中執行,並且僅被允許訪問它所控制的硬體驅動程式,而授予程式的許可權僅限於完成其作業所必須的許可權。
類似地,程式喪失了對 HAL 所需的硬體驅動程式、其他許可權和功能的訪問權。
▲ 每個 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 伺服器中移除。
減少和隔離核心的攻擊面
Linux 核心是 Android 上安全模型的主要執行者。試圖躲避沙盒機制的行為常常涉及攻擊核心。對 Android 核心漏洞的分析表明:核心漏洞絕大多數發生在硬體驅動程式中,並且針對漏洞的攻擊也絕大部分通過硬體驅動程式進行。
解除系統伺服器和媒體框架的特權非常重要,因為它們直接與已安裝的應用互動。移除對硬體驅動程式的直接訪問使得 Bug 難以侵入,為 Android 的安全模型增加了一層防禦機制。
檢視全文及文中連結,請點選文末“閱讀原文”。
推薦閱讀:
Google現已推出Android版Motion Stills
相關文章
- 硬體抽象層:HAL抽象
- HAL 硬體抽象層介紹抽象
- Android硬體抽象層(HAL)模組編寫規範Android抽象
- Android的硬體抽象層模組編寫規範Android抽象
- android HAL層程式碼Android
- 效能優化之拋棄Calendar優化
- 拋棄jQuery 深入原生的JavaScriptjQueryJavaScript
- 拋棄NVelocity,來玩玩Razor
- 拋硬幣(機率dp)
- Android Studio拋棄滑鼠指南Android
- 被時代拋棄的危機感
- Android Hal層簡要分析Android
- 拋硬幣中的反射原理反射
- 抽象層書單抽象
- 蘋果要狠心拋棄iPhone 7 外形感人!蘋果iPhone
- 更智慧——我們才被拋棄 (轉)
- android音訊hal層簡介Android音訊
- STM32 HAL 庫硬體 I2C 驅動 MPU6050
- 又有三家遊戲公司拋棄大小周遊戲
- Debian GNU/Linux拋棄Firefox?(轉)LinuxFirefox
- 鴻蒙NEXT開發案例:拋硬幣鴻蒙
- 拋棄UITableView,讓所有列表頁不再難構建UIView
- MacBook Pro可能會拋棄Touch Bar,重振MagSafeMac
- 超級英雄遊戲需要拋棄「現實主義」遊戲
- Android要拋棄Java了?谷歌看中蘋果SwiftAndroidJava谷歌蘋果Swift
- Android HAL 層框架分析以及程式碼示例Android框架
- 雲端儲存抽象層-FluentStorage抽象
- gfx-rs/hal跨平臺圖形抽象庫使用介紹抽象
- [譯] 我們如何拋棄了 Redux 而選用 MobXRedux
- Twitter 宣佈拋棄 Mesos,全面轉向Kubernetes
- Twitter 宣佈拋棄 Mesos,全面轉向 Kubernetes
- 拋棄mysql模糊查詢,使用sphinx做專業索引MySql索引
- Cassandra曾被Facebook拋棄,現正幫蘋果壯大蘋果
- Facebook 重構:拋棄 Sass / Less ,迎接原子化 CSS 時代CSS
- 拋棄臃腫的 jQuery,用 NodeList.js 操作 DOMjQueryJS
- 專家:微軟拋棄XP 國內ATM不受影響微軟
- 慕尼黑政府拋棄Windows 09年前過渡到Linux(轉)WindowsLinux
- Android中HAL如何向上層提供介面總結Android