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