שיטת האימות

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

איך מאמתים את תמונת המפעל של Pixel

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

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

Golang

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

ממשק הגישור של Android‏ (ADB)

ADB הוא כלי שמתקשר עם מכשיר Android כדי לבדוק את התמונה או לחלץ קובצי APK. הכלי זמין באתר Android SDK Platform Tools.

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

הכלי לאימות הוכחת ההכללה הוא מודול Go שמבצע שאילתה ביומן השקיפות ומחזיר פלט שמציין אם ארטיפקט כלול ביומן. היא מתפרסמת במאגר GitHub בכתובת android-binary-transparencyhttps://github.com/android/android-binary-transparency/tree/main

כדי לשכפל את מאגר avb AOSP:

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

כדי לשכפל את מאגר android-binary-transparency ב-GitHub:

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

‫AAPT2 (Android Asset Packaging Tool) הוא כלי לבנייה שמשמש לקומפילציה ולאריזה של משאבים של אפליקציית Android. הכלי הזה זמין ככלי עצמאי ב-Android SDK Build Tools מגרסה 26.0.2 ואילך.

bundletool

bundletool הוא כלי שמשמש לבניית קובץ Android App Bundle ‏ (AAB). אפשר להשתמש בו גם כדי לאמת חתימות של קוד APK. אפשר להוריד אותו מ-GitHub.

wget או curl

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

Avbtool

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

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool הוא סקריפט Python שמשמש לפריקת רכיבים בודדים ב-bootloader.img של Pixel. אם אתם מאמתים קובצי APK, לא צריך לבצע את הפעולה הזו. הכלי הזה חשוב כי הוא מאפשר ל-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

בניית מטען ייעודי (payload) לאימות

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

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

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

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

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

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
שליפת סיכום VBMeta וטביעת אצבע של גרסת ה-Build מאתר תמונת המפעל של Pixel

כשמורידים תמונת מערכת מהאתר תמונות המערכת של 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

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

אחרי ש-avbtool.py יהיה זמין ל-$PATH, תוכלו להריץ את הפקודות הבאות מהטרמינל כדי לחלץ את טביעת האצבע של הגרסה ולחשב את הגיבוב של 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, כפי שהם מתוארים בנפרד במבנה 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 שתוכלו להשתמש בו. בעזרת הכלי הזה, במקום לשלוף ולבטל את הדחיסה של קבצים באופן ידני, צריך רק לציין את כתובת ה-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), מגדירים משתנה של מעטפת (shell) (למשל, $PAYLOAD_PATH) שיצביע על הנתיב למטען הייעודי.

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

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 אם לא.