독점 권한 허용

권한 있는 앱은 시스템 이미지 파티션 중 하나의 priv-app 디렉터리에 위치한 시스템 앱입니다. Android 출시에 사용되는 파티션은 다음과 같습니다.

  • Android 8.1 이하 - /system
  • Android 9 이상 - /system, /product, /vendor

이 페이지에서 /etc/permissions/priv-apppartition/etc/permissions/priv-app로 확인됩니다.

지금까지 기기 제조업체에는 어떤 signature|privileged 권한을 권한 있는 앱에 부여할 수 있는지를 제어하는 권한이 부족했습니다. 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에서 개발한 모든 권한 있는 앱과 관련된 단일 허용 목록을 보유하고 있으며 다음과 같은 구성을 권장합니다.

  • 이미 Android 오픈소스 프로젝트(AOSP)에 포함된 앱의 권한은 /etc/permissions/privapp-permissions-platform.xml에 나열됩니다.
  • Google 앱의 권한은 /etc/permissions/privapp-permissions-google.xml에 나열됩니다.
  • 다른 앱에서는 /etc/permissions/privapp-permissions-DEVICE_NAME.xml 형식의 파일을 사용합니다.

허용 목록 맞춤설정

AOSP에는 필요에 따라 맞춤설정 가능한 허용 목록 구현이 포함되어 있습니다. AOSP에 포함된 앱의 권한은 /etc/permissions/privapp-permissions-platform.xml에서 이미 허용 목록에 있습니다.

거부해야 하는 권한이 있다면 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를 설정하여 런타임 적용을 활성화합니다.