fs-verity の統合

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 の場合は、fsverityfstabfs_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