本文档包含 AVF 的常用用例。
隔离编译
作为软件安全飞地,受保护的虚拟机可提供安全的环境来编译安全敏感型代码。此环境允许将 bootclasspath
和系统服务器 JAR 的编译(由 APEX 更新触发)从早期启动移至重启之前,并显著缩短 APEX 更新后的启动时间。
此实现位于 com.android.compos
APEX 中。此组件是可选的,可以使用 makefile 包含。
安全目标是真实地编译经过验证的输入并在隔离环境中生成输出;作为不受信任的客户端,Android 无法以任何方式更改编译输出,除了使其失败(当 Android 回退到启动时间编译时)。
仅当整个编译期间没有错误时,虚拟机中的编译服务才会生成签名。Android 可以从虚拟机检索公钥以进行签名验证。
虚拟机的密钥是从虚拟机的 DICE 配置文件生成的,该配置文件由挂载到虚拟机的 APEX 和 APK 以及其他虚拟机参数(例如可调试性)定义。
为了确定公钥是否并非来自意外虚拟机,Android 会启动虚拟机以确定密钥是否正确。每次 APEX 更新后,虚拟机都会在早期启动时启动。
借助受保护虚拟机经过验证的启动,编译服务仅运行经过验证的代码。因此,代码可以确定仅接受满足特定条件的输入,例如,仅接受名称及其 fs-verity
摘要在允许列表中定义的输入文件。
虚拟机公开的任何 API 都是攻击面。所有输入文件和参数都假定来自不受信任的客户端,并且在处理之前必须经过验证和审查。
输入/输出文件完整性由虚拟机验证,文件存储在 Android 上作为不受信任的文件服务器,如下所示
- 输入文件的内容必须在使用前使用
fs-verity
算法进行验证。为了使输入文件在虚拟机中可用,其根哈希必须在容器 (APK) 中提供,该容器 (APK) 有助于虚拟机的 DICE 配置文件。借助受信任的根哈希,攻击者无法在不被检测到的情况下篡改输入。 - 输出文件的完整性必须在 VM 中保持。即使输出文件存储在 Android 上,在生成过程中,完整性也以相同的
fs-verity
树格式保持,但可以动态更新。最终的输出文件可以通过根哈希来识别,该根哈希在 VM 中是隔离的。VM 中的服务通过签名保护输出文件。