车辆系统隔离

为确保车载系统完整性,Android Automotive 在以下层级保护传入数据

EVS System components

图 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 门控连接。应使用 SELinux 规则和内核接口上的适当权限将对车辆 HAL 的访问权限限制为系统应用。

SELinux 政策

Android Automotive 扩展了 SELinux 以过滤驱动程序访问权限,包括打开、关闭、读取、写入和 ioctl 调用。使用 ioctl 过滤(以及其他 SELinux 功能)限制了车辆 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 权限是使用系统级或签名级权限创建的,该权限用于系统应用或显式授予此权限的签名应用。

应用和 Activity 阻止

为了减少驾驶分心,Android Automotive 提供了额外的控件(允许名单),以确保在车辆行驶时无法使用侧载应用。当车辆停放或停止时,这些应用仍然可以运行。

允许名单指定了车辆行驶时可以使用的应用。只有受信任的系统应用才能更新允许名单。虽然更新可以通过网络进行,但不应将更新视为可靠。