fs-verity は、信頼できるデジタル証明書を持つ APK ファイルをシステムが継続して確認できるようにするための Linux カーネル機能です。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 を userdata パーティションに使用している新しいデバイスは、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