Authentication

ב-Android יש את המושג של מאמתי משתמשים, המשמשים לביטול הנעילה של המכשיר ולבקרת הגישה למפתחות קריפטוגרפיים. התהליך כולל את הרכיבים הבאים:

  • אחסון מפתחות קריפטוגרפיים וספק שירותים. Android Keystore מספק שירותי הצפנה שמגובים בחומרה לאפליקציות. מערכת Android Keystore ברמת המסגרת מגובה על ידי שירות המערכת keystore2. ההטמעה הזו מבוססת על הטמעה של KeyMint (לשעבר Keymaster) ספציפית לספק, שמבטיחה שאפשר לגשת לחומר המפתחות רק בסביבה מאובטחת שמגובת בחומרה, כמו סביבת מחשוב אמינה (TEE) או רכיב מאובטח (SE).
  • מאמתי משתמשים. אימות הצלחת האימות של המשתמש. ב-Android יש תמיכה ברכיבי האימות הבאים:
    • שומר לאימות באמצעות קוד אימות, קו ביטול נעילה או סיסמה ב-TEE.
    • (אופציונלי) Weaver לאימות באמצעות קוד אימות, קו ביטול נעילה או סיסמה ברכיב מאובטח.
    • טביעת אצבע לאימות בטביעת אצבע.
    • שיטות אימות ביומטרי אחרות. במכשירים שמגיעים עם Android 9 ואילך אפשר להשתמש ב-BiometricPrompt כנקודת שילוב אחת לטביעות אצבע ולמאפיינים ביומטריים נוספים.
    הרכיבים האלה מעבירים את מצב האימות שלהם לשירות keystore2 באמצעות אסימוני אימות (AuthTokens) שמגובים בחומרה .

כל אחד מהרכיבים האלה הוא ספציפי לספק, אבל ההטמעה של הספק חייבת לעמוד במפרט של ממשק שכבת הפשטת חומרה (HAL), ולעבור את בדיקות חבילת הבדיקות (VTS) התואמת של הספק.

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

  • שירות HAL פועל בתור תהליך מערכת של Android, ומקבל בקשות Binder ממערכת Android.
  • אפליקציה מהימנה (TA) פועלת בסביבה המאובטחת ומבצעת את הפעולות המאובטחות בפועל.

הרשמה

בהפעלה הראשונה של המכשיר אחרי איפוס להגדרות המקוריות, כל מאמתי הזהויות מוכנים לקבל מהמשתמש הרשמות של פרטי כניסה. בשלב הראשון, המשתמש צריך להירשם ל-Gatekeeper (או ל-Weaver, אם הוא זמין) באמצעות קוד אימות, קו ביטול נעילה או סיסמה. ההרשמה הראשונית יוצרת מזהה מאובטח (SID) של משתמש באורך 64 ביט שנוצר באופן אקראי, ומשמש כמזהה של המשתמש וכאסימון קישור לחומר הקריפטוגרפי של המשתמש. ה-SID של המשתמש הזה קשור באופן קריפטוגרפי לסיסמה של המשתמש. אימותים מוצלחים ב-Gatekeeper יוצרים אסימוני AuthToken שמכילים את ה-SID של המשתמש עבור אותה סיסמה.

משתמש שרוצה לשנות פרטי כניסה קיימים צריך להציג את פרטי הכניסה האלה. אם פרטי הכניסה הקיימים מאומתים בהצלחה, מזהה המשתמש (SID) שמשויך לפרטי הכניסה הקיימים מועבר לפרטי הכניסה החדשים, וכך המשתמש יכול להמשיך לגשת למפתחות אחרי שינוי פרטי הכניסה.

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

אימות

בקטע הזה מתוארת תהליך אימות אופייני, שכולל אינטראקציות בין כמה רכיבים ב-Android ובסביבה המאובטחת. שימו לב שכל הרכיבים המאובטחים משתפים מפתח HMAC סודי (לכל הפעלה) שמשמש אותם לאימות ההודעות שלהם.

אחרי שמשתמש מגדיר פרטי כניסה ומוקצה לו מזהה משתמש (SID), הוא יכול להתחיל את תהליך האימות. האימות מתחיל כשהמשתמש מספק קוד אימות, קו פתיחת נעילה, סיסמה, טביעת אצבע או מידע ביומטרי חזק אחר. תהליך האימות

איור 1. תהליך האימות

  1. משתמש מספק שיטת אימות והשירות המשויך שולח בקשה לשירות HAL.
    • אם מדובר בקוד אימות, בקו ביטול נעילה או בסיסמה, LockSettingsService שולחת בקשה ל-gatekeeperd.
    • תהליכי האימות שמבוססים על ביומטריה תלויים בגרסה של Android. במכשירים עם Android מגרסה 8.x ואילך, FingerprintService שולח בקשה ל-fingerprintd. במכשירים עם Android מגרסה 9 ואילך, BiometricPrompt שולח בקשה לדיימון הביומטרי המתאים (לדוגמה, fingerprintd לזיהוי טביעות אצבע או faced לזיהוי פנים) באמצעות הכיתה המתאימה של BiometricManager, כמו FingerprintManager או FaceManager. ללא קשר לגרסה, האימות הביומטרי מתבצע באופן אסינכרוני אחרי שליחת הבקשה.
  2. שירות HAL שולח נתונים ל-TA המקביל, שיוצר AuthToken:‏
    • לאימות באמצעות קוד אימות, קו ביטול נעילה או סיסמה, gatekeeperd שולח את הגיבוב של קוד האימות, קו ביטול הנעילה או הסיסמה ל-TA של Gatekeeper ב-TEE, דרך שירות ה-HAL של Gatekeeper. אם האימות ב-TEE מצליח, ה-TA של Gatekeeper פולט AuthToken שמכיל את ה-SID התואם של המשתמש (חתום באמצעות מפתח ה-HMAC המשותף).
    • לאימות באמצעות טביעת אצבע, fingerprintd מקשיב לאירועים של טביעות אצבע ושולח את הנתונים ל-TA של טביעת האצבע ב-TEE, דרך ה-HAL של טביעת האצבע. אם האימות ב-TEE מצליח, ה-TA של טביעת האצבע פולט AuthToken (חתום על ידי מפתח ה-HMAC של AuthToken).
    • באימות ביומטרי אחר, הדימון הביומטרי המתאים ממתין לאירוע הביומטרי ושולח אותו לשירות ה-HAL ול-TA הביומטריים המתאימים.
  3. אסימון AuthToken החתום שנוצר מועבר לשירות המערכת keystore2 דרך ממשק Binder.
  4. השירות keystore2 מצרף את AuthTokens לבקשה ל-KeyMint (לשעבר Keymaster) כדי לבצע פעולות קריפטוגרפיות. שירות ה-HAL של KeyMint מעביר אותם ל-TA של KeyMint, שמאמת אותם באמצעות מפתח ה-HMAC ששותף עם Gatekeeper ועם רכיבי ה-TEE הביומטריים הנתמכים. KeyMint סומך על חותמת הזמן שבאסימון כזמן האימות האחרון, ומחליט אם לאפשר שימוש במפתח על סמך חותמת הזמן.

תהליך האימות לא מחייב תקשורת ישירה בין גורמי האימות בסביבה המאובטחת: אסימוני AuthToken עוברים מהגורם לאימות לשירות keystore2 ב-Android, שמעביר אותם לגורם האימות של KeyMint. כך השירות keystore2 יכול לדחות במהירות בקשות שצפויות להיכשל, כי הוא יודע על AuthTokens הזמינים במערכת, וכך חוסך IPC שעלול להיות יקר ב-TEE.

הפורמט של AuthToken

הפורמט של AuthToken מצוין במפרט AIDL בקטע HardwareAuthToken.aidl.

תהליך האתחול של המכשיר

בכל הפעלה של מכשיר, צריך ליצור את מפתח ה-HMAC של AuthToken ולשתף אותו עם כל רכיבי ה-TEE (Gatekeeper,‏ KeyMint/‏Keymaster ו-TAs נתמכים של ביומטריה). כדי למנוע התקפות שחזור, מפתח ה-HMAC צריך להיווצר באופן אקראי בכל פעם שהמכשיר מופעל מחדש.

יש שתי דרכים נפוצות שבהן בודקים מקבלים גישה למפתח ה-HMAC המשותף הזה:

  • הסכם על סוד משותף: השירות keystore2 מבצע פרוטוקול של הסכם מפתחות בכמה דרכים בזמן הפעלת המכשיר, ומאפשר הפקה מאובטחת של מפתח ה-HMAC בין מנהלי החשבונות הטכניים שמשתתפים. עם זאת, למורים המשתתפים צריכה להיות גישה לסוד משותף ששותף מראש.
  • גישה ישירה: צוותים טכניים שנמצאים באותה סביבה מאובטחת יכולים להשתמש במנגנון תקשורת פנימי בין תהליכים (שנקבע לפי הפלטפורמה) כדי לשתף את מפתח ה-HMAC.

בכל מקרה, אף פעם אסור להפוך את מפתח ה-HMAC לזמין מחוץ ל-TEE.

מערכת ההפעלה Trusty, שפועלת לצד Android, היא דוגמה לסביבת TEE, אבל אפשר להשתמש בסביבות TEE אחרות במקום זאת. ‏Trusty משתמש במערכת IPC פנימית כדי לתקשר ישירות בין KeyMint ל-Gatekeeper או ל-TA הביומטרי המתאים. מפתח ה-HMAC נשמר רק ב-KeyMint. Fingerprint ו-Gatekeeper מבקשים את המפתח מ-KeyMint בכל שימוש, ולא שומרים את הערך או שומרים אותו במטמון.