קישור לגרסה

כל המפתחות של KeyMint צריכים להיות מקושרים ל-root of trust של המכשיר. Root of Trust הוא מחרוזת ביטים שמקורה במפתח הציבורי שמשמש לאימות החתימה של קובץ האימג' להפעלה, יחד עם מצב הנעילה של מנהל האתחול.

כדאי גם לשייך את המפתחות של KeyMint לגרסה של מערכת ההפעלה ולרמת התיקון של המכשיר. כדי לתמוך במבנה המודולרי של Treble, קישור הגרסה הזה כולל רמות תיקון נפרדות לכל מחיצה (boot,‏ system ו-vendor). כך אפשר לעדכן כל מחיצה בנפרד, ועדיין לספק הגנה מפני חזרה לאחור.

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

  • במכשירים עם Android Verified Boot‏ (AVB):
    • אפשר לכלול את רמות התיקונים ואת גרסת מערכת ההפעלה ב-vbmeta.img, כדי שה-bootloader יוכל לספק אותם ל-KeyMint.
    • במחיצות מקושרות, פרטי הגרסה של המחיצה נמצאים ב-VBMeta המקושר.
    • באופן כללי, פרטי הגרסה צריכים להופיע בשדה VBMeta struct שמכיל את נתוני האימות (hash או hashtree) של מחיצה נתונה.
  • במכשירים ללא AVB:
    • הטמעות של הפעלה מאומתת צריכות לספק לתוכנת האתחול גיבוב של המטא-נתונים של הגרסה, כדי שתוכנת האתחול תוכל לספק את הגיבוב ל-KeyMint.
    • boot.img יכול להמשיך לאחסן את רמות התיקונים בכותרת.
    • system.img יכול להמשיך לאחסן את רמות התיקונים ואת גרסת מערכת ההפעלה בנכסים לקריאה בלבד.
    • vendor.img שומר את רמת התיקון במאפיין ro.vendor.build.version.security_patch לקריאה בלבד.
    • תוכנת האתחול יכולה לספק ל-KeyMint גיבוב של כל הנתונים שאומתו על ידי Verified Boot.

התגים הבאים מתארים את פרטי הגרסה של המחיצות הרלוונטיות:

בהטמעות של KeyMint, צריך להתייחס לכל רמות התיקונים בנפרד. אפשר להשתמש במפתחות אם כל פרטי הגרסה תואמים לערכים המשויכים למפתח. אם גרסת המכשיר הנוכחית עדכנית יותר מכל ערך שמשויך למפתח, ‏KeyMint מחזירה את השגיאה KEY_REQUIRES_UPGRADE בכל ניסיון להשתמש במפתח. לאחר מכן, מערכת Keystore מבצעת את הפקודה IKeyMintDevice::upgradeKey() כדי ליצור keyblob חדש שמקושר לרמות התיקון הנוכחיות (ואז מערכת Keystore מוחקת את ה-keyblob הקודם באמצעות קריאה לפונקציה IKeyMintDevice::deleteKey()).