為了確保汽車系統的完整性,Android Automotive 在以下層級保護傳入資料:
圖1.系統服務架構
- 應用。系統驗證應用程式是否有權與汽車子系統通訊。
- 定義明確的 API。通用 API 不接受任意資料 blob(API 必須明確定義)。
- 汽車服務。僅允許透過 OTA(或 USB)進行更新,並具有全碟加密和驗證啟動。不能側載。
- 車輛 HAL。驗證是否允許特定訊息。
應用程式和 API
Android Automotive 基於 Android 構建,直接與眾多安全關鍵子系統互動。此外,不同的車輛可能具有不同的介面以及向Android公開的不同功能。為了使這些功能安全且簡化,它們被隔離在抽象層中,與 Android 的其餘部分分開。只有定義明確且對透過車載網路發送的訊息進行嚴格格式化的 API 才能與車輛 HAL 進行通訊。這為 Android 開發人員提供了一個可預測的介面,並提供了與車輛其他部分的安全互動。
車輛 HAL 訊息在兩個層級進行過濾:
- 應用程式級別。非系統應用程式可以透過具有適當權限的汽車服務存取車輛 HAL。
- 車輛 HAL 等級。提供額外的保護層並確保發送到車輛子系統的訊息來自合法來源。也可用於限制訊息速率,防止惡意應用程式淹沒 CAN 總線並可能幹擾車輛子系統。
車輛HAL
車輛 HAL 是與車輛互動的較低層,透過驅動程式輸入/輸出控制 (ioctl) 呼叫與車載網路和其他車輛硬體進行通訊。
車輛 HAL 是 Android Automotive 中唯一連接到 IVI 系統的元件,可透過直接應用處理器/微控制器連接或透過 VMCU 進行閘控。對 Vehicle HAL 的存取應僅限於使用 SELinux 規則和核心介面上適當權限的系統應用程式。
SELinux 政策
Android Automotive 擴展了 SELinux 以過濾驅動程式訪問,包括開啟、關閉、讀取、寫入和 ioctl 呼叫。使用 ioctl 過濾(以及其他 SELinux 功能)限制了 Vehicle HAL 允許和接受的 CAN 訊息類型,從而大大減少了攻擊面。有關 SELinux 的詳細信息,請參閱Android 中的安全增強型 Linux 。
此外,汽車用例包括應隔離和控制的新型敏感資料。敏感資料有單獨的權限;其他功能(例如 HVAC 控制和窗戶調節)應僅提供給系統應用程式。汽車特定 SELinux 策略範例:
<permission-group android:name=”android.support.car.permission.CAR_MONITORING /> <permission android:name=”android.support.car.permission.CAR_MILEAGE” android:protectionLevel=”signature|privileged” /> <permission android:name=”android.support.car.permission.CAR_SPEED” android:permissionGroup=”android.permission-group.LOCATION” android:protectionLevel=”dangerous” /> <permission android:name=”android.support.car.permission.CAR_VENDOR_EXTENSION” android:permissionGroup=”android.support.car.permission.CAR_INFORMATION” android:protectionLevel=”signature|privileged” />
CAR_MONITORING
權限群組是為汽車相關權限建立的。當前速度可以被視為敏感資訊。因此,所建立的CAR_SPEED
權限的保護等級為危險。此級別意味著資訊是私密且敏感的。權限CAR_VENDOR_EXTENSION
是使用系統級或簽名級權限建立的,該權限用於明確授予此權限的系統應用程式或簽署應用程式。
應用程式和活動阻止
為了減少分心駕駛,Android Automotive 提供了額外的控制(允許清單),以確保在車輛行駛時無法使用旁加載的應用程式。當車輛停放或停止時,這些應用程式仍然可以運作。
允許清單指定了車輛行駛時可以使用的應用程式。只有受信任的系統應用程式才能更新白名單。雖然更新可以透過網路進行,但更新不應被認為是可靠的。