一、问题:当“最强安全”遇上“第三方移植”

1.1 移植的诱惑与困境

GrapheneOS作为Android生态中最硬核的安全增强操作系统,长期以来只官方支持Google Pixel设备。其背后的技术原因很简单——GrapheneOS对硬件安全有着极其苛刻的要求:必须支持verified boot、硬件级密钥隔离、以及完整的内存标签(MTE)等特性。然而,这种“Pixel独占”的局面正在被打破。

2026年3月,摩托罗拉在MWC 2026上正式宣布与GrapheneOS基金会建立长期合作伙伴关系,计划推出一款预装GrapheneOS的智能手机,并将部分GrapheneOS功能移植到其他摩托罗拉设备上。GrapheneOS开发者同时表示,希望在2026年底前拥有更多符合其硬件要求的OEM设备选择。

但移植从来不是一件简单的事。尤其是当你的安全基线定得比AOSP还要高的时候。

1.2 SELinux:移植中最难啃的骨头

根据Android开源项目官方文档,SELinux是Android的强制访问控制系统(MAC)。AOSP为每个Android版本提供标准策略,供厂商在此基础上构建和定制自己的SELinux配置。GrapheneOS对SELinux的集成深度远超主流Linux发行版——AOSP使用严格、细粒度的SELinux策略覆盖整个操作系统。

问题在于:当你把一个拥有史上最严格SELinux策略的操作系统移植到新设备或新Android版本时,如何在不削弱安全的前提下保证应用兼容性?

这正是本文要探讨的核心命题。

二、方案:GrapheneOS SELinux策略移植的核心方法论

2.1 架构概览:Android SELinux的双层策略体系

根据GrapheneOS官方讨论区的技术说明,Android将SELinux策略分为系统策略(system policy)供应商策略(vendor policy) 两层。两者都必须遵守AOSP中大量的neverallow规则约束。

┌─────────────────────────────────────────────────────┐
│                  系统策略(System Policy)           │
│  定义AOSP服务和应用共用的域(domains)和类型(types)│
│  位置:platform_system_sepolicy                     │
├─────────────────────────────────────────────────────┤
│                  供应商策略(Vendor Policy)         │
│  由设备硬件实现定义,允许驱动所需的操作              │
│  必须同时遵守neverallow规则                         │
└─────────────────────────────────────────────────────┘

根据GrapheneOS的GitHub仓库说明,platform_system_sepolicy目录包含核心Android SELinux策略配置,定义AOSP服务和应用的域与类型。而设备特定的策略需要放置在专门的设备目录下。

GrapheneOS在移植过程中采取了一种独特的策略:不使用常规的供应商代码和供应商SELinux策略,而是使用一个更精简的版本,接近标准Qualcomm SDK,只在此基础上添加必要的额外驱动

2.2 移植工作流:从AOSP到GrapheneOS

根据2026年6月的官方公告,GrapheneOS已成功移植到Android 17,并在Pixel 6a、7、7a、8、10a、10和10 Pro Fold上完成了测试。整个移植工作包括以下关键步骤:

  1. 代码同步:将GrapheneOS代码库同步到新AOSP版本
  2. 策略迁移:将现有SELinux策略迁移到新版本框架
  3. 设备适配:为每个支持的设备调整设备特定策略
  4. 兼容性测试:在生产和调试两种构建模式下分别测试
  5. 问题修复:处理策略冲突和兼容性问题

2.3 动态SELinux标志:GrapheneOS的创新方案

GrapheneOS在SELinux策略管理上有一个重要的技术创新——动态SELinux标志(dynamic SELinux flags)

根据GrapheneOS的代码仓库提交记录,项目引入了用于应用动态SELinux标志的新基础设施,用动态SELinux标志替代了为系统基础应用禁用动态原生代码生成的静态SELinux策略,并增加了动态GrapheneOS SELinux标志的日志基础设施。

这套机制允许GrapheneOS在运行时动态调整SELinux策略,而不是在编译时固定死规则。这对于处理第三方应用的兼容性问题至关重要——你不需要为了兼容某个应用而永久性地放宽安全策略

三、实战:Android 16→17移植中的SELinux策略问题

3.1 真实案例:那个让第三方应用崩溃的SELinux策略问题

2026年,GrapheneOS在将AOSP 16移植到生产环境时遇到了一个典型问题。根据官方测试公告:

SELinux policy issue breaking third party app compatibility was unexpected. It only occurred on production builds, not debug builds, so we missed it in earlier testing.

这个问题非常棘手,原因在于:

  • 调试构建(debug builds) 中一切正常
  • 生产构建(production builds) 中第三方应用崩溃
  • 问题根源是上游Android 16的一个变更,与GrapheneOS为多个封禁GrapheneOS的应用(包括Revolut)提供的兼容方式不兼容

这个案例完美展示了SELinux策略移植中的“隐蔽陷阱”——调试构建和生产构建的策略执行存在差异,导致问题在早期测试中被遗漏。

3.2 解决方案:正确方案而非临时绕过

GrapheneOS团队的反应值得学习:他们找到了正确的解决方案而非临时绕过

具体来说,解决方案涉及:

  1. 识别上游变更:定位Android 16中导致不兼容的具体SELinux策略变更
  2. 分析兼容层冲突:理解GmsCompat(GrapheneOS的沙箱化Google Play兼容层)与新版策略的交互方式
  3. 调整动态策略:利用动态SELinux标志基础设施在运行时适配
  4. 验证生产构建:确保修复在生产构建中同样生效

3.3 Camera HAL的SELinux策略回移植

另一个典型例子是CameraX扩展属性的SELinux策略处理。在2026年3月的版本(2026032000)中,GrapheneOS从Android 16 QPR3回移植了Pixel Camera HAL使用的CameraX扩展属性SELinux策略。

这展示了移植工作的另一个维度——向前兼容与向后移植。当新版Android引入了新的SELinux策略需求,而旧设备或旧版本尚未支持时,需要手动回移植这些策略。

同样,在2026年6月的版本(2026060600)中,Pixel 10a需要添加缺失的SELinux策略以支持Pixel Camera TPU使用。这说明即使是同一厂商的不同设备,SELinux策略也可能存在差异。

四、对比:为什么GrapheneOS的SELinux策略如此特殊?

4.1 与主流Linux发行版的对比

GrapheneOS官方明确指出,Android对SELinux的使用与主流桌面和服务器Linux发行版有根本性的不同

对比维度 主流Linux发行版 GrapheneOS / AOSP
SELinux使用方式 仅在特定场景轻量使用 全系统严格、细粒度策略
策略哲学 允许已使用的内容 显式列出所有允许项,未列出的全部禁止
neverallow规则 有限使用 大量使用以定义和强制执行安全目标
攻击面缩减 有限 通过SELinux实现大规模攻击面缩减

4.2 与CalyxOS的对比

在定制Android ROM生态中,CalyxOS是常被与GrapheneOS比较的另一个选项。两者在SELinux策略上的关键差异在于Google Play服务的处理方式

  • CalyxOS:Google Play服务运行在高度特权的system_app SELinux域中,并使用签名欺骗来伪装成Google Play服务
  • GrapheneOS:通过GmsCompat兼容层在沙箱中运行Google Play服务,没有任何特殊权限

这意味着GrapheneOS的SELinux策略对Google Play服务的限制要严格得多——应用兼容性不是通过“给特权”来实现,而是通过“提供兼容层”来实现。

4.3 安全收益:免疫Copy Fail等漏洞

GrapheneOS的SELinux策略深度集成带来了实实在在的安全收益。2026年4月至5月,Linux内核被披露了三个严重漏洞——Copy Fail、Copy Fail 2和Dirty Frag。GrapheneOS官方确认:

GrapheneOS isn’t vulnerable to the 3 recently disclosed Linux kernel vulnerabilities.

原因在于:

  • AOSP SELinux策略阻止了利用这三个漏洞的所有攻击路径
  • 标准AOSP GKI内核配置已禁用了2/3的漏洞相关功能
  • AOSP不允许应用或大多数基础系统进程使用user namespaces和io_uring等易受攻击的功能

GrapheneOS开发者特别强调:**“AOSP only permits using specific types of sockets throughout the OS.”**这种白名单式的策略是防御的关键。

五、生态工具:支撑SELinux策略移植的工具链

5.1 GmsCompat:兼容层的SELinux策略协调

GmsCompat是GrapheneOS的沙箱化Google Play兼容层,提供大部分兼容性填充(compatibility shims)。在SELinux策略移植中,GmsCompat扮演着关键角色:

  • 它为需要在特权域运行的应用提供兼容路径
  • 其配置更新(如version 170等)经常包含SELinux策略的微调
  • 它允许GrapheneOS在保持严格SELinux策略的同时运行依赖Google Play服务的应用

5.2 AppCompatConfig:应用兼容性配置

AppCompatConfig是另一个重要的生态工具,专门处理应用兼容性配置。在SELinux策略导致应用兼容性问题时,AppCompatConfig可以提供声明式的兼容性调整,避免直接修改核心SELinux策略。

5.3 Auditor:硬件级完整性验证

Auditor应用使用硬件安全特性来验证操作系统的完整性。在移植场景中,Auditor可以验证SELinux策略是否正确加载和执行,确保移植后的设备仍然满足GrapheneOS的安全标准。

5.4 内核更新与SELinux的协同

GrapheneOS定期更新内核到最新的GKI LTS分支。例如,2026年3月的更新将内核更新到6.1.166、6.6.127和6.12.76。这些内核更新与SELinux策略更新协同工作——新的内核版本可能引入新的系统调用或ioctl命令,需要在SELinux策略中显式授权

六、安全风险:移植过程中需要注意的SELinux陷阱

6.1 风险一:调试/生产构建差异

风险描述:如前文所述,SELinux策略问题可能在调试构建中不出现,但在生产构建中触发。

应对策略

  • 在移植的早期阶段就进行生产构建测试
  • 建立调试构建和生产构建的差异化测试流程
  • 不要仅依赖调试构建的测试结果

6.2 风险二:上游AOSP变更的不可预测性

风险描述:上游Android版本的SELinux策略变更是移植中最不可控的因素。Android 16的一个上游变更直接导致了与GrapheneOS兼容方式的冲突。

应对策略

  • 密切跟踪AOSP的SELinux策略变更
  • 建立上游变更的影响分析流程
  • 保持与AOSP社区的沟通,提前了解即将到来的变更

6.3 风险三:设备特定策略的缺失或错误

风险描述:每个设备的硬件有不同的驱动和功能需求,需要对应的SELinux策略。Pixel 10a的Camera TPU策略缺失就是一个例子。

应对策略

  • 为每个支持的设备建立完整的SELinux策略清单
  • 在设备适配过程中系统地识别和补充缺失的策略
  • 使用audit2allow等工具分析SELinux拒绝日志

6.4 风险四:过度放宽策略导致安全降级

风险描述:为了快速解决兼容性问题,移植者可能倾向于过度放宽SELinux策略,从而削弱GrapheneOS的核心安全价值。

应对策略

  • 优先使用动态SELinux标志等精细化方案
  • 任何策略放宽都应有明确的审计和回归计划
  • 遵守GrapheneOS“永不妥协安全”的基本原则

七、未来展望:2026-2027年的SELinux策略移植趋势

7.1 Android 17带来的新挑战

2026年6月16日,Android 17正式发布。GrapheneOS已在发布当天完成移植。Android 17引入了新的安全特性和SELinux策略要求,移植工作需要处理:

  • 新版Android安全公告中的漏洞修复(2026年4月至12月的补丁)
  • 新的硬件支持策略(如Pixel 10系列的新特性)
  • 可能新增的neverallow规则约束

7.2 非Pixel设备的移植前景

摩托罗拉的合作意味着GrapheneOS将首次官方支持非Pixel设备。但这带来了SELinux策略移植的新挑战:

  • 不同厂商的硬件有不同的SELinux策略需求
  • Qualcomm SoC与Google Tensor的SELinux策略差异
  • 需要为每个新设备型号建立和维护设备特定策略

GrapheneOS开发者已明确表示,他们将使用“更精简的版本,接近标准Qualcomm SDK”的供应商策略,这为跨厂商移植提供了方法论基础。

7.3 虚拟化与SELinux的协同

GrapheneOS正在探索利用硬件虚拟化进一步强化安全边界。未来,SELinux策略可能需要与虚拟机隔离机制协同工作,形成多层防御体系。

八、总结:移植GrapheneOS SELinux策略的最佳实践

基于以上分析,总结在GrapheneOS移植过程中调整SELinux策略的核心原则:

原则一:理解双层策略架构

系统策略和供应商策略各有职责,修改时必须同时考虑两者的约束和neverallow规则。

原则二:善用动态SELinux标志

用动态策略替代静态策略放宽,在运行时精确控制权限授予。

原则三:调试与生产构建并重

不要忽视生产构建的测试,SELinux策略问题可能只在生产环境中暴露。

原则四:优先使用兼容层而非放宽策略

通过GmsCompat等兼容层处理应用兼容性问题,而不是直接放宽SELinux策略。

原则五:持续跟踪上游变更

AOSP的SELinux策略变更可能带来意外的兼容性问题,需要提前识别和应对。

原则六:保持安全优先

任何策略调整都不应削弱GrapheneOS的核心安全价值——这是这个操作系统存在的根本理由。

写在最后:GrapheneOS的SELinux策略移植是一项需要深厚技术功底和严谨态度的工作。正如GrapheneOS官方所说:“SELinux基于显式列出所有允许的内容,未列出的都不被允许。”这种“默认拒绝”的哲学,既是安全性的来源,也是移植难度的根源。在强化安全与保持兼容之间找到平衡,需要的不仅是技术能力,更是对安全本质的深刻理解。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐