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

แอปที่ได้รับสิทธิ์คือแอประบบที่อยู่ในไดเรกทอรี 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 เดียวหรือในไฟล์ XML หลายไฟล์ที่อยู่ในไดเรกทอรี /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 ก็ตาม

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

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

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