פרטי הגרסה בנכסי 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;