安卓GPU安全加固:利用SELinux缩小攻击面
谷歌与Arm合作,通过SELinux策略限制Mali GPU高风险IOCTL,降低安卓设备攻击面,提升系统安全性。
安卓GPU安全加固:联合行动缩小攻击面
谷歌安卓安全与隐私团队(Google’s Android Security and Privacy Team)与Arm合作,针对全球数十亿安卓设备中广泛使用的Mali GPU推出了新的安全加固措施。该举措旨在通过**SELinux(Security-Enhanced Linux)策略限制高风险IOCTL(输入/输出控制)**的访问,从而缩小GPU驱动程序的攻击面。
GPU安全为何重要
由于GPU的复杂性及其对系统的高权限访问,攻击者越来越多地将其作为目标。自2021年以来,大多数基于安卓内核驱动程序的漏洞利用(Android kernel driver-based exploits)均针对GPU,尤其是用户模式驱动程序(UMD)与内核模式驱动程序(KMD)之间的接口。恶意输入可能利用该接口的缺陷,导致内存损坏(memory corruption)和系统被攻陷。
技术方案:利用SELinux限制GPU IOCTL
安卓红队(Android Red Team)与Arm将Mali GPU的IOCTL分为三类:
- 无特权IOCTL:正常操作所需,所有应用均可访问。
- 工具化IOCTL(Instrumentation IOCTLs):用于调试和性能分析,仅限
shell或debuggable应用访问。 - 受限IOCTL:已弃用或仅用于开发,生产环境中被阻止。
为确保平滑过渡,谷歌采用了分阶段SELinux策略部署:
- 选择性加入策略(Opt-In Policy):初期仅在特定系统应用中测试,使用新增的
gpu_hardenSELinux属性。 - 选择性退出策略(Opt-Out Policy):默认启用加固措施,开发者可通过以下方式绕过限制:
- Root设备
- 应用清单中设置
android:debuggable="true" - 永久性SELinux策略例外
OEM及开发者实施指南
谷歌为合作伙伴提供了分步指南,以采用类似的加固措施:
1. 使用平台级加固宏
在system/sepolicy/public/te_macros中新增的宏支持设备特定的IOCTL过滤:
- 允许所有应用(
appdomain)访问无特权IOCTL。 - 将工具化IOCTL限制于调试工具(
shell、runas_app)。 - 根据目标SDK版本阻止已弃用的IOCTL。
2. 定义设备特定的IOCTL列表
OEM需在设备的SELinux策略目录中创建ioctl_macros文件,对IOCTL进行分类(如mali_production_ioctls、mali_instrumentation_ioctls)。
示例:
define(`unpriv_gpu_ioctls', `0x0000, 0x0001, 0x0002')
define(`restricted_ioctls', `0x1110, 0x1111, 0x1112')
define(`instrumentation_gpu_ioctls', `0x2220, 0x2221, 0x2222')
Arm官方IOCTL分类详见其第五代Mali GPU架构文档。
3. 将策略应用于GPU设备
在设备的SELinux策略目录中创建gpu.te文件,并使用平台宏调用已定义的IOCTL列表。
4. 测试、优化与强制执行
遵循迭代式SELinux策略开发最佳实践,审查拒绝日志(denial logs)以确保合法应用不受影响。
影响与未来展望
此次加固措施缩小了Mali GPU的攻击面,保护用户免受已知和未知漏洞的威胁。通过使漏洞无法被利用,该方案提供了长期安全收益。谷歌鼓励OEM采用这些措施,以增强整个安卓生态系统的GPU安全性。
官方文档
致谢
特别感谢Jeffrey Vander Stoep对本项目的贡献。