参考:Google文档 在 Android 8.0 及更高版本中自定义 SEPolicy
在 Android 源码的 system/sepolicy
目录中,区分 public
、private
和 vendor
是为了模块化 SELinux 策略,并明确不同部分的访问权限和接口边界。这种设计主要基于以下原因:
1. public
目录
- 目的:定义 公开的 SELinux 策略接口,供其他模块(如厂商代码或第三方组件)直接调用。
- 特点:
- 包含策略中允许外部访问的类型(
type
)、属性(attribute
)和接口(interface
)。 - 例如,
hal_foo_client
可能被声明为public
,允许厂商实现的 HAL 服务与之交互。 - 这些策略是稳定的,Google 会保证其兼容性,避免在 Android 版本升级时破坏依赖它的代码。
- 包含策略中允许外部访问的类型(
2. private
目录
- 目的:定义 系统内部使用的私有策略,禁止外部模块直接依赖。
- 特点:
- 包含仅限 AOSP 系统核心组件(如
system_server
、zygote
)使用的类型和规则。 - 例如,
system_app
的某些权限可能被标记为private
,禁止厂商应用直接访问。 - Google 可能在不同版本中随时修改这些策略,无需考虑兼容性。
- 包含仅限 AOSP 系统核心组件(如
3. vendor
目录
- 目的:为 厂商(OEM/SoC 供应商) 提供扩展策略的入口。
- 特点:
- 包含厂商自定义的 SELinux 策略(如设备特定的硬件 HAL、内核模块等)。
- 允许厂商在
vendor
分区添加自己的策略文件(如vendor/foo/sepolicy
),并通过vendor
目录下的规则与 AOSP 策略交互。 - Google 通过
vendor
目录明确划分策略边界,避免厂商直接修改 AOSP 核心策略。
为什么需要这种划分?
兼容性控制
public
策略是稳定的,确保厂商代码在 Android 版本升级后仍能正常工作。private
策略可以灵活调整,不影响外部模块。
安全边界
- 防止厂商或第三方滥用系统权限(例如,禁止厂商应用访问
private
的系统服务)。
- 防止厂商或第三方滥用系统权限(例如,禁止厂商应用访问
模块化设计
- 分离核心策略(AOSP)和厂商扩展策略,降低耦合性。
实际示例
public/foo.te
定义hal_foo_service
类型,并允许厂商 HAL 进程通过hal_foo_client
访问它。private/system_server.te
限制只有system_server
可以访问某些敏感资源(如user_data_file
)。vendor/hal_foo.te
厂商在此文件中为自家 HAL 实现添加自定义规则。
总结
这种划分是 Android 保护核心系统安全、维护兼容性,同时允许厂商灵活定制的重要设计。开发者需遵守以下原则:
- 如果需要扩展策略,优先使用
public
接口。 - 避免直接依赖
private
内容。 - 厂商自定义策略应放在
vendor
目录或设备特定的sepolicy
路径。