독점 권한 허용 목록

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

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

지금까지 기기 제조업체에는 어떤 signature | privileged 권한을 권한 있는 앱에 부여할 수 있는지를 제어하는 권한이 부족했습니다. Android 8.0부터는 제조업체가 /etc/permissions 디렉터리의 시스템 구성 XML 파일에서 독점 권한을 명시적으로 부여할 수 있습니다. Android 9부터는 구현자가 모든 독점 권한을 명시적으로 부여하거나 거부할 수 있습니다. 독점 권한이 부여되지 않으면 기기가 부팅되지 않습니다.

privapp-permissions.xml 파일은 동일한 파티션의 권한 있는 앱에만 권한을 부여하거나 거부할 수 있습니다. 예를 들어 /product 파티션의 앱이 독점 권한을 요청하면 요청은 /productprivapp-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에서는 권한이 있는 모든 앱의 단일 허용 목록을 개발했습니다. 다음 구성이 권장됩니다.

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

허용 목록 맞춤설정

AOSP에는 필요에 따라 맞춤설정 가능한 허용 목록 구현이 포함되어 있습니다.

권한을 거부해야 하는 경우 permission 태그가 아닌 deny-permission 태그를 사용하도록 XML을 수정합니다. 예:

<!-- 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 9 이상에서는 독점 권한을 위반하면 기기가 시작되지 않습니다. 대신 모든 독점 권한을 명시적으로 허용하거나 거부해야 합니다.
  • Android 8.0 이하에서는 priv-app 경로에 있어도 영향을 받는 앱에 누락된 권한이 부여되지 않습니다.

허용 목록 적용

허용 목록을 만든 후에는 빌드 속성 ro.control_privapp_permissions=enforce를 설정하여 런타임 적용을 사용 설정합니다.

허용 목록은 package="android"가 포함된 앱에서 선언한 권한에만 필요합니다. ro.control_privapp_permissions 속성 상태는 호환성 정의 문서(CDD)의 섹션 9.1 권한을 준수해야 합니다.