권한 있는 앱은 시스템 이미지 파티션 중 하나의 priv-app
디렉터리에 위치한 시스템 앱입니다. Android 출시에 사용되는 파티션은 다음과 같습니다.
- Android 8.1 이하 -
/system
- Android 9 이상 -
/system, /product, /vendor
이 페이지에서 /etc/permissions/priv-app
은 partition/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
를 설정하여 런타임 적용을 활성화합니다.