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

แอพที่ได้รับสิทธิ์คือแอพระบบที่อยู่ในไดเร็กทอรี 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 หลายไฟล์ที่อยู่ในไดเรกทอรี frameworks/base/etc/permissions :

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

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

  • สิทธิ์สำหรับแอปที่รวมอยู่ในแผนผัง Android Open Source Project (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)