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
ไฟล์ หากพบรายการที่ตรงกัน ระบบจะส่งคำขอ
กลับมา หากไม่พบรายการที่ตรงกัน ข้อยกเว้นด้านความปลอดภัยจะเป็น
ส่งคืนแล้ว
ในการนำโซลูชันนี้ไปใช้ ผู้ให้บริการต้องทำตามขั้นตอนต่อไปนี้
- อัปเดต
CarrierConfig.xml
พร้อมแฮชใบรับรองที่ลงนามของ แอปของผู้ให้บริการและ ส่งแพตช์ - ขอให้ 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
ให้ทำตามขั้นตอนต่อไปนี้
- แปลงลายเซ็นของใบรับรองที่ลงชื่อเป็นไบต์อาร์เรย์โดยใช้
toByteArray
- ใช้
MessageDigest
เพื่อแปลงอาร์เรย์ไบต์เป็นแฮชใน ไบต์[] -
แปลงแฮชจาก 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())); }
หาก
certHashes
เป็นอาร์เรย์ของขนาด2
พร้อมด้วยค่า ของ12345
และ54321
ให้เพิ่มข้อมูลต่อไปนี้ลงใน ไฟล์การกำหนดค่าผู้ให้บริการ<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>