שיטת האימות

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

איך מאמתים את קובץ האימג' של Pixel להגדרות המקוריות

דרישות מוקדמות לאימות

לפני שתמשיך ותבדוק שתמונת המקור שהורדת תואמת לטענה שלנו, עליך לבצע את הפעולות הבאות במחשב שמחובר לרשת.

Golang

כלי האימות נכתב ב-Go. כדי ליצור אותו, צריך להתקין את Go בגרסה 1.17 ואילך מאתר Go.

wget או curl

wget ו-curl הם כלים שאפשר להשתמש בהם כדי לאחזר או להוריד קבצים מהאינטרנט. חשוב לוודא שאחד מהכלים האלה מותקן במערכת, כי שאר המדריך והסקריפט שאנחנו מספקים תלויים באחד מהם.

Avbtool

avbtool משמש לחישוב של תקציר VBMeta של קובצי האימג' של המפעל ולאימות של קבצים בינאריים.

אפשר להוריד אותו מהמאגר של AOSP באמצעות הפקודה הבאה, ולמצוא פרטים נוספים במסמכי העזרה המקושרים.

computer:~$ git clone https://android.googlesource.com/platform/external/avb

אחרי שכפול המאגר, אפשר למצוא את avbtool.py בתיקיית המאגר avb ששולבו. בנוסף, צריך להוסיף את הספרייה הזו למשתנה הסביבה $PATH.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

מאמת הוכחת הכללה

מאמת הוכחת ההכללה הוא מודול Go שמבצע שאילתה ביומן השקיפות של התמונות ב-Pixel Factory ומציג את הפלט של הבדיקה אם תמונה כלולה ביומן.

אחרי שכפול המאגר של AVB שמתואר למעלה, קוד המקור של המאמת נמצא ב-tools/transparency/verify/

Fbpacktool

fbpacktool הוא סקריפט Python שמשמש לפריקת רכיבים נפרדים ב-bootloader.img של Pixel. הכלי הזה חשוב כדי לאפשר ל-avbtool.py לגלות את התמונות הנדרשות לאימות.

כדי להשתמש בכלי הזה, צריך להוריד את שלושת הסקריפטים הבאים של Python לספרייה שבה נמצא avbtool.py, להפוך את fbpacktool.py לתוכנית הפעלה וליצור קישור סימלי בשם fbpacktool ל-fbpacktool.py למען הנוחות.

אם יש לכם wget, תוכלו להשתמש בפקודה הבאה כדי להוריד את שלושת הסקריפטים:

computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

אם יש לכם את curl, תוכלו להשתמש בפקודות הבאות כדי להוריד את שלושת הסקריפטים:

computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

OpenSSL

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

computer:~$ which openssl
/usr/bin/openssl

יצירת מטען נתונים לאימות

כדי לאמת את קובץ האימג' במכשיר או קובץ האימג' שהורדתם מהאתר Pixel Factory Image, תחילה צריך ליצור את עומס העבודה התואם לקובץ האימג' הזה מ-Build Fingerprint ו-VBMeta Digest. יש שתי אפשרויות, ידנית או אוטומטית, כפי שמתואר בהמשך.

  • מאפיינים ייחודיים של גרסת build: מזהה מחרוזת של קובץ האימג' המקורי
    • לדוגמה: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • VBMeta Digest: סיכום קריפטוגרפית מסוג SHA-256 שמקשר את החלקים השונים של קובצי האימג' המקוריים יחד
    • לדוגמה: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

יצירה ידנית של מטען ייעודי (payload)

כדי ליצור את עומס העבודה לאימות באופן ידני, צריך ליצור קובץ טקסט, payload.txt, שמכיל את טביעת האצבע של ה-build בשורה אחת ואז את הסיכום של VBMeta בשורה הבאה, עם שורה חדשה ריקה (הפורמט המדויק מפורט בקטע 'תוכן היומן').

אחרי שמבצעים את השלבים שמפורטים באתר של קובץ האימג' המוגדר כברירת מחדל, התוכן של הקובץ payload.txt אמור להיראות כך:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
חילוץ של VBMeta Digest ו-Build Fingerprint מהאתר של Pixel Factory Image

כשמורידים קובץ אימג' להגדרות המקוריות מאתר קובצי האימג' להגדרות המקוריות של Pixel, צריך לפתוח את הקובץ שהורדתם באמצעות תוכנת ניהול הארכיונים, וכך תיווצר תיקייה אחרת. עוברים לתיקייה החדשה שנוצרה ומפרקים את הקובץ המשויך image-*.zip כדי לקבל קבצים *.img נפרדים. הקבצים הבינאריים האלה הם קובצי אימג' של מחיצות. מוודאים שקיים קובץ vbmeta.img בקרב קובצי ה-img. התוצאה אמורה להיראות כך:

computer:oriole-sd1a.210817.015.a4$ unzip image-oriole-sd1a.210817.015.a4.zip
Archive:  image-oriole-sd1a.210817.015.a4.zip
  inflating: android-info.txt
  inflating: boot.img
  inflating: vendor_boot.img
  inflating: system.img
  inflating: vendor.img
  inflating: product.img
  inflating: system_ext.img
  inflating: system_other.img
  inflating: dtbo.img
  inflating: vbmeta_system.img
  inflating: vbmeta.img
  inflating: super_empty.img

אפשר לחלץ את טביעת האצבע של ה-build ולחשב את הסיכום VBMeta מכל הקבצים שהורדתם.

אחרי ש-avbtool.py יהיה זמין ב-$PATH, תוכלו להריץ את הפקודות הבאות מהטרמינל כדי לחלץ את טביעת האצבע של ה-build ולחשב את הסיכום של VBMeta של קובץ האימג' המקורי שהורדתם:

computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\..*build\.fingerprint=google/.*/release-keys' system.img | cut -f2 -d'='
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
computer:dir_containing_unzipped_factory_image$ avbtool.py calculate_vbmeta_digest --image vbmeta.img
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
אימות ידני של קובץ גיבוי קושחה שהורדתם

כדי לאמת בצורה נכונה את קובץ האימג' שהורדתם מהמפעל, תצטרכו להוריד את הקובץ fbpacktool.py ואת שני קובצי Python האחרים שהוא תלוי בהם (fbpack.py ו-packedstruct.py) כדי לפתוח את הרכיבים ב-bootloader.img, כי הם מתוארים בנפרד ב-struct של VBMeta. אחרי שתקבלו את הכלי לביטול האריזה, תוכלו להשתמש ב-fbpacktool.py כדי לפתוח את קובץ האימג' של מנהל האתחול. לדוגמה:

computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img

אמורים להופיע בספרייה הזו קבצים נוספים בפורמט ‎ .img. עכשיו אפשר להשתמש ב-avbtool.py כדי לאמת באופן ידני שהחתימות של המחיצות השונות תואמות.

computer:dir_containing_unzipped_images$ avbtool.py verify_image --image vbmeta.img --follow_chain_partitions
Verifying image vbmeta.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta.img
vbmeta_system: Chained but ROLLBACK_SLOT (which is 1) and KEY (which has sha1 df529646b7225015196a714006346f0768b87fcf) not specified
--
Verifying image vbmeta_system.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_system.img
product: Successfully verified sha256 hashtree of product.img for image of 2700468224 bytes
system: Successfully verified sha256 hashtree of system.img for image of 878493696 bytes
system_ext: Successfully verified sha256 hashtree of system_ext.img for image of 251334656 bytes
vbmeta_vendor: Chained but ROLLBACK_SLOT (which is 3) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image vbmeta_vendor.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_vendor.img
vendor: Successfully verified sha256 hashtree of vendor.img for image of 472940544 bytes
boot: Chained but ROLLBACK_SLOT (which is 2) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image boot.img using embedded public key
vbmeta: Successfully verified footer and SHA256_RSA4096 vbmeta struct in boot.img
boot: Successfully verified sha256 hash of boot.img for image of 24481792 bytes
abl: Successfully verified sha256 hash of abl.img for image of 1744896 bytes
bl1: Successfully verified sha256 hash of bl1.img for image of 12288 bytes
bl2: Successfully verified sha256 hash of bl2.img for image of 544768 bytes
bl31: Successfully verified sha256 hash of bl31.img for image of 86016 bytes
dtbo: Successfully verified sha256 hash of dtbo.img for image of 2152234 bytes
gsa: Successfully verified sha256 hash of gsa.img for image of 262144 bytes
ldfw: Successfully verified sha256 hash of ldfw.img for image of 4096000 bytes
pbl: Successfully verified sha256 hash of pbl.img for image of 49152 bytes
tzsw: Successfully verified sha256 hash of tzsw.img for image of 4304896 bytes
vendor_boot: Successfully verified sha256 hash of vendor_boot.img for image of 25718784 bytes
vendor_dlkm: Successfully verified sha256 hashtree of vendor_dlkm.img for image of 54505472 bytes

אם לא מופיעות הודעות שגיאה או כישלון, סימן שה-VBMeta של התמונה שהורדתם אומת בהצלחה.

יצירת עומס נתונים אוטומטי

לנוחיותך, סיפקנו גם סקריפט Python שאפשר להשתמש בו. בעזרת הכלי הזה, במקום לאחזר קבצים ולפתוח אותם בפורמט zip באופן ידני, צריך רק לציין את כתובת ה-URL של קובץ האימג' של המפעל.

computer:dir_to_avb_repo/tools/transparency$ python3 ./pixel_factory_image_verify.py https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Fetching file from: https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Successfully downloaded file.
Successfully unpacked factory image.
Successfully unpacked factory image partitions.
Successfully unpacked bootloader image.
Successfully verified VBmeta.
Successfully extracted build fingerprint.
Successfully calculated VBMeta Digest.
The build fingerprint for factory image is: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
The VBMeta Digest for factory image is: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

A corresponding "payload.txt" file has been created.

הפעלת הפקודה שלמעלה תגרום להורדה של חבילת קובץ האימג' של המפעל, לחילוץ החבילה ולאימות החתימות של המחיצות החתולות. אחרי האימות, ייווצר קובץ חדש בשם payload.txt, והתוכן שלו אמור להיראות כך:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

אחרי שיוצרים את הקובץ payload.txt, אפשר להתחיל לבצע את השלבים לאימות של הכללת תמונות.

אימות הכללת התמונה (הוכחת הכללה)

אחרי שיוצרים את עומס העבודה, מגדירים משתנה מעטפת (למשל $PAYLOAD_PATH) כך שיצביע על הנתיב אל עומס העבודה.

פורסם כלי להוכחת הכללה במאגר avb בפרויקט Android Open Source Project. כדי להריץ אותו:

computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=../payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=pixel

המאמת משתמש בנקודת הבקרה ובתוכן היומן (שנמצא בספריית המשבצות) כדי לבדוק שעומס העבודה של התמונה נמצא ביומן השקיפות, כלומר ש-Google פרסמה אותו.

הפלט של הפקודה נכתב ל-stdout:

  • OK. inclusion check success! אם התמונה כלולה ביומן,
  • FAILURE אם הוא לא מופיע.