fs-verity 是一项 Linux 内核功能,可让系统持续通过受信任的数字证书来验证 APK 文件。在平台提供这种访问时验证机制的情况下,有了来自某个受支持商店(例如 Play)的受信任证书,该商店便可以安装具有 fs-verity 签名的 APK 文件来进行持续验证。受 fs-verity 保护的文件是不可变的,并且仅在内容通过验证后读取请求才会成功。
内核支持 fs-verity 后,合作伙伴可以将来自其受信任商店的新型证书存放在产品分区 /product/etc/security/fsverity
内,证书会在启动期间加载到内核密钥环。在支持此功能的设备上,受信任的商店可以安装具有相应 fs-verity 签名的 APK。
实现
搭载 Android R 的设备
fs-verity 是一项从 5.4 版起在上游实现的 Linux 内核功能,并且已向后移植到 Android 通用内核 4.14 及更高版本。如果新设备使用的是通用内核 4.14 或更高版本,并且用户数据分区采用的是 ext4 或 f2fs 格式,那么该设备就不需要采取任何措施,因为其已通过 Linux 内核支持 fs-verity。
升级到 Android R 的设备
fs-verity 补丁程序需要向后移植到设备内核。如果是 ext4,请将 fsverity
添加到 fstab
的 fs_mgr
标记中。然后,您就可以通过以下设置启用该功能:
ro.apk_verity.mode=2
API
我们引入了新的公共 API,用于查询设备的支持状态以及确定某个证书是否为设备信任的证书。
public final class FileIntegrityManager { public boolean isApkVeritySupported(); @RequiresPermission(anyOf={ android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public boolean isAppSourceCertificateTrusted(@NonNull java.security.cert.X509Certificate) throws java.security.cert.CertificateEncodingException; }
验证
请运行以下 VTS、CTS 和 GTS 测试来验证实现。
- [VTS] ApkVerityTest
- [CTS] CtsAppSecurityHostTestCases:android.appsecurity.cts.ApkVerityInstallTest
- [CTS] CtsSecurityHostTestCases#android.security.cts.KernelConfigTest
- [GTS] GtsPlayFsiTestCases & GtsPlayFsiHostTestCases