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

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

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

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

  • ตัวจัดการโทรศัพท์#รับรหัสอุปกรณ์
  • เครื่องมือจัดการโทรศัพท์#getImei
  • ผู้จัดการระบบโทรศัพท์#getMeid
  • เครื่องมือจัดการโทรศัพท์#getSimSerialNumber
  • ผู้จัดการระบบโทรศัพท์#getSubscriberId
  • บิลด์#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

แอปที่ไม่เป็นไปตามข้อกำหนดเหล่านี้มีสิ่งต่อไปนี้ พฤติกรรม:

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

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

ความเข้ากันได้ 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 สามารถเพิ่มแอปในรายการที่อนุญาตได้กี่รายการสำหรับ 1 โดเมน (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. แปลงแฮชจาก By[] เป็นรูปแบบสตริงฐาน 16 ตัวอย่างเช่น ดู 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>