ב-Android 10 השתנו ההרשאות למזהי מכשירים, כך שכל מזהי המכשירים מוגנים עכשיו באמצעות ההרשאה READ_PRIVILEGED_PHONE_STATE. לפני Android 10, מזהי מכשירים קבועים (IMEI/MEID, IMSI, SIM והמספר הסידורי של ה-Build) היו מוגנים מאחורי הרשאת זמן הריצה 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 ומעניקה הרשאה לאפליקציות שנחתמו על ידי האישורים האלה לבצע קריאות לשיטות מיוחדות. | לספקי סלולר מדור קודם יש מספר גדול של כרטיסי SIM שקיימים כבר הרבה זמן, ואי אפשר לעדכן אותם בקלות. בנוסף, ספקי סלולר שאין להם זכויות ליצירת כרטיסי SIM חדשים (לדוגמה, MVNO שכרטיסי ה-SIM שלהם מונפקים על ידי MNO) לא יכולים להוסיף או לעדכן אישורים בכרטיסי ה-SIM. |
| הוספה לרשימת ההיתרים של יצרן ציוד מקורי (OEM) | יצרני ציוד מקורי (OEM) יכולים להשתמש ב-OP_READ_DEVICE_IDENTIFIER כדי לספק מזהי מכשירים לאפליקציות של ספקים שנכללות ברשימת ההיתרים. |
הפתרון הזה לא מתאים לכל הספקים. |
| קוד הקצאת סוג (TAC) | משתמשים בשיטה
getTypeAllocationCode
שנוספה ב-Android 10 כדי לחשוף את ה-TAC שמחזיר את פרטי היצרן והדגם. |
המידע ב-TAC לא מספיק כדי לזהות מכשיר ספציפי. |
| מערך למספור מספרי הטלפון (MSISDN) | ספקי הסלולר יכולים להשתמש במספר הטלפון (MSISDN), שזמין בקטע TelephonyManager עם קבוצת ההרשאות PHONE, כדי לחפש את מספר ה-IMEI במערכות העורפיות שלהם. |
הדבר דורש השקעה משמעותית מצד הספקים. ספקים שממפים את מפתחות הרשת שלהם באמצעות IMSI צריכים משאבים טכניים משמעותיים כדי לעבור ל-MSISDN. |
כל האפליקציות של ספקי הסלולר יכולות לגשת למזהי המכשירים על ידי עדכון הקובץ CarrierConfig.xml באמצעות גיבוב (hash) של אישור החתימה של האפליקציה של ספק הסלולר. כשהאפליקציה של ספק הסלולר קוראת לשיטה לקריאת מידע מסווג, הפלטפורמה מחפשת התאמה של גיבוב אישור החתימה של האפליקציה (חתימת SHA-1 או SHA-256 של האישור) בקובץ CarrierConfig.xml. אם נמצאת התאמה, המידע המבוקש מוחזר. אם לא נמצאה התאמה, מוחזר חריג אבטחה.
כדי ליישם את הפתרון הזה, ספקי הסלולר צריכים לבצע את השלבים הבאים:
- מעדכנים את
CarrierConfig.xmlעם הגיבוב של אישור החתימה של אפליקציית הספק ושולחים תיקון. - מבקשים מיצרני ציוד מקורי לעדכן את הגרסה שלהם ל-QPR-1 ומעלה (מומלץ) או לתיקוני הפלטפורמה הנדרשים ולתיקון שמכיל את הקובץ המעודכן
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 לכל ממשקי ה-API של TelephonyManager ו-Build.UNKNOWNל-methodBuild#getSerial. - אם האפליקציה מטרגטת ל-Android מגרסה 10 ואילך ולא עומדת באף אחת מהדרישות החדשות, היא מקבלת SecurityException.
אימות ובדיקה
חבילת בדיקות התאימות (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>האם כרטיס ה-SIM של הספק צריך להיות במכשיר כדי לגשת למזהי המכשיר?
ה-CarrierConfig.xml שמשמשת נקבעת לפי כרטיס ה-SIM שמוכנס כרגע. כלומר, אם האפליקציה של ספק X מנסה לקבל הרשאות גישה בזמן שכרטיס ה-SIM של ספק Y מוכנס, המכשיר לא ימצא התאמה לגיבוב ויחזיר חריגת אבטחה.
במכשירים עם כמה כרטיסי SIM, לספק מספר 1 יש הרשאות גישה רק לכרטיס SIM מספר 1, ולהפך.
איך ספקים ממירים את אישור החתימה של אפליקציה לגיבוב (hash)?
כדי להמיר אישורי חתימה לגיבוב לפני שמוסיפים אותם ל-CarrierConfig.xml:
- ממירים את החתימה של אישור החתימה למערך בייטים באמצעות
toByteArray. - משתמשים ב-
MessageDigestכדי להמיר את מערך הבייטים לגיבוב (hash) מסוג byte[]. -
ממירים את ה-hash מ-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>