פרטי הגרסה בנכסי AVB

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

  • com.android.build.system.os_version -> '12'
  • com.android.build.system.security_patch -> '2022-02-05'
  • com.android.build.vendor.os_version -> '12'
  • com.android.build.vendor.security_patch -> '2022-02-05'
  • com.android.build.boot.os_version -> '12'
  • com.android.build.boot.security_patch -> '2022-02-05'

טוען האתחול של המכשיר יכול לקבל את מאפייני ה-AVB האלה מקובץ vbmeta באמצעות avb_property_lookup(). אפשר לטעון כמה תמונות vbmeta באמצעות ‫avb_slot_verify() והן מאוחסנות בפרמטר הפלט ‫AvbSlotVerifyData**out_data.

פורמט ברירת המחדל של פרטי הגרסה

כברירת מחדל, מערכת ה-build של Android משתמשת בפורמט הבא לגרסת מערכת ההפעלה ולעדכון האבטחה, בהתאמה.

הפורמט של com.android.build.${partition}.os_version הוא A[.B.C], לדוגמה, 12 או 12.0.0:

  • ‫A: הגרסה הראשית
  • ‫B: גרסה משנית, ברירת המחדל היא אפס אם היא לא מופיעה
  • ‫C: גרסה משנית, ברירת המחדל היא אפס אם היא לא מופיעה

הפורמט של com.android.build.${partition}.security_patch הוא YYYY-MM-DD.

כברירת מחדל, מערכת ה-build יוצרת com.android.build.${partition}.security_patch עבור המחיצות system, ‏ system_ext ו-product. יצרן המכשיר צפוי להגדיר את BOOT_SECURITY_PATCH, את VENDOR_SECURITY_PATCH ותיקונים אחרים למחיצות שאינן מערכת. לדוגמה:

  • BOOT_SECURITY_PATCH := 2022-01-05 יוצר
    • com.android.build.boot.security_patch -> '2022-01-05'
  • VENDOR_SECURITY_PATCH := 2022-02-05 יוצר
    • com.android.build.vendor.security_patch -> '2022-02-05'

יצרן המכשיר יכול להגדיר את *_SECURITY_PATCH לערך $(PLATFORM_SECURITY_PATCH) אם הוא תמיד מעדכן את כל המחיצות לגרסה עם אותה רמה של תיקוני אבטחה.

  • BOOT_SECURITY_PATCH := $(PLATFORM_SECURITY_PATCH)
  • VENDOR_SECURITY_PATCH := $(PLATFORM_SECURITY_PATCH)

ציון פרטי גרסה בהתאמה אישית

החל מ-Android 13, לכל גרסת build של מכשיר יכול להיות ערך מותאם אישית של גרסת מערכת ההפעלה, שניתן לזיהוי על ידי טוען האתחול של המכשיר. לדוגמה:

  • SYSTEM_OS_VERSION := 12.0.0 יוצר
    • com.android.build.system.os_version -> '12.0.0'
  • BOOT_OS_VERSION := a.b.c יוצר
    • com.android.build.boot.os_version -> 'a.b.c'
  • VENDOR_OS_VERSION := 12.0.1 יוצר
    • com.android.build.vendor.os_version -> '12.0.1'

פרטי הגרסה שיצאה משימוש בכותרת של קובץ האימג' לאתחול

ב-Android מגרסה 9 ואילך, הקישור לגרסה של Keymaster 4 מציע להסיר את os_version מהכותרת boot.img.

לצורך השוואה, מתואר כאן גם השימוש המיושן בקבלת פרטי הגרסה מכותרת קובץ אימג' לאתחול. שימו לב שהשדה os_version בכותרת האתחול משלב את גרסת מערכת ההפעלה ואת רמת תיקון האבטחה למספר שלם לא חתום בן 32 ביט. בנוסף, המנגנון הזה מניח שכל התמונות יעודכנו יחד, אבל ההנחה הזו כבר לא רלוונטית אחרי המודולריזציה של המחיצות בפרויקט Treble.

// Operating system version and security patch level.
// For version "A.B.C" and patch level "Y-M-D":
//   (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M)
//   A = os_version[31:25]
//   B = os_version[24:18]
//   C = os_version[17:11]
//   Y = 2000 + os_version[10:4]
//   M = os-version[3:0]

uint32_t os_version;