יומן השקיפות הבינארית של Pixel מבוסס על טכנולוגיית יומן שקיפות.
השימוש ביומני שקיפות הוכח באמצעות שקיפות אישורים, פרוטוקול אינטרנט שמחייב רשויות אישורים לפרסם את האישורים שהן מנפיקות ביומני שקיפות אישורים ציבוריים. התהליך הזה הפחית באופן משמעותי את הטעויות בהנפקת אישורים, וכך שיפר את האבטחה באינטרנט. מפעילים רבים של יומנים של שקיפות אישורים מסתמכים על הטמעה של יומני שקיפות שנמצאת בכתובת transparency.dev.
יומני השקיפות מיושמים באמצעות עצי מרקל. בדף הזה מניחים שיש לכם ידע כללי בעצי מרקל ובשקיפות בינארית. במאמר Verifiable Data Structures יש סקירה כללית של עצי מרקל, ובדף הנחיתה יש סקירה כללית של שקיפות בינארית.
הטמעה של יומנים
יומן השקיפות הבינארית של Pixel מוטמע כעץ מרקל מבוסס-משבצות. התוכן הבסיסי של הכרטיס מוצג בכתובת https://developers.google.com/android/binary_transparency/tile. הערה: זה לא דף אינטרנט רגיל. צריך לקרוא את רשומות היומן שנמצאות בספריות המשנה שלו באופן פרוגרמטי באמצעות ספריית TLog של Golang SumDB ולא באמצעות דפדפן.
במאמר רישום תוכן ביומן מוסבר מה כוללים הערכים.
הגיבוב (hash) של שורש עץ מרקל של יומן, שמופיע בנקודת ביקורת, מוצג בכתובת https://developers.google.com/android/binary_transparency/checkpoint.txt. הוא מוצג בפורמט של נקודת ביקורת. העלים של עץ מרקל הזה מוצגים בכתובת https://developers.google.com/android/binary_transparency/image_info.txt. אפשר לאמת את החתימה של נקודת הבדיקה באמצעות המפתח הציבורי הבא:
-----BEGIN CERTIFICATE-----
MIICPDCCAeOgAwIBAgIVAPooxISw/nFF/dPwmCUaV36Z4s3hMAoGCCqGSM49BAMCMHQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYD
VQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAgFw0y
MTA3MTkyMjQxNDFaGA8yMDUxMDcxOTIyNDE0MVowdDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNh
bGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC0dvb2dsZSBJbmMuMRAw
DgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
QgAEU83uXNUiTYE53c2TfdWmqpW20bBXy4KEf5Ff8dV8GLKlVAXKHyjw3Lp9J3E0yCRJ/39XKeuA
AMF7KzSvhD248KNQME4wDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUHRpvuNkzjtBY213BWgUyWWHm
3VYwHwYDVR0jBBgwFoAUHRpvuNkzjtBY213BWgUyWWHm3VYwCgYIKoZIzj0EAwIDRwAwRAIgZsZb
CNBXRkCKLS+LG/41VWj1cTszt9QCdJQNuy7aT94CIDPgn7v5b1ykBVUTuLgRSofxAzHg9R4dg1oA
7tTFAuDg
-----END CERTIFICATE-----
תהליך האימות קורא את נקודת הבדיקה ואת המשבצות שמכילות את רשומות היומן מתוך היומן.
תהליך האימות
יומן שקיפות מיושם באמצעות עץ מרקל שמורכב מגיבובים. צומת עלה מכיל נתונים, וצומת הורה מכיל את הגיבוב של צאצאיו.
כדי לאמת את המאפיין של יומני שקיפות שמוכיח שהם לא שונו, מתבצעים שני חישובים בעץ מרקל: הוכחת הכללה והוכחת עקביות. האחרון מוכיח שהיומן כולל רשומה שמתאימה לגרסת תמונה, כלומר. רשומת היומן כוללת את תקציר VBMeta, גיבוב שמייצג את תמונות מערכת ההפעלה, שאפשר להחזיר ממכשיר. האחרון מוכיח שכאשר נוספים ערכים חדשים לעץ, נקודת הבדיקה החדשה עקבית עם הגרסה הקודמת של העץ.
כדי לאמת את תמונת Pixel, צריך לבצע את הוכחת ההכללה. ביצוע החישוב של הוכחת העקביות הוא אופציונלי, כי צדדים שלישיים מבצעים אותו באופן רציף.
כדי להכיר את מושגי האימות ב-Pixel Binary transparency, אתם יכולים לפעול לפי ההוראות הבאות כדי להשתמש בתמונה שפועלת במכשיר 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
הוכחת הכללה
בעל Pixel יכול לבדוק שהתמונה שלו נמצאת ביומן. לשם כך, הוא צריך קודם לחלץ את המטא-נתונים הרלוונטיים, ואז להשוות את הגיבוב הבסיסי שחושב מחדש לגיבוב הבסיסי שמופיע בנקודת הבדיקה שפורסמה. אם הם זהים, בעלי Pixel יכולים להיות בטוחים שהם נהנים מחלק מההגנות שמוצגות במודל האיומים.
כדי לוודא שהתמונה במכשיר Pixel נמצאת ביומן השקיפות, מתחברים למכשיר באמצעות adb, ואז מריצים את הפקודות הבאות:
FINGERPRINT=$(adb shell getprop ro.build.fingerprint)
VBMETA_DIGEST=$(adb shell getprop ro.boot.vbmeta.digest)
LOG_ENTRY="${FINGERPRINT}\n${VBMETA_DIGEST}\n"
PAYLOAD_PATH="/tmp/log_payload.txt"
echo -e $LOG_ENTRY >> $PAYLOAD_PATH
cd avb/tools/transparency/verify/
go build cmd/verifier/verifier.go
./verifier --payload_path=$PAYLOAD_PATH
הבית הראשון מאחזר את המטא-נתונים ממכשיר Pixel בפורמט של רשומה ביומן, ושומר אותם ב-/tmp/log_payload.txt.
הפסקה השנייה מפעילה את כלי האימות של הוכחת ההכללה שפורסם במאגר של הפעלה מאומתת של Android. הכלי הזה מחשב את הגיבוב של רשומת היומן המועמדת, מאחזר את הגיבובים האחרים שנדרשים לחישוב מחדש של נקודת הבדיקה מהיומן ומשווה אותה לנקודת הבדיקה שפורסמה על ידי היומן.
הפלט של הפקודה נכתב אל stdout:
-
OKאם התמונה כלולה ביומן, FAILUREאם לא.
הוכחת עקביות (אופציונלי)
Google מפרסמת מעת לעת גרסאות חדשות של תמונת המפעל של Pixel, ולכן יומן השקיפות גדל כל הזמן. עֵד בודק שהעץ גדל באופן שתואם לעלים הקודמים שלו. העֵד עוקב אחרי הגיבוב של שורש העץ, ומחשב את הגיבוב הבא של שורש מועמד על ידי בקשת הגיבובים החדשים של העלים מהעץ. כדי שיומן שקיפות יהיה עמיד בפני שינויים לא מורשים, צריך לבדוק אותו באופן רציף כדי לוודא שהוא עקבי.
התנהגות הוספה בלבד של יומן השקיפות נבדקת באופן פעיל על ידי צדדים שלישיים, ולכן רוב המשתמשים לא צריכים לעשות זאת בעצמם, אבל כל אחד יכול לעקוב אחר העקביות של היומן. Google פרסמה הטמעה של עד בקוד פתוח במאגר GitHub הזה. צריך להשתמש בהגדרה שספציפית ליומן של Pixel Binary Transparency (PixelBT).