אותות של אפס אמון

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

תכונה תיאור מכשירים מנוהלים באופן מלא פרופיל עבודה במכשירים בבעלות החברה פרופיל עבודה במכשירים בבעלות אישית (BYOD) מכשירים לא מנוהלים
Play Integrity API נאמנות המתווך יכול לאחזר את האותות הבאים:
  • תקינות המכשיר
  • תקינות האפליקציה
  • פרטי הרישיון ב-Play
  • פרטי הסביבה, כולל ההחלטה החדשה של Play Protect
  • כן כן כן כן
    מאובטח הצגת חומרה / אימות עם מפְתח סוכני אמון יכולים לאמת שפרטי הכניסה שלהם ל-PKI נוצרו ונשמרו בחומרה מאובטחת כן כן כן כן
    אימות של מאפייני המכשיר במסגרת האימות עם מפתח, אפשר לכלול את מאפייני המכשיר של רשומת האימות כן כן כן כן
    מכשיר רמת תיקון האבטחה סוכני אמון יכולים לאמת את רמת תיקון האבטחה של מערכת ההפעלה כן כן כן כן
    האם יש למכשיר עדכון OTA בהמתנה סוכני אמון יכולים לבדוק אם יש עדכון זמין למערכת הפעלה של המכשיר כן כן כן לא רלוונטי
    רמת תיקון האבטחה הראשית סוכני אמון יכולים לקרוא את רמת תיקון האבטחה של גרסת הליבה המותקנת כן כן כן כן
    מזהה ספציפי להרשמה סוכני אמון יכולים לגשת למזהה מכשיר ייחודי שספציפי לארגון. המזהה הזה שורד גם ביצירה מחדש של פרופיל העבודה וגם במפעל המכשיר בוצע איפוס כן כן כן לא רלוונטי
    מצב הניהול (וניהול האפליקציה) סוכני אמון יכולים להשתמש בנתונים האלה כדי לקבוע אם מכשיר מנוהל כן כן כן לא רלוונטי
    דיסק הצפנה סוכני Trust יכולים לבדוק אם המכשיר מוצפן (אם נדרשת תמיכה ב-Android 8) כן כן כן כן
    גרסת מערכת ההפעלה ברוקר יכול לבדוק את גרסת מערכת ההפעלה של המכשיר ולוודא שהיא חורגת מגרסת מערכת ההפעלה גרסה מסוימת כן כן כן כן
    גישה למצב הרשת (מצב הרשת ומצב ה-Wi-Fi) סוכני Trust יכולים לקבל מידע על מצב הרשת הפעילה (סלולרית ו-Wi-Fi) כן כן כן כן
    גישה למצב ה-Wi-Fi (ב-Android 11 ומטה, ב-Android 12 ואילך יש תמיכה גם ב-callback וגם בגישה לפי דרישה) סוכני אמון יכולים לקבל מידע על רשת ה-Wi-Fi הפעילה כן כן כן כן
    הגדרות שרת proxy סוכני אמון יכולים לקבל מידע על הגדרות ברירת המחדל הנוכחיות של שרת proxy ל-HTTP. כן כן כן כן
    מסך בדיקת איכות נעילה מתווך מהימנות יכול להבטיח שלמכשיר מוגדרת נעילת מסך באיכות מסוימת הוגדר לפני הענקת גישה כן כן כן כן
    האפשרויות למפתחים מופעלות מתווך מהימנות יכול לזהות מכשיר בעל מתקפה רחבה יותר מוצגות כשאפשרויות למפתחים מופעלות כן כן כן כן
    האם DNS over TLS מופעל בר מהימנות יכול למנף זאת כדי להבטיח ששרת ה-DNS הפרטי המצב מופעל כן כן כן כן
    SafetyNet גלישה בטוחה מתווך מהימנות יכול לקבוע אם כתובת URL מסוימת ש-Google מסווגת כאיום ידוע. כן כן כן כן
    מדיה חיצונית מותקנת אפשר לשלוח התראה לסוכן אמון כשמתבצעת התקנה של אחסון חיצוני כן כן כן כן
    UsageStatsManager מתווך מהימנות יכול לחקור דפוסי שימוש באפליקציות שונות כן כן כן כן1
    אבטחה רישום ביומן ברוקר יכול למנף את הנתונים האלה כחלק כדי להבטיח תאימות וליצור טביעת אצבע שמבוססת על התנהגות כן כן2 כן2 לא רלוונטי
    רישום ביומן של אירועים ברשת סוכני אמון יכולים להשתמש בנתונים האלה כחלק מהמנוע לפי הקשר כדי לוודא תאימות וליצור טביעת אצבע שמבוססת על התנהגות. כן כן2 כן2 לא רלוונטי
    NetworkStatsManager מתווך אמון יכול לשלוח שאילתה לגבי השימוש של האפליקציה ברשת בפרק זמן נתון כן כן כן2 כן1
    חשיפת החבילה (רשימת כל האפליקציות במכשיר) מתווך מהימנות יכול לשלוח שאילתות לגבי האפליקציות שמותקנות במכשיר כן כן3 כן3 כן
    קריאה מצב הטלפון סוכני אמון יכולים לקבל מידע על הרשת הסלולרית, את סטטוס השיחות שמתבצעות כרגע ורשימה של חשבונות הטלפון שרשומים במכשיר כן כן כן כן
    מתי המכשיר הופעל מחדש לאחרונה מתווך מהימנות יכול לקבל את זמן הפעולה התקינה של המערכת כן כן כן כן
    קבלת חשבונות סוכן נאמנות יכול להשתמש באפשרות הזו כדי לגשת לרשימת החשבונות ב- שירות החשבונות כן כן3 כן3 כן1
    מעקב אחר שינויים משמעותיים ברמת הסוללה סוכני אמון יכולים לעקוב אחרי שינויים משמעותיים ברמת הטעינה של הסוללה כן כן כן כן
    מיקום (מפורט, משוער וכו') מתווך מהימנות יכול לגשת למיקום הפיזי של המכשיר כן כן כן1 כן1

    1 בהסכמת המשתמש

    2 פרופיל עבודה בלבד

    3 הגישה מוגבלת לפרטים של פרופיל העבודה

    מתווך מהימנות יכול לגשת ל-PackageInfo של com.google.android.modulemetadata של המודול, ומאחזרים ממנו את versionName:

    private fun mainlineVersion(context: Context): String? {
        val moduleProvider = "com.google.android.modulemetadata"
    
        return try {
                val pm = context.packageManager
                val packageInfo = pm.getPackageInfo(moduleProvider, 0)
                packageInfo.versionName
            } catch (e: PackageManager.NameNotFoundException) {
                null
            }
    }
    

    אפשר לנתח את המחרוזת שמוחזרת לאובייקט Date באמצעות כיתה SimpleDateFormat:

    private val VERSION_NAME_DATE_PATTERNS = Arrays.asList(
          "yyyy-MM-dd",
          "yyyy-MM"
    )
    
    private fun parseDateFromVersionName(text: String): Date? {
        for (pattern in VERSION_NAME_DATE_PATTERNS) {
            try {
                val simpleDateFormat = SimpleDateFormat(
                    pattern,
                    Locale.getDefault()
                )
                simpleDateFormat.timeZone = TimeZone.getDefault()
                return simpleDateFormat.parse(text)
            } catch (e: ParseException) {
                // ignore and try next pattern
            }
        }
        return null
    }
    

    חשוב לזכור שבגרסאות Android 11 ואילך, צריך להוסיף הצהרת שאילתה בקובץ AndroidManifest.xml כדי לעמוד בדרישות של הצגת החבילה ב-Android:

    <manifest package="com.example.game">
        <queries>
            <package android:name="com.google.android.modulemetadata" />
        </queries>
        ...
    </manifest>
    

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

    בדיקה אם יש ניהול מכשירים

    משתמשים ב-getActiveAdmins()‎ כדי לבדוק אם מכשיר כלשהו נמצא בניהול. אם השיטה מחזירה את הערך null, המכשיר לא מנוהל.

    חיפוש מכשיר מנוהל

    אפשר להשתמש ב-isDeviceOwnerApp() כדי לבדוק אם המכשיר מנוהל באופן מלא.

    חיפוש פרופיל עבודה במכשיר בבעלות החברה

    משתמשים ב-isOrganizationOwnedDeviceWithManagedProfile() כדי לבדוק אם מכשיר משתמש במצב ניהול פרופיל עבודה למכשירים בבעלות חברה

    איך בודקים אם יש פרופיל עבודה במכשיר שבבעלותכם

    משתמשים ב-isProfileOwnerApp() כדי לבדוק אם אפליקציה פועלת בפרופיל העבודה, ומוודאים ש-isOrganizationOwnedDeviceWithManagedProfile() מחזיר את הערך false.