特権のホワイトリスト登録

特権アプリは、いずれかのシステム イメージ パーティションの 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 ファイルで権限を許可または拒否できるのは、同じパーティション上の特権アプリに対してのみです。たとえば、/vendor パーティション上のアプリが特権をリクエストする場合、そのリクエストは同じ /vendor にある 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 should be
    granted 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 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 whitelist

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

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

ホワイトリストの適用

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