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

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 ซึ่งไม่มีคุณสมบัติสำหรับสิทธิ์ 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 Carrier Privileges
  • แอปเจ้าของอุปกรณ์หรือโปรไฟล์ที่ได้รับสิทธิ์ READ_PHONE_STATE

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

  • หากแอปกำหนดเป้าหมายล่วงหน้าและไม่ได้รับสิทธิ์ READ_PHONE_STATE SecurityException จะทริกเกอร์ SecurityException นี่คือลักษณะการทำงานของ pre-Q ในปัจจุบันเนื่องจากการอนุญาตนี้จำเป็นในการเรียกใช้ API เหล่านี้
  • หากแอปกำหนดเป้าหมายล่วงหน้าและไม่ได้รับสิทธิ์ READ_PHONE_STATE แอปจะได้รับค่าว่างสำหรับ API ของ TelephonyManager และ Build.UNKNOWN สำหรับ 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 ให้เพิ่มสิ่งต่อไปนี้ในไฟล์ config ผู้ให้บริการ

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