אורג

Hardware Abstraction Layer (HAL) (שכבת הפשטת חומרה) של Weaver‏ (IWeaver.aidl), שהוצגה ב-Android 8.1, מספקת ממשק מאובטח לאימות משתמשים באמצעות גורם ידע של מסך הנעילה (LSKF), כמו קוד אימות, דפוס וסיסמה.

‫Weaver מחליף את פונקציונליות האימות של LSKF ב-Gatekeeper. עם זאת, Gatekeeper עדיין משמש ליצירת טוקנים לאימות חומרה.

ב-Android מגרסה 9 ואילך, CDD 9.11.2 מחייב שמכשירים שתומכים ב-StrongBox יספקו חומרה מאובטחת ייעודית שתומכת באימות מאובטח של משתמשים. הטמעה של Weaver HAL באמצעות החומרה המאובטחת הזו עומדת בדרישה של 'אימות מאובטח של משתמשים'.

במכשירים ללא רכיב מאובטח (SE) ייעודי, עדיין אפשר להטמיע את Weaver בסביבת מחשוב אמינה (TEE) כמו Trusty.

רכיבים

‫Weaver מורכב משלושה רכיבים:

  • ממשק Weaver AIDL‏ (IWeaver): המפרט הרשמי של HAL. ב-Android מגרסה 13 ומטה נעשה שימוש ב-HIDL במקום ב-AIDL.
  • שירות Weaver Hardware Abstraction Layer (HAL): תהליך ספציפי לספק ב-Android שמטמיע את הממשק IWeaver.
  • Weaver Trusted Application (TA): הלוגיקה המרכזית שפועלת בסביבה מאובטחת. הוא מבצע אימות של LSKF ואוכף הגבלת קצב. שירות ה-HAL מתקשר עם ה-TA באמצעות ערוץ מאובטח ספציפי להטמעה.

ממשק

הממשק של Weaver מציג מערך בגודל קבוע של משבצות קבועות, שכל אחת מהן מכילה מפתח בגודל קבוע וערך בגודל קבוע. כל מיקום מודעה מזוהה באמצעות המזהה שלו, שהוא מספר שלם בטווח [0, numSlots - 1]. אפשר לגשת לערך של משבצת רק אם מספקים מפתח שתואם למפתח המאוחסן.

הממשק של Weaver מורכב מהרכיבים הבאים:

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

למפרט המלא של הממשק: IWeaver.aidl

שימוש ב-Android

כשזמינה הטמעה של Weaver, LockSettingsService בשרת של מערכת Android נעשה שימוש בה כדי להגן על נתוני המשתמשים. לכל משתמש במכשיר, LockSettingsService מנהל משבצת Weaver:

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

ה-weaverSecret מיועד לאחזור רק על ידי אחת מהאפשרויות הבאות:

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

LockSettingsService משתמש גם ב-weaverKey וגם ב-weaverSecret כדי להצפין את הסיסמה הסינתטית של המשתמש. הסיבה לכך היא שהסיסמה הסינתטית מגנה על האחסון המוצפן של פרטי הכניסה של המשתמשים באמצעות הצפנה מבוססת-קבצים (FBE) ועל המפתחות שקשורים לאימות ב-Android Keystore. לכן, הנתונים לא נגישים עד ש-Weaver משחרר את הסוד.

Weaver vs. Gatekeeper

בעבר, Gatekeeper HAL ביצע שני תפקידים שונים בקריאה אחת של verify():

  1. אימות: בדיקת ה-LSKF עם הגבלת קצב שמופעלת על ידי TEE.
  2. אישור: הנפקת HardwareAuthToken כדי להודיע ל-KeyMint (לשעבר Keymaster) שהאימות של LSKF הצליח.

למה אנחנו עוברים ל-Weaver?

עם ההשקה של טוקנים של איפוס סיסמה מאובטח ב-Android 8.1, הסיסמה הסינתטית הפכה לסוד ההצפנה העיקרי. שני התפקידים שמתוארים למעלה מטופלים עכשיו על ידי הרשמות נפרדות ל-Gatekeeper, אחת ל-LSKF ב-userId + 100000 ואחת לסיסמה הסינתטית ב-userId.

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

תכונה Weaver שומר הסף
מחיקה מאובטחת נדרש מחיקה מאובטחת, וקל להטמיע אותה כי הממשק משתמש במספר קבוע של משבצות בגודל קבוע. אין צורך במחיקה מאובטחת, וקשה להטמיע אותה כי הממשק תומך במספר בלתי מוגבל של הרשמות.
חומרה האופטימיזציה מתבצעת עבור מנועי אבטחה, אבל היא פועלת גם בסביבות TEE. למעשה, רק TEE. הטמעה של התכונה הזו ב-SE לא מספקת יתרון אבטחתי בעיצוב הנוכחי.
טיפול בשגיאות קודי שגיאה ברורים יותר קודי שגיאה לא חד-משמעיים. כתוצאה מכך, במסך הנעילה לא ניתן להבחין בין שגיאות ב-LSKF לבין כשלים לא קשורים.
אטומיות הקוד ב-LockSettingsService שמשתמש ב-Weaver מבצע שינויים ב-LSKF באופן אטומי. נתונים חדשים נכתבים למשבצת Weaver חדשה, והמשבצת הישנה נמחקת רק כשזה בטוח לעשות זאת. הקוד ב-LockSettingsService שמשתמש ב-Gatekeeper לא מבצע שינויים ב-LSKF באופן אטומי. אם משהו ישתבש בזמן שינוי ה-LSKF, יכול להיות שכל נתוני המשתמש יאבדו.

קוד הפניה

קוד ההפניה להטמעות של Weaver ברכיבי אבטחה שתואמים ל-ISO/IEC7816-4 זמין ב-AOSP:‏ external/libese/.

בדיקה

כדי לאמת הטמעה של Weaver, משתמשים ב-VtsHalWeaverTargetTest:

atest VtsHalWeaverTargetTest

או:

vts-tradefed run vts -m VtsHalWeaverTargetTest