Weaver Hardware Abstraction Layer (HAL) (IWeaver.aidl), שהוצג ב-Android 8.1, מספק ממשק מאובטח לאימות משתמשים באמצעות גורם ידע של מסך הנעילה (LSKF), כמו קוד אימות, דפוס וסיסמה.
Weaver מחליף את הפונקציונליות של אימות LSKF של Gatekeeper. עם זאת, עדיין נעשה שימוש ב-Gatekeeper כדי ליצור טוקנים לאימות חומרה.
ב-Android מגרסה 9 ואילך, CDD 9.11.2 מחייב שמכשירים שתומכים ב-StrongBox יספקו חומרה מאובטחת ייעודית שתומכת באימות מאובטח של משתמשים. הטמעה של Weaver HAL באמצעות חומרה מאובטחת עומדת בדרישה של 'אימות מאובטח של משתמשים'.
במכשירים ללא רכיב מאובטח (SE) ייעודי, עדיין אפשר להטמיע את Weaver בסביבת מחשוב אמינה (TEE) כמו Trusty.
ב-Android 17 ואילך, מומלץ מאוד להטמיע את Weaver גם במכשירים ללא רכיב אבטחה ייעודי.
רכיבים
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) לא פעיל והמפתח שסופק זהה בדיוק למפתח המאוחסן. -
warmUp(): ב-Android מגרסה 17 ואילך, ההגדרה הזו מציינת שייתכן שפעולת קריאה או כתיבה תתרחש בקרוב.
למפרט המלא של הממשק: IWeaver.aidl
שימוש ב-Android
כשזמינה הטמעה של Weaver, LockSettingsService בשרת של מערכת Android נעשה שימוש בה כדי להגן על נתוני המשתמשים. לכל משתמש במכשיר, LockSettingsService מנהל משבצת Weaver:
- מפתח משבצת (
weaverKey): גיבוב של ה-LSKF של המשתמש. אם למשתמש אין נעילת מסך, המערכת משתמשת במחרוזת ברירת מחדל. - ערך המשבצת (
weaverSecret): סוד קריפטוגרפי בעל אנטרופיה גבוהה, שנוצר באופן אקראי.
ה-weaverSecret מיועד לאחזור רק על ידי אחת מהאפשרויות הבאות:
- העברת
weaverKeyהנכון אל Weaver TA במסגרת מדיניות הגבלת הקצב שלו. - פריצה לסביבה המאובטחת שבה פועל הכלי Weaver TA. הכוונה היא שיהיה קשה מאוד.
LockSettingsService משתמש גם ב-weaverKey וגם ב-weaverSecret כדי להצפין את הסיסמה הסינתטית של המשתמש. הסיבה לכך היא שהסיסמה הסינתטית מגנה על האחסון המוצפן של פרטי הכניסה של המשתמש בהצפנה מבוססת-קבצים (FBE) ועל מפתחות שקשורים לאימות ב-Android Keystore. לכן, הנתונים לא נגישים עד ש-Weaver משחרר את הסוד.
ב-Android מגרסה 17 ומעלה,
הפונקציה LockSettingsService קוראת ל-method warmUp() של Weaver
כשהמשתמש מתחיל להזין את ה-LSKF. הטמעות של Weaver יכולות להשתמש באות הזה כדי להוציא חומרה מאובטחת ממצב של צריכת חשמל נמוכה, וכך להקטין את זמן האחזור של בקשת read() קרובה.
Weaver לעומת Gatekeeper
בעבר, Gatekeeper HAL ביצע שני תפקידים שונים בהפעלה אחת של verify():
- אימות: בדיקת LSKF עם הגבלת קצב שמופעלת על ידי TEE.
- אישור: הנפקת
HardwareAuthTokenכדי להודיע ל-KeyMint (לשעבר Keymaster) שהאימות של LSKF הצליח.
למה אנחנו עוברים ל-Weaver?
עם ההשקה של טוקנים של איפוס סיסמה מאובטח ב-Android 8.1, הסיסמה הסינתטית הפכה לסוד ההצפנה העיקרי. שני התפקידים שמתוארים למעלה מטופלים עכשיו על ידי הרשמות נפרדות ל-Gatekeeper, אחת ל-LSKF במסגרת userId + 100000 ואחת לסיסמה הסינתטית במסגרת userId.
הפונקציה Weaver הוצגה כדי להחליף את התפקיד הראשון, באמצעות ממשק HAL פשוט יותר עם תמיכה בהטמעות שמבוססות על רכיב מאובטח (SE).
| תכונה | Weaver | Gatekeeper |
|---|---|---|
| מחיקה מאובטחת | נדרש מחיקה מאובטחת, וקל להטמיע אותה כי הממשק משתמש במספר קבוע של משבצות בגודל קבוע. | אין צורך במחיקה מאובטחת, וקשה להטמיע אותה כי הממשק תומך במספר בלתי מוגבל של הרשמות. |
| חומרה | האופטימיזציה מתבצעת עבור מנועי חיפוש, אבל היא פועלת גם בסביבות TEE. | למעשה, רק TEE. הטמעה של התכונה הזו ב-SE לא מספקת יתרון אבטחתי בעיצוב הנוכחי. |
| טיפול בשגיאות | קודי שגיאה ברורים יותר | קודי שגיאה לא חד-משמעיים. כתוצאה מכך, במסך הנעילה לא ניתן להבחין בין שגיאות ב-LSKF לבין כשלים לא קשורים. |
| אטומיות | הקוד ב-LockSettingsService שמשתמש ב-Weaver מבצע שינויים ב-LSKF באופן אטומי. נתונים חדשים נכתבים במשבצת Weaver חדשה, והמשבצת הישנה נמחקת רק כשזה בטוח לעשות זאת. |
הקוד ב-LockSettingsService שמשתמש ב-Gatekeeper
לא מבצע שינויים ב-LSKF באופן אטומי. יכול להיות שכל נתוני המשתמש יאבדו אם
משהו ישתבש בזמן שינוי ה-LSKF. |
קוד הפניה
AOSP מכיל שתי הטמעות לדוגמה של Weaver:
-
ב-Android 17 ואילך,
system/weaver/כולל הטמעה של Weaver לסביבות מאובטחות כלליות. -
ב-Android מגרסה 8.1 ואילך,
external/libese/מכיל הטמעה של Weaver עבור רכיבים מאובטחים שתואמים ל-ISO/IEC7816-4.
בדיקה
כדי לאמת הטמעה של Weaver, משתמשים ב-VtsHalWeaverTargetTest:
atest VtsHalWeaverTargetTest
או:
vts-tradefed run vts -m VtsHalWeaverTargetTest