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