אימות מפתחות מאפשר לכם להיות בטוחים יותר שהמפתחות שבהם אתם משתמשים באפליקציה מאוחסנים במאגר המפתחות המאובטח בחומרה של המכשיר. בקטעים הבאים מוסבר איך לאמת את המאפיינים של מפתחות שמגובים בחומרה, ואיך לפרש את נתוני התוספים של אישורי האימות.
הערה: לפני שתאמתו את המאפיינים של המפתחות המגובים בחומרה של מכשיר בסביבת ייצור, עליכם לוודא שהמכשיר תומך באימות מפתחות ברמת החומרה. כדי לעשות זאת, צריך לוודא ששרשור אישורי האימות מכיל אישור בסיס שנחתם באמצעות מפתח הבסיס של אימות Google, ושהרכיב attestationSecurityLevel
במבנה הנתונים של תיאור המפתח מוגדר לרמת האבטחה TrustedEnvironment
או לרמת האבטחה StrongBox
.
בנוסף, חשוב לאמת את החתימות בשרשרת האישורים ולוודא שאף אחד מהמפתחות בשרשרת לא בוטל, על ידי בדיקה של רשימת הסטטוסים של ביטול אישורים. אם לא כל המפתחות תקינים והמפתח ברמה הבסיסית הוא מפתח הבסיס של Google, אל תסמכו על האימות במלואו. עם זאת, חשוב לשים לב שמכשירים שמכילים אישורים שבוטלו עדיין מהימנים לפחות כמו מכשירים שתומכים רק באימות באמצעות תוכנה. אם האימות תקף לחלוטין, זהו אינדיקטור חיובי חזק. היעדר קוד כזה הוא אינדיקטור ניטרלי, ולא שלילי.
אחזור ואימות של צמד מפתחות מגובה בחומרה
במהלך אימות המפתח, מציינים את הכינוי של זוג מפתחות ומאחזרים את שרשרת האישורים שלו, שבאמצעותה אפשר לאמת את המאפיינים של זוג המפתחות.
אם המכשיר תומך באימות מפתחות ברמת החומרה, אישור הבסיס בשרשרת הזו נחתם באמצעות מפתח אימות ברמה הבסיסית שמוקצה בצורה מאובטחת למאגר המפתחות המבוסס על חומרה של המכשיר.
הערה: במכשירים שכוללים אימות מפתחות ברמת החומרה, Android 7.0 (רמת API 24) ואילך ו-Google Play Services, האימות של אישור הבסיס מתבצע באמצעות מפתח הבסיס של Google לאימות. מוודאים שאישור הבסיס הזה נכלל ברשימה שמופיעה בקטע אישורי בסיס.
כדי להטמיע אימות באמצעות מפתח, מבצעים את השלבים הבאים:
-
משתמשים בשיטה
getCertificateChain()
של אובייקטKeyStore
כדי לקבל הפניה לשרשרת של אישורי X.509 שמשויכים למאגר המפתחות המאובטח בחומרה. -
שולחים את האישורים לשרת נפרד שאתם סומכים עליו לצורך אימות.
זהירות: אל תשלימו את תהליך האימות הבא באותו מכשיר שבו נמצא KeyStore. אם מערכת Android במכשיר נפגעה, ייתכן שתהליך האימות ייתן אמון במשהו לא מהימן.
-
מקבלים הפניה לספרייה המתאימה ביותר לניתוח ולתיקוף של שרשרת אישורי X.509, בהתאם לערכת הכלים שלכם. מוודאים שהאישור הציבורי ברמה הבסיסית (root) מהימן ושכל אישור חותם על האישור הבא בשרשרת.
-
בודקים את סטטוס הביטול של כל אישור כדי לוודא שאף אחד מהאישורים לא בוטל.
-
אפשר גם לבדוק את תוסף האישור של פרטי ההקצאה שקיים רק בשרשראות אישור חדשות יותר.
מקבלים הפניה לספריית הניתוח של CBOR שמתאימה ביותר לערכת הכלים שלכם. מחפשים את האישור הקרוב ביותר ל-root שמכיל את התוסף של אישור פרטי ההקצאה. משתמשים בניתוח כדי לחלץ מהאישור את נתוני התוסף של אישור פרטי ההקצאה.
פרטים נוספים זמינים בקטע סכימת הנתונים של התוסף של פרטי ההקצאה.
-
מקבלים הפניה לספריית הניתוח של ASN.1 שמתאימה ביותר לערכת הכלים שלכם. מאתרים את האישור הקרוב ביותר לרמה הבסיסית (root) שמכיל את התוסף לאישור אימות (attestation) של מפתח. אם התוסף של אישור פרטי ההקצאה היה נוכח, התוסף של אישור האימות של המפתח חייב להיות באישור הבא. אפשר להשתמש במנתח כדי לחלץ את נתוני תוסף אישור האימות של המפתח מהאישור הזה.
זהירות: אל תניחו שתוסף האישור של אימות המפתח נמצא באישור העלה של השרשרת. אפשר להסתמך רק על המופע הראשון של התוסף בשרשרת. מופעים נוספים של התוסף לא הונפקו על ידי החומרה המאובטחת, ויכול להיות שהם הונפקו על ידי תוקף שמרחיב את השרשרת בזמן שניסה ליצור אימותים מזויפים למפתחות לא מהימנים.
בדוגמה לאימות מפתחות נעשה שימוש בניתוח ASN.1 מ-Bouncy Castle כדי לחלץ את נתוני התוסף של אישור האימות. אפשר להשתמש בדוגמה הזו כמקור מידע ליצירת מנתח משלכם.
פרטים נוספים זמינים בקטע סכימה של נתוני התוסף לאימות מפתחות.
-
בודקים את נתוני התוסף שאתם אוספים בשלבים הקודמים כדי לוודא שהם עקביים, ומשווים אותם לקבוצת הערכים שאתם מצפים שהמפתח המאובטח בחומרה יכיל.
אישורי בסיס
מהימנות האימות תלויה באישור הבסיס של השרשרת. במכשירי Android שעברו את הבדיקות הנדרשות כדי להתקין את חבילת האפליקציות של Google, כולל Google Play, ושהושקו עם Android 7.0 (רמת API 24) ואילך, צריך להשתמש במפתחות אימות (attestation) שחתמו עליהם על ידי אישור Root של אימות החומרה של Google. שימו לב שהאימות לא היה נדרש עד Android 8.0 (רמת API 26). המפתח הציבורי ברמה הבסיסית הוא:
-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xU FmOr75gvMsd/dTEDDJdSSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5j lRfdnJLmN0pTy/4lj4/7tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y //0rb+T+W8a9nsNL/ggjnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73X pXyTqRxB/M0n1n/W9nGqC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYI mQQcHtGl/m00QLVWutHQoVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB +TxywElgS70vE0XmLD+OJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7q uvmag8jfPioyKvxnK/EgsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgp Zrt3i5MIlCaY504LzSRiigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7 gLiMm0jhO2B6tUXHI/+MRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82 ixPvZtXQpUpuL12ab+9EaDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+ NpUFgNPN9PvQi8WEg5UmAGMCAwEAAQ== -----END PUBLIC KEY-----
אישורי Root שהונפקו בעבר
-----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIJAOj6GWMU0voYMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTYwNTI2MTYyODUyWhcNMjYwNTI0MTYy ODUyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaOBpjCBozAdBgNVHQ4EFgQUNmHhAHyIBQlRi0RsR/8aTMnqTxIwHwYD VR0jBBgwFoAUNmHhAHyIBQlRi0RsR/8aTMnqTxIwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cHM6Ly9hbmRyb2lk Lmdvb2dsZWFwaXMuY29tL2F0dGVzdGF0aW9uL2NybC8wDQYJKoZIhvcNAQELBQAD ggIBACDIw41L3KlXG0aMiS//cqrG+EShHUGo8HNsw30W1kJtjn6UBwRM6jnmiwfB Pb8VA91chb2vssAtX2zbTvqBJ9+LBPGCdw/E53Rbf86qhxKaiAHOjpvAy5Y3m00m qC0w/Zwvju1twb4vhLaJ5NkUJYsUS7rmJKHHBnETLi8GFqiEsqTWpG/6ibYCv7rY DBJDcR9W62BW9jfIoBQcxUCUJouMPH25lLNcDc1ssqvC2v7iUgI9LeoM1sNovqPm QUiG9rHli1vXxzCyaMTjwftkJLkf6724DFhuKug2jITV0QkXvaJWF4nUaHOTNA4u JU9WDvZLI1j83A+/xnAJUucIv/zGJ1AMH2boHqF8CY16LpsYgBt6tKxxWH00XcyD CdW2KlBCeqbQPcsFmWyWugxdcekhYsAWyoSf818NUsZdBWBaR/OukXrNLfkQ79Iy ZohZbvabO/X+MVT3rriAoKc8oE2Uws6DF+60PV7/WIPjNvXySdqspImSN78mflxD qwLqRBYkA3I75qppLGG9rp7UCdRjxMl8ZDBld+7yvHVgt1cVzJx9xnyGCC23Uaic MDSXYrB4I4WHXPGjxhZuCuPBLTdOLU8YRvMYdEvYebWHMpvwGCF6bAx3JBpIeOQ1 wDB5y0USicV3YgYGmi+NZfhA4URSh77Yd6uuJOJENRaNVTzk -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- MIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz NzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu XKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U h6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno L/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok QBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA D32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI mMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW Fua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91 oeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o jm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH ex0SdDrx+tWUDqG8At2JHA== -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- MIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx MDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG zWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan 63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T QH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ erGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL Zez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a 0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH 7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b HQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w lZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2 Ob3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7 mD/vFDkzF+wm7cyWpQpCVQ== -----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- MIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw NzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7 tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7 174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC W/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G tkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx oSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG 1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF mr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz lHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw n6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu zbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo vaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn w1IdYIg2Wxg7yHcQZemFQg== -----END CERTIFICATE-----
אם אישור הבסיס בשרשרת האימות שקיבלת מכיל את המפתח הציבורי הזה ואף אחד מהאישורים בשרשרת לא בוטל, אתם יודעים:
- המפתח שלכם נמצא בחומרה ש-Google סבורה שהיא מאובטחת.
- הוא כולל את המאפיינים שמפורטים באישור האימות.
אם יש בשרשרת האימות מפתח ציבורי אחר ברמה הבסיסית, Google לא נותנת הצהרות לגבי האבטחה של החומרה. זה לא אומר שהמפתח שלך נפרץ, רק האימות לא מוכיח שהמפתח נמצא בחומרה מאובטחת. צריך לשנות את ההנחות שלכם לגבי האבטחה בהתאם.
אם אישור הבסיס לא מכיל את המפתח הציבורי בדף הזה, יכולות להיות לכך שתי סיבות:
- סביר להניח שהמכשיר הושק עם גרסת Android ישנה יותר מ-7.0, והוא לא תומך באימות באמצעות חומרה. במקרה כזה, ב-Android יש הטמעת תוכנה של אימות (attestation), שמייצרת אישור אימות (attestation) דומה, אבל חתומה באמצעות מפתח שמופיע בתוך הקוד בקוד המקור של Android. מכיוון שמפתח החתימה הזה אינו סוד, יכול להיות שהאימות נוצר על ידי תוקף שמתחזה לספק חומרה מאובטחת.
- הסיבה השנייה האפשרית היא שהמכשיר לא מכשיר Google Play. במקרה כזה, יצרן המכשיר יכול ליצור שורש משלו ולצרף הצהרה כלשהי לגבי המשמעות של האימות. יש לעיין במסמכי התיעוד של יצרן המכשיר. חשוב לשים לב שנכון לעכשיו, Google לא מודעת ליצרני מכשירים שביצעו את הפעולה הזו.
רשימת הסטטוסים של אישורים שבוטלו
אפשר לבטל מפתחות אימות מכמה סיבות, כולל שימוש שגוי או חשד לחילוץ על ידי תוקף. לכן, חשוב מאוד לבדוק את הסטטוס של כל אישור בשרשרת האימות בהתאם לרשימת הסטטוסים הרשמית של אישורים שבוטלו (CRL).
Google מנהלת את הרשימה הזו ומפרסמת אותה בכתובת:
https://android.googleapis.com/attestation/status. הכותרת Cache-Control
בתגובת ה-HTTP קובעת באיזו תדירות צריך לבדוק אם יש עדכונים, כך שלא נדרשת בקשת רשת לכל אישור שרוצים לאמת.
כתובת ה-URL הזו מחזירה קובץ JSON שמכיל את סטטוס הביטול של אישורים שאין להם סטטוס תקין רגיל. הפורמט של קובץ ה-JSON תואם להגדרה הבאה של סכימת JSON (טיוטה 07):
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "entries": { "description" : "Each entry represents the status of an attestation key. The dictionary-key is the certificate serial number in lowercase hex.", "type": "object", "propertyNames": { "pattern": "^[a-f1-9][a-f0-9]*$" }, "additionalProperties": { "type": "object", "properties": { "status": { "description": "[REQUIRED] Current status of the key.", "type": "string", "enum": ["REVOKED", "SUSPENDED"] }, "expires": { "description": "[OPTIONAL] UTC date when certificate expires in ISO8601 format (YYYY-MM-DD). Can be used to clear expired certificates from the status list.", "type": "string", "format": "date" }, "reason": { "description": "[OPTIONAL] Reason for the current status.", "type": "string", "enum": ["UNSPECIFIED", "KEY_COMPROMISE", "CA_COMPROMISE", "SUPERSEDED", "SOFTWARE_FLAW"] }, "comment": { "description": "[OPTIONAL] Free form comment about the key status.", "type": "string", "maxLength": 140 } }, "required": ["status"], "additionalProperties": false } } }, "required": ["entries"], "additionalProperties": false }
דוגמה ל-CRL:
{ "entries": { "2c8cdddfd5e03bfc": { "status": "REVOKED", "expires": "2020-11-13", "reason": "KEY_COMPROMISE", "comment": "Key stored on unsecure system" }, "c8966fcb2fbb0d7a": { "status": "SUSPENDED", "reason": "SOFTWARE_FLAW", "comment": "Bug in keystore causes this key malfunction b/555555" } } }
הסכימה של נתוני התוסף לאימות מפתחות
למזהה OID של תוסף האימות של המפתחות הוא 1.3.6.1.4.1.11129.2.1.17
. התוסף שומר את המידע בהתאם לסכימת ASN.1.
ברשימה הבאה מופיע תיאור של כל רכיב בתוך הסכימה:
KeyDescription
רצף הערכים הזה מציג מידע כללי על זוג המפתחות שעובר אימות באמצעות אימות מפתחות, ומספק גישה קלה לפרטים נוספים.
-
attestationVersion
-
הגרסה של תכונת האימות (attestation) של המפתח.
ערך גרסה 1 גרסה 2.0 של Keymaster 2 גרסה 3.0 של Keymaster 3 גרסה 4.0 של Keymaster 4 גרסה 4.1 של Keymaster 100 גרסה 1.0 של KeyMint 200 KeyMint גרסה 2.0 300 KeyMint גרסה 3.0 -
attestationSecurityLevel
-
רמת האבטחה של האימות.
אזהרה: אפשר לאמת מפתחות שמאוחסנים במערכת Android – כלומר, אם הערך של
attestationSecurityLevel
מוגדר ל-Software – אבל אי אפשר לסמוך על האימותים האלה אם מערכת Android נפרצה. -
keymasterVersion
מתוךkeyMintVersion
-
גרסת שיטת הפשטת החומרה (HAL) של Keymaster או של KeyMint.
ערך גרסה 0 Keymaster בגרסה 0.2 או 0.3 1 גרסה 1.0 של Keymaster 2 גרסה 2.0 של Keymaster 3 גרסה 3.0 של Keymaster 4 גרסה 4.0 של Keymaster 41 גרסה 4.1 של Keymaster 100 גרסה 1.0 של KeyMint 200 KeyMint גרסה 2.0 300 KeyMint גרסה 3.0 -
keymasterSecurityLevel
מתוךkeyMintSecurityLevel
- רמת האבטחה של הטמעת Keymaster/KeyMint.
-
attestationChallenge
-
האתגר שסופק בזמן יצירת המפתח. בודקים אם הערך הזה תואם לערך שסופק על ידי השרת, כמו שהוא שמור בתג ההרשאה
Tag::ATTESTATION_CHALLENGE
. אחרת, השירות שלכם עלול להיות חשוף להפעלה מחדש של אישורי אימות ישנים. -
uniqueId
-
הערך הזה מזהה את המכשיר – אבל רק לפרק זמן מוגבל. הוא מחושב ומשמשים רק אפליקציות מערכת. בכל האפליקציות האחרות, השדה
uniqueId
ריק. -
softwareEnforced
-
אופציונלי. רשימת ההרשאות של Keymaster / KeyMint
המידע ברשימת ההרשאות הזו נאסף או נוצר על ידי קוד שמהווה חלק מהפלטפורמה, ונשמר במחיצה של המערכת במכשיר.
אפשר לסמוך על התוכן של רשימת ההרשאות הזו כל עוד פועלת במכשיר מערכת הפעלה שתואמת למודל האבטחה של פלטפורמת Android.
כל מכשירי Android המאושרים עומדים במודל האבטחה הזה, כך שאם המכשיר נעול והסטטוס של האתחול המאומת הוא
Verified
, הערכים כאן אמורים להיות מהימנים. במכשיר שעבר שינוי, שבו נעילת האתחול (bootloader) פתוחה, המשתמש יכול להתקין מערכת הפעלה שלא תואמת למודל האבטחה של פלטפורמת Android. לכן, יכול להיות שהמשתמש יבחר את הערכים בשדה הזה באופן שרירותי. -
hardwareEnforced
- אופציונלי. רשימת ההרשאות של Keymaster/KeyMint, שמופעלת על ידי סביבת המחשוב המאובטחת (TEE) של המכשיר. המידע ברשימת ההרשאות הזו נאסף או נוצר על ידי קוד שמהווה חלק מהחומרה המאובטחת ולא נשלט על ידי הפלטפורמה. לדוגמה, המידע ברשימת ההרשאות הזו מגיע מ-bootloader של המכשיר או מ-TEE שפועל במכשיר. שדות ברשימת ההרשאות הזו שלא מוגדרים ישירות על ידי KeyMint ניתנים על ידי חלקים אחרים בחומרה המאובטחת (לדוגמה, מנהל האתחול) דרך ערוצי תקשורת מאובטחים שלא כוללים אמון בפלטפורמה. ההבדל בין החומרה המאובטחת לבין מערכת Android הוא שהמשתמש לא יכול לשנות את הקוד שפועל בחומרה המאובטחת (קושחת הקצר). לכן, הוא לא יכול לשנות את הערכים ברשימת ההרשאות הזו.
SecurityLevel
מבנה הנתונים הזה מציין את מידת ההגנה על תכונה של תוכנה, כמו זוג מפתחות, על סמך המיקום שלה במכשיר.
מאחר שמבנה הנתונים הוא ספירה, הוא יכול לקבל רק אחד מהערכים הבאים:
- מאגר מפתחות
- המערכת של Android מיישמת את הלוגיקה ליצירה ולניהול של התכונה. למטרות יצירה ואחסון של זוגות מפתחות, המיקום הזה פחות מאובטח מ-TEE אבל מאובטח יותר ממרחב התהליכים של האפליקציה.
- TrustedEnvironment
- הלוגיקת היצירה והניהול של התכונה מיושמת בחומרה מאובטחת, כמו TEE. למטרות יצירת זוגות מפתחות ושמירתם, המיקום הזה מאובטח יותר כי חומרה מאובטחת עמידת מאוד בפני פריצה מרחוק.
- StrongBox
- הלוגיקת היצירה והניהול של התכונה מיושמת במודול אבטחת חומרה ייעודי. המיקום הזה מאובטח יותר למטרות יצירה ואחסון של זוגות מפתחות, כי הוא עמיד מאוד בפני פריצה מרחוק ומתקפות חומרה נגד המודול.
- תוכנות
- הלוגיקת היצירה והניהול של התכונה מיושמת בהטמעה של KeyMint או Keymaster שלא פועלת בסביבה מאובטחת. למטרות יצירה ואחסון של זוגות מפתחות, המיקום הזה פחות מאובטח מ-TEE, אבל מאובטח יותר ממרחב התהליכים של האפליקציה.
AuthorizationList
מבנה הנתונים הזה מכיל את המאפיינים של זוג המפתחות עצמם, כפי שהם מוגדרים בשכבת ההפשטה של חומרת Keymaster או KeyMint (HAL). צריך להשוות את הערכים האלה למצב הנוכחי של המכשיר או לקבוצת ערכים צפויים, כדי לוודא שזוג מפתחות עדיין תקף לשימוש באפליקציה.
כל שם של שדה תואם לתג הרשאה בעל שם דומה – Keymaster / KeyMint.
לדוגמה, השדה keySize
ברשימת ההרשאות תואם לתג ההרשאה Tag::KEY_SIZE
.
מפרט ממשק AIDL מכיל את כל המידע על תגי הרשאה.
המאפיין הזה מגדיר את ערך המזהה ואת הסוג של כל תג, וגם מציין אם כל תג צפוי להופיע ברשימת ההרשאות hardwareEnforced
(המשמעות היא שהתג נאכף בסביבה המאובטחת) או ברשימת ההרשאות softwareEnforced
(המשמעות היא שהתג נאכף על ידי Android, בדרך כלל על ידי Keystore).
כל השדות ברשימה הבאה הם אופציונליים:
-
purpose
-
תואם לתג ההרשאה
Tag::PURPOSE
, שבו נעשה שימוש בערך מזהה של תג 1. -
algorithm
-
תואם לתג ההרשאה
Tag::ALGORITHM
, שבו נעשה שימוש בערך 2 של מזהה התג.באובייקט האימות
AuthorizationList
, הערך של האלגוריתם הוא תמידRSA
אוEC
. -
keySize
-
תואם לתג ההרשאה
Tag::KEY_SIZE
, שבו מזהה התג הוא 3. -
digest
-
תואם לתג ההרשאה
Tag::DIGEST
, שבו נעשה שימוש בערך מזהה של תג 5. -
padding
-
תואם לתג ההרשאה
Tag::PADDING
, שבו נעשה שימוש בערך מזהה תג של 6. -
ecCurve
-
תואם לתג ההרשאה
Tag::EC_CURVE
, שבו נעשה שימוש בערך 10 למזהה התג.קבוצת הפרמטרים שמשמשת ליצירת זוג מפתחות של עקומה אליפטית (EC), שמשתמש ב-ECDSA לחתימה ולאימות, בתוך מאגר המפתחות של מערכת Android.
-
rsaPublicExponent
-
תואם לתג ההרשאה
Tag::RSA_PUBLIC_EXPONENT
, שמשתמש בערך מזהה תג של 200. -
mgfDigest
-
השדה הזה קיים רק בגרסה 100 ואילך של אימות המפתחות.
תואם לתג ההרשאהTag::RSA_OAEP_MGF_DIGEST
של KeyMint, שמשתמש בערך מזהה תג של 203. -
rollbackResistance
-
השדה הזה קיים רק בגרסה 3 ואילך של אימות המפתחות.
תואם לתג ההרשאה
Tag::ROLLBACK_RESISTANT
, שכולל את ערך מזהה התג 303. -
earlyBootOnly
-
השדה הזה קיים רק בגרסה 4 ואילך של אימות המפתחות.
תואם לתג ההרשאה
Tag::EARLY_BOOT_ONLY
, שבו נעשה שימוש בערך מזהה התג 305. -
activeDateTime
-
תואם לתג ההרשאה
Tag::ACTIVE_DATETIME
, שמשתמש בערך מזהה תג של 400. -
originationExpireDateTime
-
תואם לתג ההרשאה של
Tag::ORIGINATION_EXPIRE_DATETIME
Keymaster, שמשתמש בערך מזהה תג של 401. -
usageExpireDateTime
-
תואם לתג ההרשאה
Tag::USAGE_EXPIRE_DATETIME
, שבו נעשה שימוש בערך מזהה תג של 402. -
usageCountLimit
-
תואם לתג ההרשאה
Tag::USAGE_COUNT_LIMIT
, שכולל את ערך מזהה התג 405. -
noAuthRequired
-
תואם לתג ההרשאה
Tag::NO_AUTH_REQUIRED
, שמשתמש בערך מזהה תג של 503. -
userAuthType
-
תואם לתג ההרשאה
Tag::USER_AUTH_TYPE
, שבו נעשה שימוש בערך מזהה תג של 504. -
authTimeout
-
תואם לתג ההרשאה
Tag::AUTH_TIMEOUT
, שבו הערך של מזהה התג הוא 505. -
allowWhileOnBody
-
תואם לתג ההרשאה
Tag::ALLOW_WHILE_ON_BODY
, שמשתמש בערך מזהה תג של 506.מאפשרת להשתמש במפתח אחרי פרק הזמן הקצוב לתפוגה של האימות, אם המשתמש עדיין עונד את המכשיר על גופו. חשוב לזכור שחיישן מאובטח בגוף קובע אם המכשיר משוחק על הגוף של המשתמש.
-
trustedUserPresenceRequired
-
השדה הזה קיים רק בגרסה 3 ואילך של אימות מפתחות.
תואם לתג ההרשאה
Tag::TRUSTED_USER_PRESENCE_REQUIRED
, שבו נעשה שימוש בערך מזהה תג של 507.קובעת שאפשר להשתמש במפתח הזה רק אם המשתמש סיפק הוכחה נוכחות פיזית. הנה כמה דוגמאות:
- למפתח StrongBox, לחצן החומרה מחובר לסיכה במכשיר StrongBox.
- במפתח TEE, אימות טביעת אצבע מספק הוכחה לנוכחות כל עוד ל-TEE יש שליטה בלעדית בסורק והוא מבצע את תהליך ההתאמה של טביעת האצבע.
-
trustedConfirmationRequired
-
הצגה רק בגרסת אימות (attestation) של מפתח >= 3.
תואם לתג ההרשאה
Tag::TRUSTED_CONFIRMATION_REQUIRED
, שבו ערך מזהה התג הוא 508.מציינת שאפשר להשתמש במפתח רק אם המשתמש מספק אישור לחתימה על הנתונים באמצעות אסימון אישור. למידע נוסף על קבלת אישור מהמשתמשים, ראו אישור מוגן ב-Android.
הערה: התג הזה רלוונטי רק למפתחות שמשתמשים למטרה
SIGN
. -
unlockedDeviceRequired
-
השדה הזה קיים רק בגרסה 3 ואילך של אימות המפתחות.
תואם לתג ההרשאה
Tag::UNLOCKED_DEVICE_REQUIRED
, שבו נעשה שימוש בערך מזהה תג של 509. -
allApplications
-
תואם לתג ההרשאה
Tag::ALL_APPLICATIONS
, שמשתמש בערך מזהה תג של 600.מציין אם כל האפליקציות במכשיר יכולות לגשת לזוג המפתחות.
-
applicationId
-
תואם לתג ההרשאה
Tag::APPLICATION_ID
, שמשתמש בערך מזהה תג של 601. -
creationDateTime
-
תואם לתג ההרשאה
Tag::CREATION_DATETIME
, שמשתמש בערך מזהה תג של 701. -
origin
-
תואם לתג ההרשאה
Tag::ORIGIN
, שבו נעשה שימוש בערך מזהה תג של 702. -
rollbackResistant
-
קיים רק בגרסאות 1 ו-2 של אימות (attestation) מפתח.
תואם לתג ההרשאה
Tag::ROLLBACK_RESISTANT
, שכולל את ערך מזהה התג 703. -
rootOfTrust
-
תואם לתג ההרשאה
Tag::ROOT_OF_TRUST
, שמשתמש בערך מזהה תג של 704.לפרטים נוספים קראו את הקטע שמתאר את מבנה הנתונים RootOfTrust.
-
osVersion
-
תואם לתג ההרשאה
Tag::OS_VERSION
, שמשתמש בערך של מזהה התג 705.הגרסה של מערכת ההפעלה של Android שמשויכת ל-Keymaster, שצוינה כמספר שלם בן שש ספרות. לדוגמה, הגרסה 8.1.0 מיוצגת כ-080100.
רק גרסה 1.0 ואילך של Keymaster כוללת את הערך הזה ברשימת ההרשאות.
-
osPatchLevel
-
תואם לתג ההרשאה
Tag::PATCHLEVEL
, שבו נעשה שימוש בערך מזהה התג 706.החודש והשנה המשויכים לתיקון האבטחה שנעשה בו שימוש ב-Keymaster, כמספר שלם בן 6 ספרות. לדוגמה, התיקון של אוגוסט 2018 מיוצג כ-201808.
רק גרסה 1.0 ואילך של Keymaster כוללת את הערך הזה ברשימת ההרשאות.
-
attestationApplicationId
-
השדה הזה קיים רק בגרסאות של אימות מפתחות שמספרן גבוה מ-2.
תואם לתג ההרשאה של Keymaster
Tag::ATTESTATION_APPLICATION_ID
, שמשתמש בערך מזהה תג של 709.לפרטים נוספים, עיינו בקטע שמתאר את מבנה הנתונים AttestationApplicationId.
-
attestationIdBrand
-
הצגה רק בגרסאות אימות (attestation) של מפתח >= 2.
תואם לתג Keymaster
Tag::ATTESTATION_ID_BRAND
, שמשתמש בערך מזהה תג של 710. -
attestationIdDevice
-
הצגה רק בגרסאות אימות (attestation) של מפתח >= 2.
תואם לתג Keymaster
Tag::ATTESTATION_ID_DEVICE
, שבו נעשה שימוש בערך מזהה תג של 711. -
attestationIdProduct
-
הצגה רק בגרסאות אימות (attestation) של מפתח >= 2.
תואם לתג Keymaster
Tag::ATTESTATION_ID_PRODUCT
, שמשתמש בערך מזהה תג של 712. -
attestationIdSerial
-
השדה הזה קיים רק בגרסאות של אימות מפתחות שמספרן גבוה מ-2.
תואם לתג Keymaster
Tag::ATTESTATION_ID_SERIAL
, שמשתמש בערך מזהה תג של 713. -
attestationIdImei
-
הצגה רק בגרסאות אימות (attestation) של מפתח >= 2.
תואם לתג ההרשאה
Tag::ATTESTATION_ID_IMEI
, שמשתמש בערך מזהה תג של 714. -
attestationIdMeid
-
השדה הזה קיים רק בגרסאות של אימות מפתחות שמספרן גבוה מ-2.
תואם לתג ההרשאה
Tag::ATTESTATION_ID_MEID
, שמשתמש בערך מזהה תג של 715. -
attestationIdManufacturer
-
השדה הזה קיים רק בגרסאות של אימות מפתחות שמספרן גבוה מ-2.
תואם לתג ההרשאה
Tag::ATTESTATION_ID_MANUFACTURER
, שמשתמש בערך של מזהה התג 716. -
attestationIdModel
-
השדה הזה קיים רק בגרסאות של אימות מפתחות שמספרן גבוה מ-2.
תואם לתג ההרשאה
Tag::ATTESTATION_ID_MODEL
, שבו נעשה שימוש בערך מזהה תג של 717. -
vendorPatchLevel
-
השדה הזה קיים רק בגרסאות של אימות מפתחות בגרסה 3 ואילך.
תואם לתג ההרשאה
Tag::VENDOR_PATCHLEVEL
, שמשתמש בערך מזהה תג של 718.רמת תיקון האבטחה של קובץ האימג' של הספק שצריך להתקין במכשיר כדי שאפשר יהיה להשתמש במפתח הזה. הערך מופיע בפורמט YYYYMMDD, שמייצג את התאריך של תיקון האבטחה של הספק. לדוגמה, אם מפתח נוצר במכשיר Android שבו מותקן תיקון האבטחה של הספק מ-1 באוגוסט 2018, הערך הזה יהיה 20180801.
-
bootPatchLevel
-
השדה הזה קיים רק בגרסאות של אימות מפתחות בגרסה 3 ואילך.
תואם לתג ההרשאה
Tag::BOOT_PATCHLEVEL
, שכולל את ערך מזהה התג 719.רמת תיקון האבטחה של קובץ האימג' של הליבה שצריך להתקין במכשיר כדי שאפשר יהיה להשתמש במפתח הזה. הערך מופיע בפורמט YYYYMMDD, ומייצג את התאריך של תיקון האבטחה למערכת. לדוגמה: אם מפתח האבטחה נוצר במכשיר Android שבו מותקן תיקון האבטחה ב-5 באוגוסט 2018, הערך יהיה 20180805.
-
deviceUniqueAttestation
-
הצגה רק בגרסאות אימות (attestation) של מפתח >= 4.
תואם לתג ההרשאה
Tag::DEVICE_UNIQUE_ATTESTATION
, שבו נעשה שימוש בערך מזהה תג של 720. -
attestationIdSecondImei
-
קיים רק בגרסאות אימות (attestation) של מפתח >= 300.
תואם לתג ההרשאה
Tag::ATTESTATION_ID_SECOND_IMEI
, שמשתמש בערך מזהה תג של 723.
RootOfTrust
אוסף הערכים הזה מגדיר מידע חשוב על סטטוס המכשיר.
כל השדות ברשימה הבאה הם שדות חובה:
-
verifiedBootKey
-
גיבוב מאובטח של המפתח שמאמת את קובץ האימג' של המערכת. מומלץ להשתמש באלגוריתם SHA-256 לגיבוב הזה.
-
deviceLocked
- True אם תוכנת האתחול של המכשיר נעולה, וכך מאפשרת בדיקה של אתחול מאומת ומונעת הבהוב של קובץ אימג' של מכשיר לא חתום במכשיר. מידע נוסף על התכונה הזו זמין במסמכי העזרה של Verifying Boot.
-
verifiedBootState
- מצב ההפעלה של המכשיר, בהתאם לתכונה 'הפעלה מאומתת'.
-
verifiedBootHash
-
הצגה רק בגרסאות אימות (attestation) של מפתח >= 3.
תקציר של כל הנתונים שמוגנים על ידי 'הפעלה מאומתת'. במכשירים שמשתמשים בהטמעה של Android Verified Boot לאתחול מאומת, הערך הזה מכיל את הסיכום של המבנה VBMeta או של מבנה המטא-נתונים של אתחול מאומת.
מידע נוסף על אופן החישוב של הערך הזה זמין במאמר The VBMeta Digest.
VerifiedBootState
מבנה הנתונים הזה מספק את מצב ההפעלה הנוכחי של המכשיר, שמייצג את רמת ההגנה שניתנת למשתמש ולאפליקציות אחרי סיום ההפעלה של המכשיר. למידע נוסף על התכונה הזו, אפשר לעיין בקטע מצב ההפעלה במאמרי העזרה של אימות ההפעלה.
מבנה הנתונים הזה הוא ספירה, ולכן הוא יכול לקבל רק אחד מהערכים הבאים:
- מאומת
-
מציין שרשרת אמון מלאה, שכוללת את מנהל האתחול, את מחיצת האתחול ואת כל המחיצות המאומתות.
כשהמכשיר נמצא במצב האתחול הזה, הערך של
verifiedBootKey
הוא הגיבוב של האישור המוטמע במכשיר, שיצרן המכשיר מוסיף ל-ROM של המכשיר במפעל. - חתימה עצמית
-
מציין שהאישור המוטמע במכשיר אימת את מחיצת ההפעלה של המכשיר ושהחתימה חוקית.
כשהמכשיר נמצא במצב האתחול הזה, הערך של
verifiedBootKey
הוא הגיבוב של אישור שהמשתמש מתקין, שמאמת את מחיצת האתחול שהמשתמש מוסיף למכשיר במקום מחיצת האתחול המקורית שסופקה על ידי היצרן. - לא מאומת
- המשמעות של הערך הזה היא שהמשתמש יכול לשנות את המכשיר באופן חופשי. לכן, המשתמש אחראי לאימות תקינות המכשיר.
- נכשלה
-
הסמל הזה מציין שהמכשיר נכשל באימות. אישור האימות אף פעם לא צריך להשתמש בערך הזה בשביל
VerifiedBootState
.
AttestationApplicationId
מבנה הנתונים הזה משקף את ההנחה של פלטפורמת Android לגבי האפליקציות שמותר להשתמש בחומר המפתח הסודי שלהן במסגרת האימות. המזהה יכול לכלול כמה חבילות אם ורק אם כמה חבילות משתפות את אותו מזהה UID. המחרוזת של האוקטטים מוגדרת בפורמט לפי הסכימה הבאה של ASN.1:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
- package_infos
-
קבוצה של אובייקטים מסוג
AttestationPackageInfo
, שכל אחד מהם מספק את שם החבילה ומספר הגרסה שלה. - חתימות_חתימה
-
קבוצה של סיכומי SHA-256 של אישורי החתימה של האפליקציה. לאפליקציה יכולות להיות כמה רשתות של אישורי מפתחות לחתימה. לכל אחד מהם, האישור 'עלה' עובר עיכול ומוחזר בשדה
signature_digests
. שם השדה מטעה, כי הנתונים המגובבים הם אישורי החתימה של האפליקציה, ולא החתימות של האפליקציה, כי השם שלו נקבע לפי המחלקהSignature
שמוחזרת על ידי קריאה ל-getPackageInfo()
. קטע הקוד הבא מציג קבוצה לדוגמה:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
סכימת נתונים של תוספי מידע על הקצאת הרשאות
למזהה ה-OID של התוסף של פרטי הקצאת ההרשאות הוא 1.3.6.1.4.1.11129.2.1.30
. התוסף מספק מידע על המכשיר שידוע לשרת ההקצאה. התוסף הזה עוקב אחרי הסכימה של CDDL.
{ 1 : int, ; certificates issued }
המפה לא מחולקת לגרסאות, וניתן להוסיף לה שדות אופציונליים חדשים.
-
certs_issued
-
מספר משוער של אישורים שהונפקו למכשיר ב-30 הימים האחרונים. אם הערך גדול מהממוצע בסדר גודל מסוים, הוא יכול לשמש כאות לניצול לרעה של התהליכים שלנו.