รายการที่อนุญาตสิทธิ์ที่มีอภิสิทธิ์

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

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

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

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

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

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

  • /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 มีการใช้งานรายการที่อนุญาตซึ่งปรับแต่งได้ตามต้องการ

หากต้องปฏิเสธสิทธิ์ ให้แก้ไข 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 9 ขึ้นไป การละเมิดสิทธิ์ที่มีสิทธิ์จะทําให้อุปกรณ์เริ่มทํางานไม่ได้ แต่คุณต้องอนุญาตหรือปฏิเสธสิทธิ์ที่มีสิทธิ์ทั้งหมดอย่างชัดเจน
  • Android 8.0 และต่ำกว่า ระบบจะไม่ให้สิทธิ์ที่ขาดหายไปแก่แอปที่ได้รับผลกระทบ แม้ว่าจะอยู่ในแทร็ก priv-app ก็ตาม

บังคับใช้รายการที่อนุญาต

หลังจากสร้างรายการที่อนุญาตแล้ว ให้เปิดใช้การบังคับใช้รันไทม์โดยตั้งค่าพร็อพเพอร์ตี้ ro.control_privapp_permissions=enforce ของบิลด์

รายการที่อนุญาตมีไว้สำหรับสิทธิ์ที่แอปประกาศด้วย package="android" เท่านั้น สถานะพร็อพเพอร์ตี้ ro.control_privapp_permissions ต้องเป็นไปตามส่วนที่ 9.1 สิทธิ์ในเอกสารคำจำกัดความความเข้ากันได้ (CDD)