从零到一:为你的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_hwservice)
2. HAL服务SEPolicy配置全流程
2.1 定义可执行文件上下文
在vendor/file_contexts中添加条目,标记HAL服务二进制文件的安全上下文:
# AIDL HAL服务示例 /vendor/bin/hw/vendor\.company\.hardware\.demo@2\.1-service u:object_r:hal_demo_default_exec:s0 # HIDL HAL服务示例 /vendor/bin/hw/android\.hardware\.demo@1\.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.demo@2.1服务为例:
- 文件上下文(
file_contexts):
/vendor/bin/hw/vendor\.company\.hardware\.demo@2\.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服务,确保服务进程、接口对象和客户端应用之间的安全交互。