รายการอนุญาตสิทธิ์พิเศษ

แอพที่มีสิทธิพิเศษคือแอพระบบที่อยู่ในไดเร็กทอรี priv-app บนพาร์ติชั่นอิมเมจระบบตัวใดตัวหนึ่ง พาร์ติชั่นที่ใช้สำหรับรุ่น Android คือ

  • Android 8.1 และต่ำกว่า - /system
  • Android 9 ขึ้นไป - /system, /product, /vendor

ตลอดทั้งหน้านี้ /etc/permissions/priv-app แก้ไข partition /etc/permissions/priv-app

ในอดีต ผู้ผลิตอุปกรณ์ควบคุมได้เพียงเล็กน้อยว่าจะให้สิทธิ์ ลายเซ็น|สิทธิ์พิเศษ ใดแก่แอปที่มีสิทธิพิเศษ เริ่มต้นใน Android 8.0 ผู้ผลิตต้องให้สิทธิ์ที่มีสิทธิพิเศษอย่างชัดเจนในไฟล์ XML การกำหนดค่าระบบในไดเร็กทอรี /etc/permissions สำหรับ Android 9 ผู้ปรับใช้ต้องให้สิทธิ์หรือปฏิเสธสิทธิ์ที่มีสิทธิพิเศษทั้งหมดอย่างชัดแจ้ง มิฉะนั้นอุปกรณ์จะไม่สามารถบู๊ตได้

ไฟล์ privapp-permissions.xml สามารถให้หรือปฏิเสธการอนุญาตสำหรับแอพที่มีสิทธิพิเศษในพาร์ติชั่นเดียวกันเท่านั้น ตัวอย่างเช่น หากแอปบนพาร์ติชั่น /product ร้องขอสิทธิ์ที่มีสิทธิพิเศษ คำขอสามารถได้รับหรือปฏิเสธโดยไฟล์ privapp-permissions.xml ที่อยู่ใน /product เท่านั้น

การเพิ่มรายการที่อนุญาต

รายการที่อนุญาตสำหรับแอปสามารถแสดงเป็น XML เดียวหรือในไฟล์ XML หลายไฟล์ที่อยู่ในไดเร็กทอรี frameworks/base/etc/permissions ดังนี้

  • /etc/permissions/privapp-permissions- OEM_NAME .xml
  • /etc/permissions/privapp-permissions- DEVICE_NAME .xml

ไม่มีกฎเกณฑ์ที่เข้มงวดในการจัดระเบียบเนื้อหา ผู้ปรับใช้อุปกรณ์สามารถกำหนดโครงสร้างเนื้อหาได้ตราบใดที่แอปทั้งหมดจาก /system/priv-app ได้รับอนุญาต ตัวอย่างเช่น Google มีรายการที่อนุญาตเพียงรายการเดียวสำหรับแอปที่มีสิทธิพิเศษทั้งหมดที่พัฒนาโดย Google และแนะนำองค์กรต่อไปนี้

  • สิทธิ์สำหรับแอพที่รวมอยู่ในแผนผัง Android Open Source Project (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 เพื่อใช้แท็ก "deny-permission" แทนแท็ก "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