从零到一为你的Android HAL服务AIDL/HIDL配置完整的SEPolicy策略1. 理解Android SELinux基础架构现代Android系统采用SELinux作为强制访问控制MAC的核心安全机制。与传统的自主访问控制DAC不同SELinux要求所有进程和资源的交互必须显式声明权限。对于HAL服务开发者而言这意味着需要构建完整的策略链安全上下文Security Context每个进程和资源都有唯一标签格式为user:role:type[:range]策略规则通过.te文件定义allow规则控制主体进程对客体资源的访问权限上下文映射file_contexts、hwservice_contexts等文件将路径/服务名映射到安全类型典型HAL服务的策略涉及三个关键组件可执行文件标签hal_foo_exec服务进程域hal_foo_default接口对象上下文hal_foo_hwservice2. HAL服务SEPolicy配置全流程2.1 定义可执行文件上下文在vendor/file_contexts中添加条目标记HAL服务二进制文件的安全上下文# AIDL HAL服务示例 /vendor/bin/hw/vendor\.company\.hardware\.demo2\.1-service u:object_r:hal_demo_default_exec:s0 # HIDL HAL服务示例 /vendor/bin/hw/android\.hardware\.demo1\.0-service u:object_r:hal_demo_default_exec:s0在对应的.te文件中声明类型属性type hal_demo_default_exec, exec_type, vendor_file_type, file_type;2.2 创建服务进程域在hal_demo_default.te中定义进程域并建立域转换type hal_demo_default, domain; # 关键宏实现从init到服务域的自动转换 init_daemon_domain(hal_demo_default)2.3 配置接口对象权限对于AIDL HAL服务在service_contexts中注册接口vendor.company.hardware.demo.IDemo/default u:object_r:hal_demo_service:s0在service.te中定义接口类型type hal_demo_service, hal_service_type, protected_service, service_manager_type;对于HIDL HAL服务在hwservice_contexts中注册接口android.hardware.demo::IDemo u:object_r:hal_demo_hwservice:s0在hwservice.te中定义接口类型type hal_demo_hwservice, hwservice_manager_type;2.4 建立客户端-服务端绑定使用SELinux宏简化策略编写# 声明HAL属性集 hal_attribute(demo) # 允许客户端查找服务 hal_client_domain(system_server, hal_demo) # 配置服务端权限 hal_server_domain(hal_demo_default, hal_demo) binder_use(hal_demo_default)3. 策略调试与验证技巧3.1 常见AVC拒绝处理流程收集拒绝日志adb logcat | grep avc: adb shell dmesg | grep avc:使用audit2allow生成建议规则adb pull /sys/fs/selinux/policy audit2allow -p policy avc_log.txt典型权限修复示例# 允许hal_demo_default进程访问设备节点 allow hal_demo_default vendor_device:chr_file { open read write }; # 允许system_server调用HAL接口 allow system_server hal_demo_hwservice:hwservice_manager find;3.2 编译时neverallow规避当遇到策略冲突时应采用最小权限原则# 错误做法直接赋予全能权限 allow hal_demo_default self:capability dac_override; # 正确做法精确控制资源访问 allow hal_demo_default sysfs_demo:file { open read };4. 高级策略配置模式4.1 属性继承与扩展利用属性实现策略复用# 定义HAL家族属性 attribute hal_demo; attribute hal_demo_client; attribute hal_demo_server; # 服务端继承属性 typeattribute hal_demo_default hal_demo_server;4.2 条件策略控制针对不同构建类型调整策略# 仅在userdebug版本允许调试权限 userdebug_or_eng( allow hal_demo_default debugfs:file { append write }; )4.3 多版本HAL兼容通过版本化类型支持接口演进# v1接口 type hal_demo_v1_hwservice, hwservice_manager_type; # v2接口 type hal_demo_v2_hwservice, hwservice_manager_type;5. 实战完整AIDL HAL策略示例以vendor.company.hardware.demo2.1服务为例文件上下文(file_contexts):/vendor/bin/hw/vendor\.company\.hardware\.demo2\.1-service u:object_r:hal_demo_default_exec:s0进程域定义(hal_demo_default.te):type hal_demo_default, domain; type hal_demo_default_exec, exec_type, vendor_file_type, file_type; init_daemon_domain(hal_demo_default) # 基础权限 allow hal_demo_default self:process { execmem }; allow hal_demo_default vendor_configs_file:dir { search };接口配置(service_contexts):vendor.company.hardware.demo.IDemo/default u:object_r:hal_demo_service:s0客户端策略(system_server.te):hal_client_domain(system_server, hal_demo) allow system_server hal_demo_service:service_manager find;服务端策略(hal_demo_default.te):hal_server_domain(hal_demo_default, hal_demo) add_service(hal_demo_default, hal_demo_service)通过这套策略配置开发者可以构建符合Android安全要求的HAL服务确保服务进程、接口对象和客户端应用之间的安全交互。