מזהי המכשיר

ההרשאות של Android 10 משתנות כך שכל מזהי המכשירים מוגנים עכשיו באמצעות ההרשאה READ_PRIVILEGED_PHONE_STATE. לפני Android 10, מזהי מכשיר קבועים (IMEI/MEID, IMSI, SIM ו-build טורי) היו מוגנים מאחורי הרשאה מסוג READ_PHONE_STATE בתחילת ההפעלה. ההרשאה READ_PRIVILEGED_PHONE_STATE היא רק מוענק לאפליקציות שנחתמו באמצעות מפתח הפלטפורמה ואפליקציות מערכת בעלות הרשאות.

מידע נוסף על הדרישות החדשות להרשאות ניתן למצוא ב דפי Javadoc בשביל טלפוניה.Java ו-Build.Java.

השינוי הזה ישפיע על ממשקי ה-API הבאים:

  • phoneManager#getDeviceId
  • מנהל הטלפוניה#getImei
  • מנהל הטלפוניה#getMeid
  • טלפוניהמנהל#getSimSeriesNumber
  • טלפוניהמנהל#getSubscriberId
  • Build#getENTER

גישה לאפליקציות ספק ללא הרשאת READ_PRIVILEGED_PHONE_STATE

אפליקציות ספק שנטענו מראש שלא עומדות בדרישות של READ_PRIVILEGED_PHONE_STATE יכולה ליישם אחת מהאפשרויות בטבלה הבאה.

אפשרות תיאור מגבלות
הרשאות ספק ב-UICC פלטפורמת Android טוענת אישורים שמאוחסנים ב-UICC ומעניקים הרשאה לאפליקציות שנחתמו באמצעות האישורים האלה כדי לבצע שיחות שיטות. לספקים מהדור הקודם יש אוכלוסיית SIM גדולה ומבוססת, שלא שניתן לעדכן אותם בקלות. כמו כן, ספקים שאין להם זכויות יוצרים של כרטיסי SIM (לדוגמה, כרטיסי SIM שהונפקו על ידי MNO) לא יכולים להוסיף או לעדכן את האישורים בכרטיסי ה-SIM.
הוספה לרשימת ההיתרים של OEM (יצרן ציוד מקורי) יצרני ציוד מקורי יכולים להשתמש ב-OP_READ_DEVICE_IDENTIFIER כדי לספק את המכשיר מזהים לאפליקציות של הספק שברשימת ההיתרים. הפתרון הזה לא ניתן להתאמה לכל הספקים.
קוד הקצאת סוג (TAC) משתמשים ב getTypeAllocationCode ה-method חדש ב- ב-Android 10, כדי לחשוף את מכשיר הבקרה (TAC) שמחזיר את היצרן והדגם מידע. המידע ב-TAC לא מספיק לזיהוי מכשיר ספציפי.
מערך למספור מספרי הטלפון (MSISDN) ספקי סלולר יכולים להשתמש במספר הטלפון (MSISDN), שזמין בקטע TelephonyManager עם ההרשאה PHONE כדי לחפש את מספר ה-IMEI במערכות הקצה העורפי שלהם. לשם כך נדרשת השקעה משמעותית לחברות התובלה. ספקים שממפים למפתחות הרשת שלהם באמצעות IMSI נדרשים משאבים טכניים כדי לעבור ל-MSISDN.

כל אפליקציות הספק יכולות לגשת למזהי המכשיר באמצעות עדכון קובץ CarrierConfig.xml עם גיבוב (hash) של אישור החתימה של את אפליקציית הספק. כשאפליקציית הספק קוראת לשיטה של קריאת הרשאות מידע, הפלטפורמה מחפשת התאמה לאישור החתימה של האפליקציה. גיבוב (חתימת SHA-1 או SHA-256 של האישור) קובץ CarrierConfig.xml. אם תימצא התאמה, מוחזר מידע. אם לא נמצאה התאמה, חריגת אבטחה היא הוחזרו.

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

  1. עדכון הגרסה CarrierConfig.xml עם הגיבוב של אישור החתימה של אפליקציית ספק וגם שליחת תיקון.
  2. צריך לבקש מיצרני ה-OEM לעדכן את ה-build שלהם עם QPR1+ (מומלץ) או התיקונים הנדרשים לפלטפורמה והתיקון שמכיל עודכן קובץ CarrierConfig.xml משלב 1 שלמעלה.

הטמעה

צריך לעדכן את רשימת ההיתרים של ההרשאות בעלות הרשאות כדי להעניק את הרשאת READ_PRIVILEGED_PHONE_STATE למשתמשים בעלי ההרשאות אפליקציות שנדרשת להן גישה למזהי המכשיר.

מידע נוסף על הוספה לרשימת ההיתרים זמין במאמר הרשאות יצירת רשימת היתרים של הרשאות.

כדי להפעיל את ממשקי ה-API המושפעים, האפליקציה צריכה לעמוד באחד מהתנאים הבאים דרישות:

  • אם האפליקציה היא אפליקציה בעלת הרשאות שנטענה מראש, היא צריכה את הוצהרה הרשאה אחת (READ_PRIVILEGED_PHONE_STATE) ב- AndroidManifest.xml. האפליקציה צריכה גם להוסיף את האפליקציה לרשימת ההיתרים את ההרשאה הזו.
  • לאפליקציות שמועברות דרך Google Play נדרשות הרשאות ספק. מידע נוסף על הענקת הרשאות ספק בספק UICC בדף 'הרשאות'.
  • אפליקציה של בעלי המכשיר או הפרופיל שקיבלה את ההרשאה ההרשאה READ_PHONE_STATE.

אם אפליקציה לא עומדת בדרישות האלה, יש לה: התנהגות:

  • אם האפליקציה מטרגטת לפני Q4 ואין לה את ניתנה הרשאה לREAD_PHONE_STATE, SecurityException מופעלת. זו ההתנהגות הנוכחית לפני Q, כמו ההרשאה הזו נדרש כדי להפעיל את ממשקי ה-API האלה.
  • אם האפליקציה מטרגטת שאלות טרום-Q ויש לה את ניתנה ההרשאה READ_PHONE_STATE, הוא מקבל ערך null בכל ממשקי ה-API של טלפוניה Manager וב-Build.UNKNOWN ל-method Build#getSerial.
  • אם האפליקציה מטרגטת את Android 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

שאלות נפוצות

כמה אפליקציות אפשר להוסיף לרשימת ההיתרים בחשבון מסוים (MCC, MNC) ב-CarrierConfig.xml?

אין הגבלה על מספר הגיבובים של האישורים שכלולים במערך.

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

במכשירים עם כמה כרטיסי SIM, לספק מס' 1 יש הרשאות גישה רק לכרטיס SIM מס' 1. להיפך.

איך ספקים ממירים לגיבוב (hash) את האישור של חתימת האפליקציה?

כדי להמיר אישורי חתימה לגיבוב לפני שמוסיפים אותם אל CarrierConfig.xml, לבצע את הפעולות הבאות:

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

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