التحقّق الكامل من شفافية تطبيقات منتجات Google

توضّح هذه الصفحة كيفية التأكّد من أنّ حزمة 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

لاستنساخ مستودع 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

إنشاء حمولة للتحقّق

لإثبات صحة حزمة 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 إلى أنّه تم التحقّق من صحة الحزمة تشفيرًا باستخدام سجلّ الشفافية، ما يؤكّد أنّها تتوافق مع الادعاءات الواردة في السجلّ.