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

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
  • สร้าง#getSerial

เข้าถึงแอปของผู้ให้บริการโดยไม่ได้รับอนุญาตจาก READ_PRIVILEGED_PHONE_STATE

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

ตัวเลือก คำอธิบาย ข้อจำกัด
สิทธิพิเศษของผู้ให้บริการ UICC แพลตฟอร์ม Android โหลดใบรับรองที่จัดเก็บไว้ใน UICC และให้สิทธิ์แก่แอปที่ลงนามโดยใบรับรองเหล่านี้เพื่อเรียกใช้วิธีการพิเศษ ผู้ให้บริการเดิมมีจำนวน SIM จำนวนมากและมั่นคง ซึ่งไม่สามารถอัปเดตได้ง่ายๆ นอกจากนี้ ผู้ให้บริการที่ไม่มีสิทธิ์สร้างซิมใหม่ (เช่น 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 Carrier Privileges
  • แอปเจ้าของอุปกรณ์หรือโปรไฟล์ที่ได้รับสิทธิ์ READ_PHONE_STATE

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

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

การตรวจสอบความถูกต้องและการทดสอบ

ชุดทดสอบความเข้ากันได้ (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 ที่ใช้จะพิจารณาจาก SIM ที่ใส่อยู่ในปัจจุบัน ซึ่งหมายความว่าหากแอปของผู้ให้บริการ X พยายามรับสิทธิ์การเข้าถึงในขณะที่ใส่ซิมของผู้ให้บริการ Y อุปกรณ์จะไม่พบแฮชที่ตรงกันและส่งกลับข้อยกเว้นด้านความปลอดภัย

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

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

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

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