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 หากพบรายการที่ตรงกัน ระบบจะแสดงข้อมูลที่ขอ หากไม่พบรายการที่ตรงกัน ระบบจะแสดงข้อยกเว้นด้านความปลอดภัย
หากต้องการใช้โซลูชันนี้ ผู้ให้บริการต้องทำตามขั้นตอนต่อไปนี้
- อัปเดต
CarrierConfig.xmlด้วยแฮชใบรับรองการลงนามของ แอปของผู้ให้บริการ และ ส่งแพตช์ - ขอให้ 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.CarrierApiTestcts-tradefed run cts -m CtsTelephonyTestCases -t android.telephony.cts.TelephonyManagerTestcts-tradefed run cts -m CtsTelephony3TestCasescts-tradefed run cts -m CtsPermissionTestCases -t android.permission.cts.TelephonyManagerPermissionTestcts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCanGetDeviceIdentifierscts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCanGetDeviceIdentifierscts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCannotGetDeviceIdentifiersWithoutPermissioncts-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 ให้ทำดังนี้
- แปลงลายเซ็นของใบรับรองการลงนามเป็นอาร์เรย์ไบต์โดยใช้
toByteArray - ใช้
MessageDigestเพื่อแปลงอาร์เรย์ไบต์เป็นแฮชใน ประเภทไบต์[] -
แปลงแฮชจากไบต์[] เป็นรูปแบบสตริงฐานสิบหก ดูตัวอย่างได้ที่
IccUtils.javaList<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())); } หาก
certHashesเป็นอาร์เรย์ขนาด2ที่มีค่า เป็น12345และ54321ให้เพิ่มข้อมูลต่อไปนี้ลงใน ไฟล์กำหนดค่าของผู้ให้บริการ<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>