为确保车载系统完整性,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 门控连接。应使用 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 提供了额外的控件(允许名单),以确保在车辆行驶时无法使用侧载应用。当车辆停放或停止时,这些应用仍然可以运行。
允许名单指定了车辆行驶时可以使用的应用。只有受信任的系统应用才能更新允许名单。虽然更新可以通过网络进行,但不应将更新视为可靠。