ההרשאות של 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
. אם תימצא התאמה,
מוחזר מידע. אם לא נמצאה התאמה, חריגת אבטחה היא
הוחזרו.
כדי להטמיע את הפתרון הזה, הספקים חייבים לבצע את השלבים הבאים:
- עדכון הגרסה
CarrierConfig.xml
עם הגיבוב של אישור החתימה של אפליקציית ספק וגם שליחת תיקון. - צריך לבקש מיצרני ה-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
ל-methodBuild#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
, לבצע את הפעולות הבאות:
- המרת החתימה של אישור החתימה למערך בייטים באמצעות
toByteArray
- שימוש ב-
MessageDigest
כדי להמיר את מערך הבייטים לגיבוב סוג בייט[]. -
ממירים את הגיבוב מ-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())); }
אם
certHashes
הוא מערך בגודל2
עם ערך ב-12345
וב-54321
, צריך להוסיף את הערכים הבאים קובץ תצורה של הספק.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>