מזהים מכשירים

אנדרואיד 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 . אם נמצא התאמה, המידע המבוקש מוחזר. אם לא נמצא התאמה, מוחזר חריג אבטחה.

כדי ליישם פתרון זה, ספקים חייבים לבצע את הצעדים הבאים:

  1. עדכן את CarrierConfig.xml עם חשיש אישורי החתימה של אפליקציית הספק ושלח תיקון .
  2. בקש יצרני יצרנים לעדכן את בנייתם ​​עם 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 , בצע את הפעולות הבאות:

  1. המר את חתימת תעודת החתימה למערך בתים באמצעות toByteArray .
  2. השתמש ב- MessageDigest כדי להמיר את מערך הבתים ל- hash בסוג [].
  3. המירו את החשיש מבית [] לפורמט מחרוזת 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()));
    }
    
  4. אם certHashes הוא מערך בגודל 2 עם ערך של 12345 ו- 54321 , הוסף את הדברים הבאים לקובץ התצורה של הספק.

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>