特権を許可リストに登録する

特権アプリは、いずれかのシステム イメージ パーティションの priv-app ディレクトリにあるシステムアプリです。Android リリースで使用されるパーティションは次のとおりです。

  • Android 8.1 以前 - /system
  • Android 9 以降 - /system, /product, /vendor

このページ全体を通して、/etc/permissions/priv-apppartition/etc/permissions/priv-app に解決されます。

これまでデバイス メーカーは、特権アプリにどの署名 / 特権の権限を付与するかをほとんど制御できませんでした。Android 8.0 以降、メーカーは /etc/permissions ディレクトリのシステム構成 XML ファイルで、明示的に特権を付与する必要があります。Android 9 以降、実装者はすべての特権を明示的に許可または拒否する必要があります。そうしないとデバイスが起動しません。

privapp-permissions.xml ファイルで権限を許可または拒否できるのは、同じパーティション上の特権アプリに対してのみです。たとえば、/product パーティション上のアプリが特権をリクエストする場合、そのリクエストは同じ /product にある privapp-permissions.xml ファイルによってのみ、許可または拒否できます。

許可リストを追加する

アプリの権限許可リストは、次のように frameworks/base/etc/permissions ディレクトリにある単一の XML ファイルまたは複数の XML ファイルにリストできます。

  • /etc/permissions/privapp-permissions-OEM_NAME.xml
  • /etc/permissions/privapp-permissions-DEVICE_NAME.xml

コンテンツの整理について厳格なルールはありません。/system/priv-app のアプリがすべて許可リストに登録されている限り、デバイス実装者はコンテンツ構造を決定できます。たとえば Google には、Google が開発したすべての特権アプリの許可リストが 1 つあり、次のように整理することをおすすめしています。

  • すでに Android オープンソース プロジェクト(AOSP)ツリーに含まれているアプリの権限は、/etc/permissions/privapp-permissions-platform.xml にリストする。
  • Google アプリの権限は、/etc/permissions/privapp-permissions-google.xml にリストする。
  • 他のアプリの場合は、/etc/permissions/privapp-permissions-DEVICE_NAME.xml の形式のファイルを使用する。

許可リストを生成する

システム イメージで使用可能なすべてのアプリの許可リストを自動的に生成するには、development/tools/privapp_permissions/privapp_permissions.py の AOSP コマンドライン ツールを使用します。デバイス固有の privapp-permissions.xml の初期バージョンを生成する手順は次のとおりです。

  1. システム イメージをビルドします。
        . build/envsetup.sh
        lunch PRODUCT_NAME
        make -j
  2. privapp_permissions.py スクリプトを実行して privapp-permissions.xml ファイルを生成します。このファイルには、許可リストに登録する必要があるすべての署名 / 特権の権限がリストされます。
    development/tools/privapp_permissions/privapp_permissions.py
    このツールは、単一のファイルとして使用できる、または /etc/permissions ディレクトリ パスの複数のファイルに分割できる、XML コンテンツを出力します。デバイスに /etc/permissions ディレクトリの許可リストがすでに含まれている場合、ツールは差分のみを出力します(許可リストに追加する必要があるもののうち、不足している署名 / 特権の権限など)。これは監査の観点からも有用です。新しいバージョンのアプリが追加されると、ツールは必要な追加の権限を検出します。
  3. 生成されたファイルを適切な /etc/permissions ディレクトリにコピーします。このディレクトリでは、システムが起動時にファイルを読み取ります。

許可リストをカスタマイズする

AOSP には、必要に応じてカスタマイズできる許可リスト実装が用意されています。 AOSP に備えられたアプリの権限は、すでに /etc/permissions/privapp-permissions-platform.xml で許可リストに登録されています。

デフォルトでは、privapp_permissions.py スクリプトは特権アプリがリクエストした権限を自動的に付与する出力を生成します。拒否すべき権限がある場合は、XML を編集して「permission」タグではなく「deny-permission」タグを使用するようにします。例:

<!-- This XML file declares which signature|privileged permissions to grant to
privileged apps that come with the platform -->

    <permissions>
    <privapp-permissions package="com.android.backupconfirm">
    <permission name="android.permission.BACKUP"/>
    <permission name="android.permission.CRYPT_KEEPER"/>
    </privapp-permissions>

    <privapp-permissions package="com.android.cellbroadcastreceiver">

    <!-- Don't allow the application to interact across users -->

    <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/>
    <permission name="android.permission.MANAGE_USERS"/>
    <permission name="android.permission.MODIFY_PHONE_STATE"/>
    <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
    <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
    </privapp-permissions>
    ...

不足している権限を特定する

新しいデバイスを起動するときに不足している権限を特定するには、移行ログモードを有効にします。

ro.control_privapp_permissions=log

違反はログファイルに記録されますが、特権以外の権限は引き続き付与されます。 これにより、デバイスの動作状態を維持しながら、違反のリストが提供されます。エラー メッセージの形式は次のとおりです。

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist

不足している権限を適切な許可リストに追加することで、すべての違反に対処する必要があります。

  • Android 8.0 以前では、影響を受けるアプリが priv-app パスにある場合でも、不足している権限は付与されません。
  • Android 9 以降では、(特権の)違反は、デバイスが起動しないことを意味します。すべての特権を明示的に許可または拒否する必要があります。

許可リストを適用する

許可リストを設定したら、ビルド プロパティ ro.control_privapp_permissions=enforce を設定してランタイムの適用を有効にします。