توضّح هذه الصفحة طريقة (بأعلى درجة من الثقة) لضمان إمكانية تشغيل إصدار شرعي من صورة Pixel على جهاز Pixel. يتضمّن ذلك تنزيل صورة المصنع على جهاز الكمبيوتر وإثبات تضمين السجلّ في العنصر الذي تم تنزيله قبل تثبيته على جهازك.
كيفية التحقّق من صورة نظام Pixel الأصلية
متطلبات الشهادة الأساسية
قبل المتابعة للتحقّق من أنّ العنصر (البرامج الثابتة أو حِزمة APK) يتوافق مع المطالبة، تأكَّد من توفّر الأدوات التالية على جهاز كمبيوتر متصل بشبكة. بناءً على هدف التحقّق، قد لا تحتاج إلى كل هذه المعلومات.
Golang
أداة التحقّق مكتوبة بلغة Go. لتثبيتها، يجب تثبيت الإصدار 1.24 من Go أو إصدار أحدث من موقع Go الإلكتروني.
Android Debug Bridge (ADB)
ADB هي أداة تتواصل مع جهاز Android لفحص الصورة أو استخراج حِزم APK، وهي متاحة على الموقع الإلكتروني لأدوات منصة Android SDK.
أداة التحقّق من صحة مستند إثبات التضمين
أداة التحقّق من صحة دليل التضمين هي وحدة Go برمجية تستعلم عن سجلّ الشفافية
وتحدّد ما إذا كان أحد العناصر مضمّنًا في السجلّ.
تم نشرها في android-binary-transparency مستودع GitHub على
https://github.com/android/android-binary-transparency/tree/main
لإنشاء نسخة طبق الأصل من مستودع AOSP avb، اتّبِع الخطوات التالية:
computer:~$ git clone https://android.googlesource.com/platform/external/avb
لاستنساخ مستودع android-binary-transparency GitHub، اتّبِع الخطوات التالية:
computer:~$ git clone https://github.com/android/android-binary-transparency
أداة تجميع الموارد في Android (AAPT2)
AAPT2 (أداة تجميع الموارد في Android) هي أداة إنشاء تُستخدَم لتجميع موارد تطبيق Android وتعبئتها. يمكن العثور عليها كأداة مستقلة في الإصدار 26.0.2 والإصدارات الأحدث من أدوات إنشاء حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
bundletool
bundletool هي أداة تُستخدَم لإنشاء "مجموعة حزمات تطبيق Android" (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، عليك أولاً إنشاء الحمولة المتوافقة مع تلك الصورة من "بصمة الإصبع" و"ملخّص VBMeta". هناك خياران، يدوي أو تلقائي، كما هو موضّح أدناه.
- الملف المرجعي للإصدار: معرّف سلسلة لصورة المصنع
- مثال:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
- مثال:
- ملخّص VBMeta: هو ملخّص تشفير SHA-256 يربط الأجزاء المختلفة من صور المصنع معًا
- مثال:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- مثال:
إنشاء الحمولة يدويًا
لإنشاء الحمولة يدويًا لأغراض التحقّق، عليك إنشاء ملف نصي payload.txt يحتوي على بصمة الإصدار في سطر واحد ثم ملخّص VBMeta في السطر التالي، مع سطر جديد فارغ (يُرجى الرجوع إلى قسم محتوى السجلّ لمعرفة التنسيق الدقيق).
بعد اتّباع الخطوات الواردة في موقع "صور المصنع" الإلكتروني، من المفترض أن يظهر محتوى الملف payload.txt على النحو التالي:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
استخراج ملخّص VBMeta وبصمة الإصدار من موقع "صور المصنع" على Pixel الإلكتروني
عند تنزيل صورة نظام المصنع من موقع "صور نظام المصنع" على Pixel، عليك فك ضغط الملف الذي تم تنزيله، ما سيؤدي إلى إنشاء مجلد آخر في المكان نفسه. انتقِل إلى المجلد الذي تم إنشاؤه حديثًا، وفكّ ضغط ملف image-*.zip المرتبط للحصول على ملفات *.img فردية. هذه الملفات الثنائية هي صور أقسام. تأكَّد من توفّر ملف vbmeta.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_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 نشرتها.
تتم كتابة مخرجات الأمر إلى الإخراج القياسي:
OK. inclusion check success!إذا كانت الصورة مضمّنة في السجلّ،FAILUREإذا لم يكن كذلك.