توضّح هذه الصفحة طرقًا مختلفة للتأكّد من أنّ حزمة APK المثبَّتة على جهاز Android تتوافق مع الادّعاء الوارد في نموذج المدّعي. يتضمّن ذلك سحب حزمة APK المعنيّة من جهازك، والتحقّق من سلامة الرمز البرمجي، وتقديم دليل على تضمين السجلّ في العنصر المستخرَج.
عملية التحقّق من الأهلية
يتم تنفيذ سجلّ الشفافية باستخدام شجرة Merkle تتألف من قيم تجزئة. تحتوي عقدة الورقة على بيانات، وتحتوي العقدة الأصل على تجزئة العقد التابعة لها.
بشكل أساسي، يتم إجراء عمليتَي حساب على شجرة Merkle للتحقّق من خاصية مقاومة التلاعب في سجلّات الشفافية، وهما إثبات التضمين وإثبات الاتساق. ويثبت الأخير أنّ السجلّ يتضمّن إدخالاً يتوافق مع إصدار معيّن من حِزمة APK. يتضمّن إدخال السجلّ تجزئة، وهي عبارة عن ترميز SHA256 لرمز توقيع الرمز البرمجي بتنسيق JSON Web Token (JWT)، ويمكن الحصول عليها من حِزم APK ذات الصلة. ويثبت الأخير أنّه عند إضافة إدخالات جديدة إلى الشجرة، تكون نقطة التحقّق الجديدة متوافقة (تشفيريًا) مع الإصدار السابق من الشجرة.
للتحقّق من صحة حزمة APK مشمولة، عليك إجراء اختبار إثبات التضمين استنادًا إلى نقطة تحقّق تم رصدها. يُرجى العِلم أنّنا نخطّط لدمج هذا السجلّ مع شبكة شهود عامة باستخدام بروتوكول شهود موحّد. سيوفّر ذلك نقطة تحقّق موثوقة تضمن اتساق السجلّ.
إذا أردت التأكّد من أنّ حزمة APK المتوفّرة على جهازك تتوافق مع الادّعاء الوارد في نموذج المدّعي، يُرجى الرجوع إلى النص أدناه.
مستند إثبات الإدراج
يمكن لمستخدم Android التأكّد من أنّ حزمة APK محمية على جهازه مضمّنة في السجلّ من خلال استخراج حزمة APK والبيانات الوصفية ذات الصلة أولاً، ثم مقارنة تجزئة الجذر التي تم إعادة احتسابها بتجزئة الجذر الواردة في نقطة التحقّق المنشورة. وفي حال تطابُقها، يمكن لمستخدم Android الاطمئنان إلى توفّر بعض وسائل الحماية الموضّحة في "نموذج التهديدات".
كيفية التحقّق من تضمين حزمة APK في السجلّ
كما هو موضّح سابقًا، يمكن العثور على قائمة بملفات APK التي يشملها التقرير حاليًا في صفحة "نظرة عامة".
متطلبات الشهادة الأساسية
قبل المتابعة للتحقّق من أنّ العنصر (البرامج الثابتة أو حِزمة 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.
قبل البدء، تأكَّد من إمكانية استخدام adb على جهازك من خلال تفعيل تصحيح أخطاء adb على جهازك.
بعد ذلك، ابحث عن مكان تثبيت حزمة APK على جهازك. لأغراض هذا الدليل، سنستخدم حزمة APK الخاصة بتطبيق خدمة التحقّق من مفتاح نظام التشغيل Android (com.google.android.contactkeys) كمثال عملي.
computer:~$ adb shell pm list packages -f | grep contactkeys
package:/data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk=com.google.android.contactkeys
إذا تم تثبيت حزمة APK الخاصة بتطبيق "خدمة التحقّق من مفتاح نظام التشغيل Android" على جهازك، سيعرض الأمر أعلاه مسارًا يشير إلى مكان تثبيتها على جهازك. وفي الحالات الأخرى، لن تظهر أي نتائج.
بعد ذلك، نزِّل حزمة APK من جهاز Android إلى الكمبيوتر الذي تعمل عليه باستخدام الأمر التالي (يُرجى العِلم بأنّ الموقع الفعلي واسم ملف APK على جهازك قد يختلفان):
computer:~$ mkdir -p /tmp/testdir && cd /tmp/testdir
computer:/tmp/testdir$ adb pull /data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk ./contactkeys_candidate.apk
للحصول على اسم حزمة APK التي نزّلتها للتو وبالتالي إثبات ملكيتها، عليك أولاً فك ضغط حزمة APK، لأنّ حزمة APK هي في النهاية نوع خاص من ملفات ZIP.
computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/
تؤدي هذه الخطوة إلى فك حزمة جميع الملفات التي يتكوّن منها ملف APK. يمكن العثور على اسم الحزمة وإصدارها في ملف البيان الخاص بحزمة APK، والذي يكون عادةً في ملف باسم AndroidManifest.xml.
ومع ذلك، فإنّ ملف البيان الذي تم الحصول عليه يكون بتنسيق ثنائي لا يمكن قراءته.
لتحويل ملف XML الثنائي إلى نموذج يمكن قراءته، نستخدم الأداة aapt2 التي تم تثبيتها سابقًا (كما هو مطلوب في قسم المتطلبات الأساسية).
computer:/tmp/testdir$ aapt2 dump badging ./contactkeys_candidate.apk
package: name='com.google.android.contactkeys' versionCode='7805' versionName='1.219.791156583' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
من الناتج أعلاه، يمكننا الآن التأكّد من أنّ اسم حزمة ملف APK هذا هو com.google.android.contactkeys ورقم الإصدار (versionCode) هو 1413.
الآن، سنبحث عن توقيع شفافية الرمز البرمجي داخل حزمة APK. يجب أن يكون ملفًا باسم code_transparency_signed.jwt مضمّنًا في المجلد META-INF بين الملفات الأخرى المستخرَجة من حزمة APK.
computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11 code_transparency_signed.jwt
باستخدام سلسلة التجزئة هذه، تتوفّر لدينا الآن كل المعلومات اللازمة لتجميع حمولة السجلّ وفقًا للتنسيق الموضّح في قسم محتوى السجلّ. في هذا المثال، من المفترض أن تبدو حمولة سجلّ البيانات المقابلة على النحو التالي:
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143
يجب أيضًا ملاحظة حرف السطر الجديد بعد إصدار الحزمة.
يمكنك حفظ المحتوى في ملف، مثل payload.txt. سيكون ذلك مفيدًا عند إجراء اختبار إثبات التضمين لاحقًا.
التحقّق من صحة توقيع رمز حزمة APK
الآن، علينا التحقّق من صحة الرمز المميز لتوقيع الرمز المضمّن في حزمة APK. وللقيام بذلك، نستخدم bundletool والمفتاح العام لمجموعة المفاتيح التي تم استخدامها لتوقيعها في المقام الأول. ويتم
نشرها ضمن كل قسم من حِزم APK المعنية. بافتراض أنّك حفظت شهادة المفتاح العام (على سبيل المثال، Android System Key Verifier) في ملف باسم signing_cert_pubkey.pem، اتّبِع الدليل أدناه لإجراء عملية التحقّق من توقيع الرمز.
عليك أولاً إنشاء أرشيف مضغوط وإضافة حزمة APK المرشّحة إلى الأرشيف المضغوط.
computer:/tmp/testdir$ zip -u test.zip contactkeys_candidate.apk
zip warning: test.zip not found or empty
adding: contactkeys_candidate.apk (deflated 58%)
computer:/tmp/testdir$ file test.zip
test.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
نحن الآن على استعداد لاستخدام الأمر bundletoolcheck-transparency للتحقّق مما إذا كان توقيع الرمز المضمّن في حزمة APK المرشّحة يتطابق مع التوقيع المنشور.
computer:/tmp/testdir$ java -jar BUNDLETOOL_INSTALL_PATH/bundletool-all-version.jar check-transparency \
--mode=apk \
--apk-zip=test.zip \
--transparency-key-certificate=signing_cert_pubkey.pem
APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): D9 E1 73 5B 2A 39 51 27 3A 87 35 B7 66 9E F1 9E F5 3A F1 C1 27 5C BA 31 39 3C 18 40 8B 03 79 D0
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.
يجب التأكّد من أنّ نتيجة الأمر أعلاه تشير إلى أنّه تم التحقّق من كلّ من توقيع شفافية الترميز وشفافية الترميز.
إذا لم تكن كذلك، مثلاً إذا ظهرت لك نتيجة مثل
Code transparency verification failed because the provided public key
certificate does not match the transparency file،
يعني ذلك أنّه من المحتمل أن تكون سلامة رمز APK المعني قد تم اختراقها، ويجب عدم الوثوق بملف APK.
يُرجى التأكّد من التحقّق من صحة الشهادات باستخدام شهادة المفتاح العام الصحيحة.
في حال عدم حدوث ذلك، وإذا كانت جميع المعلومات الأخرى صحيحة، يشير ذلك إلى أنّه تم التحقّق من صحة توقيع الرمز لملف APK الذي يتم التحقّق من صحته.
التحقّق من تضمين الحزمة (إثبات التضمين)
باستخدام الحمولة التي أنشأتها سابقًا، يمكنك الآن اختبار ما إذا كانت الحزمة المعنية قد تم تضمينها في سجلّ الشفافية.
تم نشر أداة إثبات التضمين في avb المستودع ضمن "مشروع Android مفتوح المصدر". لتشغيله:
computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/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=google_1p_code
يستخدم المدقّق نقطة التحقّق المقابلة ومحتوى السجلّ (الموجود في دليل المربّعات) للتأكّد من أنّ حمولة حزمة APK مضمّنة في سجلّ الشفافية، ما يثبت أنّ Google هي الجهة التي نشرتها.
تتم كتابة مخرجات الأمر إلى الإخراج القياسي:
OK. inclusion check success!إذا كان رمز الحزمة مضمّنًا في السجلّ،FAILUREإذا لم يكن كذلك.