Android 10 משנה את ההרשאות עבור מזהי מכשירים כך שכל מזהי המכשירים מוגנים כעת על ידי הרשאת READ_PRIVILEGED_PHONE_STATE
. לפני אנדרואיד 10, מזהי מכשירים קבועים (IMEI/MEID, IMSI, SIM ו-build serial) היו מוגנים מאחורי הרשאת זמן הריצה READ_PHONE_STATE
. ההרשאה READ_PRIVILEGED_PHONE_STATE
ניתנת רק לאפליקציות החתומות עם מפתח הפלטפורמה ואפליקציות מערכת מורשות.
מידע נוסף עבור דרישות ההרשאה החדשות ניתן למצוא בדפי Javadoc עבור TelephonyManager.java ו- Build.java .
שינוי זה משפיע על ממשקי ה-API הבאים:
- TelephonyManager#getDeviceId
- מנהל טלפוניה#getImei
- TelephonyManager#getMeid
- TelephonyManager#getSimSerialNumber
- TelephonyManager#getSubscriberId
- Build#getSerial
גישה לאפליקציות הספק ללא הרשאת READ_PRIVILEGED_PHONE_STATE
אפליקציות ספק נטענות מראש שאינן זכאיות להרשאת READ_PRIVILEGED_PHONE_STATE
יכולות ליישם אחת מהאפשרויות בטבלה למטה.
אוֹפְּצִיָה | תיאור | מגבלות |
---|---|---|
הרשאות ספק UICC | פלטפורמת אנדרואיד טוענת אישורים המאוחסנים ב-UICC ומעניקה הרשאה לאפליקציות החתומות על ידי אישורים אלה לבצע שיחות לשיטות מיוחדות. | לספקים מדור קודם יש אוכלוסיית SIM גדולה ומבוססת, שלא ניתנת לעדכון בקלות. כמו כן, ספקים שאין להם זכויות יצירת סים חדשים (לדוגמה, MVNO שיש להם סים שהונפקו מ-MNO) לא יכולים להוסיף או לעדכן אישורים ב-SIM. |
רישום הרשאות OEM | יצרני ציוד מקורי יכולים להשתמש OP_READ_DEVICE_IDENTIFIER כדי לספק מזהי מכשירים ליישומי ספק הרשומים. | פתרון זה אינו ניתן להרחבה עבור כל הספקים. |
קוד הקצאת סוג (TAC) | השתמש בשיטת getTypeAllocationCode , שהוצגה באנדרואיד 10, כדי לחשוף את ה-TAC שמחזיר את פרטי היצרן והדגם. | המידע ב-TAC אינו מספק לזיהוי מכשיר ספציפי. |
MSISDN | ספקים יכולים להשתמש במספר הטלפון (MSISDN), הזמין תחת TelephonyManager עם קבוצת ההרשאות PHONE , כדי לחפש את ה-IMEI במערכות האחוריות שלהם. | זה דורש השקעה משמעותית עבור המובילים. ספקים הממפים את מפתחות הרשת שלהם באמצעות IMSI דורשים משאבים טכניים משמעותיים כדי לעבור ל- MSISDN . |
כל אפליקציות הספק יכולות לגשת למזהי מכשירים על ידי עדכון קובץ CarrierConfig.xml
עם ה-hash של אישור החתימה של אפליקציית הספק. כאשר אפליקציית הספק קוראת לשיטה לקריאת מידע מיוחס, הפלטפורמה מחפשת התאמה ל-hash של אישור החתימה של האפליקציה (חתימת SHA-1 או SHA-256 של האישור) בקובץ CarrierConfig.xml
. אם נמצא התאמה, המידע המבוקש מוחזר. אם לא נמצא התאמה, מוחזר חריג אבטחה.
כדי ליישם פתרון זה, ספקים חייבים לבצע את השלבים הבאים:
- עדכן את
CarrierConfig.xml
עם ה-hash של אישור החתימה של אפליקציית הספק ושלח תיקון . - בקש מיצרני ציוד מקורי לעדכן את ה-build שלהם עם 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
, היא מקבלת ערך ריק עבור כל ממשקי ה-API של TelephonyManager ו-Build.UNKNOWN
עבור שיטתBuild#getSerial
. - אם האפליקציה מכוונת לאנדרואיד 10 ומעלה ואינה עומדת באף אחת מהדרישות החדשות, היא מקבלת חריגת ביטחון.
אימות ובדיקה
חבילת בדיקת התאימות (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 מוכנס, המכשיר לא ימצא התאמה ל-hash ויחזיר חריג אבטחה.
במכשירי Multi-SIM, לספק מס' 1 יש רק הרשאות גישה ל-SIM מס' 1 ולהיפך.
איך הספקים ממירים את אישור החתימה של אפליקציה ל-hash?
כדי להמיר אישורי חתימה ל-hash לפני הוספתם ל- CarrierConfig.xml
, בצע את הפעולות הבאות:
- המר את החתימה של אישור החתימה למערך בתים באמצעות
toByteArray
. - השתמש
MessageDigest
כדי להמיר את מערך הבתים ל-hash בסוג byte[]. המר את ה-hash מ-byte[] לתבנית מחרוזת 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>