1. 课程导入

Android Automotive OS(AAOS)把 Android 的应用生态、权限模型与汽车电子电气架构深度结合,形成了“车载信息娱乐系统 + 车辆信号控制 + 多用户座舱”的复合安全场景。与手机 Android 相比,AAOS 的权限安全工程不仅要处理应用沙箱、运行时权限、签名与 SELinux,还要面对车辆属性(Vehicle Property)、驾驶分心限制、多用户/多账户、OTA 升级与整车网络边界等新问题。本课程的目标,是让学习者从“会写应用”进阶到“能设计并验证一套可落地的车载权限安全方案”。

一、学习目标:从权限使用者到安全设计者

本课程围绕四个能力层次展开。第一层是理解模型:掌握 Android 权限体系在 AAOS 中的继承与扩展,包括 UID/GID、权限声明、运行时授权、AppOps、SELinux 域与类型。第二层是识别风险:能够判断哪些车辆信号、系统服务、第三方应用接口存在越权、提权或信息泄露风险。第三层是设计控制:能够为 Car Service、Vehicle HAL、系统应用与第三方应用设计最小权限、签名白名单、角色授权与用户隔离策略。第四层是验证与复盘:能够通过日志、dumpsys、SELinux 拒绝记录、CTS/VTS 与渗透测试手段验证权限策略是否真正生效。

学习主线可以概括为:权限声明 → 授权决策 → 运行时校验 → 内核强制 → 审计与验证。任何一环缺失,都会让“看起来安全”的配置在真实车辆上失效。

二、核心概念:AAOS 权限安全的五个关键词

  • Permission 与 Protection Level:normal、dangerous、signature、privileged 等保护级别决定了应用能否获得权限,以及是否需要用户或系统签名授权。
  • UID / GID 与沙箱:每个应用默认运行在独立 UID 下,系统通过 UID 隔离数据与进程;共享 UID 会显著扩大攻击面。
  • Car Service 与 Vehicle Property:车辆属性是 AAOS 的核心数据通道,权限控制必须覆盖属性读取、订阅、写入与速率限制。
  • SELinux 与 MAC:即使应用获得了 Android 权限,SELinux 仍可在内核层拒绝其访问特定设备节点、Binder 服务或文件。
  • 多用户与驾驶状态:不同用户、不同座位、不同驾驶状态下的权限应动态变化,不能一套策略走天下。

三、整体知识框架:一张图看清权限安全工程

下图给出本课程的知识框架。它从应用层、框架层、原生层到内核层逐层展开,并标出权限决策与强制执行的路径。学习时建议先建立这张“地图”,再逐章深入每个节点。

Android Automotive 权限安全工程知识框架 应用层 → 框架层 → 原生层 → 内核层,权限决策与强制执行逐层下沉 应用层 第三方应用 权限声明 / 运行时请求 系统应用 signature / privileged Car App / 模板应用 驾驶分心限制 多用户 / 多账户 用户隔离 Binder 调用 / 权限校验 框架层 PackageManager 权限解析与授予 Car Service 车辆属性权限控制 AppOps / 角色管理 动态授权与审计 权限数据库 packages.xml HIDL / AIDL / Binder 原生层 Vehicle HAL 属性读写接口 CarNativeService 原生服务权限 Audio / Camera / GNSS 硬件资源访问 HAL 接口 版本与兼容 系统调用 / 设备节点 内核层 SELinux 策略 文件权限 / Capability Binder 驱动校验 审计日志

四、实战路线图:从环境搭建到安全验证

课程后续章节将按“环境 → 模型 → 控制 → 验证 → 复盘”推进。建议学习者按以下路线动手实践,每完成一步都保留日志与配置快照,便于回溯。

  1. 环境准备:搭建 AAOS 模拟器或真车开发板,确认 adb、dumpsys、logcat、SELinux 工具可用。
  2. 权限建模:梳理目标应用需要访问的车辆属性、系统服务与硬件资源,形成权限清单。
  3. 策略设计:为每个权限选择保护级别、签名要求、用户范围与驾驶状态限制。
  4. 代码落地:在 AndroidManifest、Car Service 配置、SELinux 策略与 seapp_contexts 中同步实现。
  5. 验证与复盘:通过越权测试、日志审计与 CTS/VTS 验证策略有效性,记录误报与漏报。

五、典型场景与常见误区

以“第三方应用读取车速”为例:应用声明了 android.car.permission.CAR_SPEED,但该权限为 signature 级别,普通应用无法获得。若开发者误以为“声明即可用”,就会在运行时收到 SecurityException。正确做法是:系统应用或签名应用通过 Car Service 暴露受控接口,第三方应用只能读取脱敏后的状态或通过角色授权获得有限访问。

# 查看应用权限授予情况
adb shell dumpsys package com.example.carapp | grep -A 20 "requested permissions"

# 查看 SELinux 拒绝记录
adb shell dmesg | grep avc

# 查看 Car Service 属性权限
adb shell dumpsys car_service | grep -i permission
常见误区有三:一是只关注 Android 权限,忽略 SELinux 与内核 Capability;二是把 signature 权限当成普通权限,导致第三方应用无法集成;三是在多用户场景下使用全局授权,造成用户间数据越界。复盘时应同时检查“声明、授予、校验、强制”四个环节。

六、核心检查清单

检查项 关键问题 验证手段
权限声明 是否声明了最小必要权限?保护级别是否正确? AndroidManifest 审查、aapt dump permissions
授权决策 运行时授权、签名白名单、角色授权是否覆盖? dumpsys package、AppOps 查询
运行时校验 Car Service 是否对属性读写做二次校验? 代码审查、越权调用测试
内核强制 SELinux 是否允许该域访问目标资源? dmesg avc、audit2allow 分析
多用户隔离 不同用户是否共享了不该共享的数据? 多用户切换测试、数据目录检查

掌握这张框架图与检查清单后,后续每一章都会围绕其中一个节点展开:从权限声明细节,到 Car Service 的属性控制,再到 SELinux 策略编写与整车安全验证。学习时请始终带着“这条权限最终由谁强制、如何验证”的问题,才能真正把 AAOS 权限安全工程落到工程实践中。