توضّح هذه الصفحة طريقة (بأعلى درجة من الثقة) لضمان إمكانية تشغيل إصدار شرعي من صورة Pixel على جهاز Pixel. يتضمّن ذلك تنزيل نسخة برامج الجهة المصنِّعة على الكمبيوتر و إجراء إثبات تضمين السجلّ على العنصر الذي تم تنزيله قبل نقله إلى جهازك.
كيفية التحقّق من صورة المصنع على جهاز Pixel
متطلبات الشهادة الأساسية
قبل المتابعة للتحقّق من أنّ العنصر (البرامج الثابتة أو حزمة APK) يتوافق مع الادّعاء، تأكَّد من توفُّر الأدوات التالية على كمبيوتر متصل بالشبكة. بناءً على هدف التحقّق، قد لا تحتاج إلى جميع هذه الأدوات.
Golang
تمت كتابة أداة التحقّق بلغة Go. لإنشائها، ثبِّتوا الإصدار 1.24 من Go أو إصدارًا أحدث من موقع Go الإلكتروني.
Android Debug Bridge (ADB)
ADB هي أداة تتواصل مع جهاز Android لفحص الصورة أو
استخراج حِزم APK، وهي متاحة على موقع Android SDK Platform Tools الإلكتروني.
أداة التحقّق من إثبات التضمين
أداة التحقّق من إثبات التضمين هي وحدة 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
AAPT2
AAPT2 (أداة تجميع الموارد في Android) هي أداة إنشاء تُستخدَم لتجميع موارد تطبيق Android وتعبئتها. يمكن العثور عليها كأداة مستقلة في Android SDK Build Tools الإصدار 26.0.2 والإصدارات الأحدث.
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 يُستخدَم لفك حزمة المكوّنات الفردية في Pixel's
bootloader.img.
لا تحتاجون إلى هذه الأداة إذا كنتم تتحقّقون من حِزم APK.
هذه الأداة مهمة لأنّها تتيح لأداة avbtool.py اكتشاف الصور المطلوبة للتحقّق.
تتطلّب fbpacktool الإصدار 3.6 من Python أو إصدارًا أحدث وحزمة
PyYAML (على سبيل المثال، python3 -m pip install pyyaml).
لاستخدام هذه الأداة، يجب تنزيل النصوص البرمجية الستة التالية بلغة Python
في الدليل الذي يتضمّن avbtool.py،
وجعل fbpacktool.py قابلاً للتنفيذ،
وإنشاء رابط رمزي باسم fbpacktool إلى fbpacktool.py لتسهيل الاستخدام.
في حال توفُّر wget:
computer:dir_to_avbtool$ wget https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
في حال توفُّر curl:
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.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 الإلكتروني، يجب أولاً إنشاء الحمولة المقابلة لتلك الصورة من الملف المرجعي للإصدار وملخّص 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 Factory Image الإلكتروني
عند تنزيل صورة مصنع من
موقع Pixel Factory Image الإلكتروني، يجب فك ضغط الملف الذي تم تنزيله، ما سيؤدي إلى إنشاء مجلد آخر في
المكان نفسه. انتقِلوا إلى المجلد الذي تم إنشاؤه حديثًا، وفكّوا ضغط ملف 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\.product\.build\.fingerprint=google/.*/release-keys' product.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 الأخرى التي يعتمد عليها (راجِعوا
Fbpacktool في المتطلبات الأساسية للاطّلاع على القائمة الكاملة وأوامر
التنزيل)
لفك حزمة المكوّنات في 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 بنجاح، يمكنكم بدء خطوات التحقّق من تضمين الصورة.
التحقّق من تضمين الصورة (إثبات التضمين)
بعد إنشاء الحمولة، اضبطوا متغيّر 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 نشرتها.
تتم كتابة ناتج الأمر في الإخراج العادي:
OK. inclusion check success!إذا كانت الصورة مضمّنة في السجلّ،FAILUREإذا لم تكن مضمّنة.