독점 권한 허용

권한 있는 앱은 시스템 이미지 파티션 중 하나의 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 파일은 동일한 파티션의 권한 있는 앱에만 권한을 부여하거나 거부할 수 있습니다. 예를 들어 /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에서 개발한 모든 권한 있는 앱과 관련된 단일 허용 목록을 보유하고 있으며 다음과 같은 구성을 권장합니다.

  • 이미 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 스크립트를 실행하여 허용되어야 하는 모든 signature|privileged 권한을 나열하는 privapp-permissions.xml 파일을 생성합니다.
    development/tools/privapp_permissions/privapp_permissions.py
    이 도구는 단일 파일로 사용하거나 /etc/permissions 디렉터리 경로에서 여러 파일로 분할할 수 있는 XML 콘텐츠를 출력합니다. 기기의 /etc/permissions 디렉터리에 이미 허용 목록이 포함되어 있다면 도구는 차이점(예: 허용 목록에 추가해야 하는 누락된 signature|privileged 권한)만 출력합니다. 이는 감사 용도로도 유용합니다. 새 버전의 앱이 추가되면 도구는 필요한 추가 권한을 감지합니다.
  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를 설정하여 런타임 적용을 활성화합니다.