ตัวระบุอุปกรณ์

Android 10 เปลี่ยนสิทธิ์สำหรับ ตัวระบุอุปกรณ์เพื่อให้ตัวระบุอุปกรณ์ทั้งหมดได้รับการปกป้องโดย สิทธิ์ READ_PRIVILEGED_PHONE_STATE ก่อน Android 10 ตัวระบุอุปกรณ์ถาวร (IMEI/MEID, IMSI, SIM และหมายเลขซีเรียลของบิลด์) ได้รับการปกป้องภายใต้ READ_PHONE_STATE สิทธิ์รันไทม์ READ_PRIVILEGED_PHONE_STATE สิทธิ์จะมอบให้เฉพาะแอปที่ลงนามด้วยคีย์แพลตฟอร์มและแอปของระบบที่มีสิทธิ์เท่านั้น

ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดด้านสิทธิ์ใหม่ได้ใน หน้า Javadoc สำหรับ TelephonyManager.java และ Build.java

การเปลี่ยนแปลงนี้ส่งผลต่อ API ต่อไปนี้

  • TelephonyManager#getDeviceId
  • TelephonyManager#getImei
  • TelephonyManager#getMeid
  • TelephonyManager#getSimSerialNumber
  • TelephonyManager#getSubscriberId
  • Build#getSerial

การเข้าถึงสำหรับแอปของผู้ให้บริการที่ไม่มีสิทธิ์ READ_PRIVILEGED_PHONE_STATE

แอปของผู้ให้บริการเครือข่ายที่โหลดไว้ล่วงหน้าซึ่งไม่มีสิทธิ์รับสิทธิ์ READ_PRIVILEGED_PHONE_STATE สามารถใช้ตัวเลือกใดตัวเลือกหนึ่งในตารางด้านล่าง

ตัวเลือก คำอธิบาย ข้อจำกัด
สิทธิ์ของผู้ให้บริการ UICC แพลตฟอร์ม Android จะโหลดใบรับรองที่จัดเก็บไว้ใน UICC และให้ สิทธิ์แก่แอปที่ลงนามด้วยใบรับรองเหล่านี้เพื่อโทรไปยังเมธอดพิเศษ ผู้ให้บริการรุ่นเดิมมีซิมจำนวนมากที่ใช้งานอยู่แล้ว ซึ่งอัปเดตได้ยาก นอกจากนี้ ผู้ให้บริการที่ไม่มีสิทธิ์ในการสร้างซิมใหม่ (เช่น MVNO ที่มีซิมซึ่งออกโดย MNO) จะเพิ่มหรือ อัปเดตใบรับรองในซิมไม่ได้
การอนุญาต OEM OEM สามารถใช้ OP_READ_DEVICE_IDENTIFIER เพื่อระบุตัวระบุอุปกรณ์ เพื่ออนุญาตแอปของผู้ให้บริการในรายการได้ โซลูชันนี้ปรับขนาดสำหรับผู้ให้บริการบางรายไม่ได้
รหัสการจัดสรรประเภท (TAC) ใช้เมธอด getTypeAllocationCode ซึ่งเปิดตัวใน Android 10 เพื่อแสดง TAC ที่ส่งคืนข้อมูลผู้ผลิตและรุ่น ข้อมูลใน TAC ไม่เพียงพอที่จะระบุอุปกรณ์ที่เฉพาะเจาะจง
MSISDN ผู้ให้บริการสามารถใช้หมายเลขโทรศัพท์ (MSISDN) ที่อยู่ใน TelephonyManager โดยมีสิทธิ์เข้าถึงPHONE กลุ่มเพื่อค้นหา IMEI ในระบบแบ็กเอนด์ ซึ่งต้องมีการลงทุนจำนวนมากสำหรับผู้ให้บริการ ผู้ให้บริการที่แมป คีย์เครือข่ายโดยใช้ IMSI ต้องใช้ ทรัพยากรด้านเทคนิคจำนวนมากเพื่อเปลี่ยนไปใช้ MSISDN

แอปของผู้ให้บริการทั้งหมดจะเข้าถึงตัวระบุอุปกรณ์ได้โดยการอัปเดตไฟล์ CarrierConfig.xml ด้วยแฮชใบรับรองการลงนามของแอปของผู้ให้บริการ เมื่อแอปของผู้ให้บริการเรียกใช้เมธอดเพื่ออ่านข้อมูลที่มีสิทธิ์ระดับสูง แพลตฟอร์มจะค้นหาแฮชใบรับรองการลงนามของแอป (ลายเซ็น SHA-1 หรือ SHA-256 ของใบรับรอง) ที่ตรงกันในไฟล์ CarrierConfig.xml หากพบรายการที่ตรงกัน ระบบจะแสดงข้อมูลที่ขอ หากไม่พบรายการที่ตรงกัน ระบบจะแสดงข้อยกเว้นด้านความปลอดภัย

หากต้องการใช้โซลูชันนี้ ผู้ให้บริการต้องทำตามขั้นตอนต่อไปนี้

  1. อัปเดต CarrierConfig.xml ด้วยแฮชใบรับรองการลงนามของ แอปของผู้ให้บริการ และ ส่งแพตช์
  2. ขอให้ OEM อัปเดตบิลด์ด้วย QPR1+ (แนะนำ) หรือแพตช์แพลตฟอร์มที่จำเป็นเหล่านี้และแพตช์ที่มี ไฟล์ CarrierConfig.xml ที่อัปเดตจากขั้นตอนที่ 1 ด้านบน

การใช้งาน

อัปเดตรายการที่อนุญาตสำหรับสิทธิ์ที่มีสิทธิ์เพื่อมอบสิทธิ์ READ_PRIVILEGED_PHONE_STATE ให้กับแอปที่มีสิทธิ์เหล่านั้นซึ่งต้องเข้าถึงตัวระบุอุปกรณ์

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มในรายการที่อนุญาตได้ที่การเพิ่มสิทธิ์ ที่มีสิทธิ์ในรายการที่อนุญาต

หากต้องการเรียกใช้ API ที่ได้รับผลกระทบ แอปต้องมีคุณสมบัติตรงตามข้อกำหนดข้อใดข้อหนึ่งต่อไปนี้

  • หากแอปเป็นแอปที่มีสิทธิ์ที่โหลดไว้ล่วงหน้า แอปจะต้องมี READ_PRIVILEGED_PHONE_STATE สิทธิ์ที่ประกาศไว้ใน AndroidManifest.xml นอกจากนี้ แอปยังต้องอยู่ในรายการที่อนุญาต สำหรับสิทธิ์ที่มีสิทธิ์พิเศษนี้ด้วย
  • แอปที่นำส่งผ่าน Google Play ต้องมีสิทธิ์ของผู้ให้บริการ ดูข้อมูลเพิ่มเติมเกี่ยวกับการให้สิทธิ์ของผู้ให้บริการในหน้าสิทธิ์ของผู้ให้บริการ UICC
  • แอปเจ้าของอุปกรณ์หรือโปรไฟล์ที่ได้รับ READ_PHONE_STATE สิทธิ์

แอปที่ไม่เป็นไปตามข้อกำหนดเหล่านี้จะมีลักษณะการทำงานดังนี้

  • หากแอปกำหนดเป้าหมายเป็น Android เวอร์ชันก่อน Q และไม่มี READ_PHONE_STATE สิทธิ์ที่ได้รับ SecurityException ระบบจะทริกเกอร์ ซึ่งเป็นลักษณะการทำงานปัจจุบันของ Android เวอร์ชันก่อน Q เนื่องจากต้องมีสิทธิ์นี้ จึงจะเรียกใช้ API เหล่านี้ได้
  • หากแอปกำหนดเป้าหมายเป็น Android เวอร์ชันก่อน Q และมี READ_PHONE_STATE ที่ได้รับอนุญาต แอปจะได้รับค่า null สำหรับ API ทั้งหมดของ TelephonyManager และ Build.UNKNOWN สำหรับเมธอด Build#getSerial
  • หากแอปกำหนดเป้าหมายเป็น Android 10 ขึ้นไปและ ไม่เป็นไปตามข้อกำหนดใหม่ข้อใดข้อหนึ่ง แอปจะได้รับ SecurityException

การตรวจสอบและการทดสอบ

Compatibility Test Suite (CTS) มีการทดสอบเพื่อยืนยันลักษณะการเข้าถึงตัวระบุอุปกรณ์ที่คาดไว้ สำหรับแอปที่มีสิทธิ์ของผู้ให้บริการ เจ้าของอุปกรณ์และ โปรไฟล์ รวมถึงแอปที่คาดว่าจะไม่มีสิทธิ์เข้าถึงตัวระบุอุปกรณ์

การทดสอบ CTS ต่อไปนี้เกี่ยวข้องกับฟีเจอร์นี้โดยเฉพาะ

cts-tradefed run cts -m CtsCarrierApiTestCases -t
    android.carrierapi.cts.CarrierApiTest

cts-tradefed run cts -m CtsTelephonyTestCases -t
    android.telephony.cts.TelephonyManagerTest

cts-tradefed run cts -m CtsTelephony3TestCases

cts-tradefed run cts -m CtsPermissionTestCases -t
    android.permission.cts.TelephonyManagerPermissionTest

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCannotGetDeviceIdentifiersWithoutPermission

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCannotGetDeviceIdentifiersWithoutPermission

คำถามที่พบบ่อย

สามารถเพิ่มแอปในรายการที่อนุญาตใน CarrierConfig.xml สำหรับ (MCC, MNC) ที่กำหนดได้กี่แอป

โดยจะไม่จำกัดจำนวนแฮชใบรับรองที่รวมอยู่ในอาร์เรย์

ฉันต้องใช้พารามิเตอร์ CarrierConfig ใดใน CarrierConfig.xml เพื่อให้แอปได้รับอนุญาตในรายการ

ใช้รายการการกำหนดค่าระดับบนสุดต่อไปนี้ภายในCarrierConfig.xmlที่เฉพาะเจาะจงจากตัวเลือก AOSP ที่คุณกำหนดค่า

<string-array name="carrier_certificate_string_array" num="2">
    <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
    <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>

มีเทมเพลต CarrierConfig พื้นฐานที่ฉันใช้ได้ไหม

ใช้เทมเพลตต่อไปนี้ ควรเพิ่มข้อความนี้ใน ชิ้นงานที่เกี่ยวข้อง

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<carrier_config>
    <string-array name="carrier_certificate_string_array"
num="1">
        <item value="CERTIFICATE_HASH_HERE"/>
    </string-array>
</carrier_config>

ต้องใส่ซิมของผู้ให้บริการในอุปกรณ์เพื่อเข้าถึงตัวระบุอุปกรณ์ไหม

โดย CarrierConfig.xml ที่ใช้จะพิจารณาจาก ซิมที่ใส่อยู่ ซึ่งหมายความว่าหากแอปของผู้ให้บริการ X พยายาม รับสิทธิ์เข้าถึงขณะที่ใส่ซิมของผู้ให้บริการ Y อุปกรณ์จะไม่พบ แฮชที่ตรงกันและจะแสดงข้อยกเว้นด้านความปลอดภัย

ในอุปกรณ์แบบหลายซิม ผู้ให้บริการ #1 จะมีสิทธิ์เข้าถึงเฉพาะซิม #1 และ ในทางกลับกัน

ผู้ให้บริการแปลงใบรับรองการลงนามของแอปเป็นแฮชได้อย่างไร

หากต้องการแปลงใบรับรองการลงนามเป็นแฮชก่อนที่จะเพิ่มลงใน CarrierConfig.xml ให้ทำดังนี้

  1. แปลงลายเซ็นของใบรับรองการลงนามเป็นอาร์เรย์ไบต์โดยใช้ toByteArray
  2. ใช้ MessageDigest เพื่อแปลงอาร์เรย์ไบต์เป็นแฮชใน ประเภทไบต์[]
  3. แปลงแฮชจากไบต์[] เป็นรูปแบบสตริงฐานสิบหก ดูตัวอย่างได้ที่ IccUtils.java

    List<String> certHashes = new ArrayList<>();
    PackageInfo pInfo; // Carrier app PackageInfo
    MessageDigest md =
    MessageDigest.getInstance("SHA-256");
    for (Signature signature : pInfo.signatures) {
        certHashes.add(bytesToHexString(md.digest(signature.toByteArray()));
    }
  4. หาก certHashes เป็นอาร์เรย์ขนาด 2 ที่มีค่า เป็น 12345 และ 54321 ให้เพิ่มข้อมูลต่อไปนี้ลงใน ไฟล์กำหนดค่าของผู้ให้บริการ

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>