מזהי מכשיר

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

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

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

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

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