توضّح هذه الصفحة كيفية التحقّق من أنّ ملف APK أو APEX المثبَّت على جهاز Android يتوافق مع الادّعاءات الواردة في نموذج المدّعي. تتضمّن العملية سحب حزمة APK من جهازك وإجراء إثبات تضمين السجلّ على العنصر المستخرَج.
عملية التحقّق من المعلنين
يتم تنفيذ سجلّ الشفافية باستخدام شجرة Merkle تتألف من تجزئات. تحتوي العقدة الطرفية على بيانات، وتحتوي العقدة الرئيسية على تجزئة العقد الفرعية.
يتم إجراء عمليتَين حسابيتَين أساسيتَين للتحقّق من خاصية مقاومة التلاعب في سجلّات الشفافية: إثبات التضمين وإثبات الاتساق. يؤكّد إثبات التضمين أنّ السجلّ يتضمّن إدخالاً لإصدار معيّن من حزمة APK. يحتوي إدخال في السجلّ هذا على تجزئة، وهي سلسلة تمت تجزئتها SHA256 لملف APK المثبَّت على الجهاز. يضمن إثبات الاتساق أنّه عند إضافة إدخالات جديدة، تظل نقطة التحقّق الجديدة متسقة من الناحية التشفيرية مع الإصدارات السابقة من الشجرة (أو أنّه لم يتم التلاعب بالشجرة). نركّز في هذا الدليل على عملية احتساب دليل التضمين، مع الاعتماد على الشهود لتنفيذ دليل الاتساق باستمرار مقارنةً بأحدث نقاط التحقّق.
للتحقّق من ملف APK مشمول، يجب إجراء إثبات تضمين مقابل نقطة تفتيش تمت مشاهدتها. يُرجى العِلم أنّنا نخطّط لدمج هذا السجلّ مع شبكة شهود عامة باستخدام بروتوكول شهود موحّد. ستوفّر عملية الدمج هذه نقاط تفتيش موثوقة، ما يضمن اتساق السجلّ.
للتحقّق من أنّ تطبيقات Google على جهازك تتوافق مع الادّعاءات الواردة في نموذج المدّعي، اتّبِع الخطوات التالية.
إثبات التضمين
يمكنك التحقّق من أنّ حزمة APK المشمولة على جهازك مُدرَجة في السجلّ من خلال استخراج حزمة APK وحساب تجزئتها واستخدام إثبات التضمين للتحقّق مما إذا كانت هذه التجزئة موجودة في نقطة التحقّق المنشورة. يوفّر دليل الإدراج الناجح ضمانًا ضد المخاطر الموضّحة في "نموذج التهديدات"، ويؤكّد أنّ التطبيق هو تطبيق شرعي من Google.
كيفية التحقّق من تضمين ملف APK في السجلّ
ويمكن التحقّق من أي تطبيق يدّعي أنّه تطبيق Google تابع لجهة خارجية من خلال هذا السجلّ.
متطلبات الشهادة الأساسية
قبل المتابعة للتحقّق من أنّ العنصر (البرامج الثابتة أو حِزمة 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
لاستنساخ مستودع GitHub الخاص بـ android-binary-transparency:
computer:~$ git clone https://github.com/android/android-binary-transparency
أداة تجميع الموارد في Android (AAPT2)
AAPT2 (أداة تجميع الموارد في Android) هي أداة إنشاء تُستخدَم لتجميع موارد تطبيق Android وحزمها. ويمكن العثور عليها كأداة مستقلة في أدوات إنشاء حزمة تطوير البرامج (SDK) لنظام التشغيل Android الإصدار 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 برمجي يُستخدَم لفك حزم المكوّنات الفردية في ملف
bootloader.img على أجهزة Pixel.
ولن تحتاج إلى ذلك إذا كنت تتحقّق من حِزم 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
إنشاء حمولة للتحقّق
لإثبات صحة حزمة APK التي تم استخراجها، عليك إنشاء حمولة سجلّ باستخدام المعلومات المستمَدة من حزمة APK نفسها.
قبل البدء، عليك تفعيل تصحيح أخطاء الجهاز عبر USB للسماح باتصالات adb.
بعد ذلك، ابحث عن ملف APK المثبَّت على جهازك. يستخدم هذا الدليل حزمة APK الخاصة بخدمات Google Play (com.google.android.gms) كمثال عملي.
adb shell pm path com.google.android.gms
ينبغي أن تظهر مُخرجات مشابهة لما يلي:
computer:~$ adb shell pm path com.google.android.gms
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/base.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_CronetDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteLoader_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesA_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesC_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_GoogleCertificates_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MapsDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MeasurementDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.en.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.xxhdpi.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_maps_core_dynamite_ondemand.apk
يشير هذا الناتج إلى أنّه تم تثبيت حزمة APK أساسية وعدة حِزم APK مقسّمة
للتطبيق com.google.android.gms على جهازك.
يختلف العدد الدقيق لحِزم APK المقسّمة حسب إعدادات جهازك.
تتشارك كل حزمة APK مجزّأة اسم الحزمة ورمز الإصدار نفسهما مع حزمة APK الأساسية.
نزِّل حزم APK المدرَجة من جهاز Android إلى الكمبيوتر باستخدام الأمر التالي (مع ملاحظة أنّ مسارات الملفات الفعلية قد تختلف):
mkdir -p /tmp/testdir/gms && cd /tmp/testdir/gms && \
adb shell pm path com.google.android.gms | cut -d':' -f2 | tr -d '\r' | xargs -n1 adb pull
للتحقّق من اسم الحزمة وإصدار حِزم APK التي تم تنزيلها، عليك فحص ملف البيان (AndroidManifest.xml).
بما أنّ ملف البيان داخل حزمة APK يكون بتنسيق ثنائي، استخدِم أداة aapt2
(التي تم تثبيتها خلال خطوة المتطلبات الأساسية) لاستخراج المعلومات وقراءتها
مباشرةً من حزمة APK:
computer:/tmp/testdir/gms$ aapt2 dump badging ./base.apk
package: name='com.google.android.gms' versionCode='260834035' versionName='26.08.34 (260400-876566425)' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
minSdkVersion:'35'
targetSdkVersion:'36'
...
يجب تكرار هذه الخطوة للحصول على المعلومات ذات الصلة إلى أن يتم احتساب جميع حزم APK المجزّأة المثبَّتة على جهازك.
تؤكّد النتيجة أنّ اسم حزمة APK هو com.google.android.gms ورقم
إصدارها (versionCode) هو 260834035.
بعد ذلك، احسب التجزئة التشفيرية لكل حزمة APK:
computer:/tmp/testdir/gms$ sha256sum *.apk
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a base.apk
c20754aee886cc55a9de91ee15c623c59d94ad22b7e435a1a48afc43cf1a106c split_config.en.apk
68c09b63a1262e0d34020c139bc77deff3c32bd2b01177abac64790a62fb3be6 split_config.xxhdpi.apk
cd746820c27babd855fa5daea6fabcdf7b44abf3060bc547adc4219212410af0 split_CronetDynamite_installtime.apk
512ee48b60fdb0787a17f84a7dc448fdbf885b2b86a9cb50525d4c22d561b0f1 split_DynamiteLoader_installtime.apk
9e0c74bdc75c50c80d4e2e580a7eda6b8391423ab1161645f41ec6cadc07d678 split_DynamiteModulesA_installtime.apk
955780ac01f59b98bd9be12968f3824ad71b762620f7bf223c569c1a6ab7056c split_DynamiteModulesC_installtime.apk
34c4a2e32d31554d55fc1519e2cfc3ed5027a090fb29b54cfc99f42d1da43bc5 split_GoogleCertificates_installtime.apk
475e18dde92472cde9d8300c082b6dc269613db03398bcd9d1987dff3e68f7b5 split_maps_core_dynamite_ondemand.apk
f83faf40f08bc13f4879302e01c08c863ca2304b4b4e7c9eaf8cd1e869bb6573 split_MapsDynamite_installtime.apk
ec6d854ddda6cd1ba2ba7af2d9fdf4f28c5c78be8713c64521c785429296738c split_MeasurementDynamite_installtime.apk
أصبحت لديك الآن كل المعلومات المطلوبة لإنشاء حمولة سجلّ، منسَّقة كما هو موضح في قسم "محتوى السجلّ". على سبيل المثال، إذا اخترنا تجزئة واحدة من النتائج (يجب التحقّق من تجزئة كل حزمة APK مجزّأة)، ستظهر حمولة السجلّ على النحو التالي:
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
تأكَّد من تضمين حرف سطر جديد في نهاية الملف. احفظ هذا المحتوى في ملف، مثل payload.txt، لاستخدامه مع أداة verifier لاحقًا.
إثبات تضمين الحزمة
بعد إنشاء الحمولة، يمكنك الآن التحقّق مما إذا كانت الحزمة مضمّنة في
سجلّ الشفافية. أنشئ أداة إثبات التضمين من مستودع android-binary-transparency الذي نسخته سابقًا:
go build cmd/verifier/verifier.go
من المفترض أن يؤدي ذلك إلى إنشاء ملف تنفيذي باسم verifier في هذا الدليل.
شغِّل أداة التحقّق، مع توفير المسار إلى الحمولة وتحديد نوع السجلّ:
computer:android-binary-transparency$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:android-binary-transparency$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_apk
يستخدم المدقّق نقطة التحقّق ومحتوى السجلّ (من دليل المربّعات) للتأكّد من أنّ حمولة APK موجودة في سجلّ الشفافية، ما يؤكّد أنّ Google هي التي نشرتها.
يُخرج الأمر إلى stderr:
OK. inclusion check success!إذا كانت الحزمة مضمّنة في السجلّFAILUREإذا لم يكن كذلك.
التحقّق تلقائيًا من جميع الحزم في الجهاز
نظرًا إلى عدد تطبيقات Google التي قد تكون مثبَّتة مسبقًا على جهازك، قد يكون تعداد كل تطبيق وإجراء إثباتات التضمين بشكل فردي أمرًا شاقًا.
نوفّر أداة آلية أخرى تُسمى Uraniborg يمكنها رصد وقياس
جميع الحزم المثبّتة حاليًا على جهازك.
وتُدخل هذه الميزة نتائجها مباشرةً إلى أداة verifier، ما يتيح لك اكتشاف شفافية جميع التطبيقات على جهازك والتحقّق منها في خطوة واحدة.
لاستخدام سير العمل المبرمَج هذا، تأكَّد من ربط جهاز Android بجهاز الكمبيوتر من خلال ADB. يتضمّن مستودع android-binary-transparency أيضًا الرمز المصدر Uraniborg.
نفِّذ النص البرمجي automate_observation.py الموجود في الدليل scripts/python:
python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>
عند اكتمال النص البرمجي، من المفترَض أن تظهر لك نتيجة مماثلة لما يلي:
INFO:automate_observation.py:main(858): SUCCESS! Hubble was successfully deployed and executed on connected device ABCDEFGHN01234.
INFO:automate_observation.py:main(860): Hubble output files can be found at: /Users/user/home/src/android-binary-transparency/uraniborg/scripts/python/results/google/lynx/lynx:16/BP4A.260105.004.E1/14587043:user/release-keys/001
انتقِل إلى دليل الإخراج الذي يشير إليه النص البرمجي.
في الداخل، ابحث عن الملف باسم packages_with_inclusion_proof_signal.txt.
يسرد هذا الملف كل حزمة مثبّتة إلى جانب حقل inclusion_proof_verified مضبوط على true أو false.
تشير القيمة true إلى أنّه تم التحقّق من الحزمة بطريقة مشفّرة
باستخدام سجلّ الشفافية، ما يؤكّد توافقها
مع ادعاءات السجلّ.