توضّح هذه الصفحة طرقًا مختلفة للتأكّد من أنّ حزمة APK المثبَّتة على جهاز Android تتوافق مع الادّعاء الوارد في نموذج المدّعي. يتضمّن ذلك سحب ملف APK المعنيّ من جهازك والتحقّق من سلامة رمزه وإجراء إثبات تضمين السجلّ على العنصر المستخرَج.
عملية إثبات الملكية
يتم تنفيذ سجلّ الشفافية باستخدام شجرة Merkle تتألف من قيم تجزئة. تحتوي عقدة الورقة على بيانات، وتحتوي العقدة الأصل على تجزئة العقد التابعة لها.
بشكل أساسي، يتم إجراء عمليتَي حساب على شجرة Merkle للتحقّق من خاصية مقاومة التلاعب في سجلات الشفافية، وهما إثبات التضمين وإثبات الاتساق. ويثبت الأخير أنّ السجلّ يتضمّن إدخالاً يتوافق مع إصدار معيّن من حِزمة APK. يتضمّن إدخال السجلّ تجزئة، وهي ملخّص SHA256 لرمز توقيع الرمز البرمجي بتنسيق JSON Web Token (JWT)، ويمكن الحصول عليه من حِزم APK ذات الصلة. ويثبت هذا الأخير أنّه عند إضافة إدخالات جديدة إلى الشجرة، تكون نقطة التحقّق الجديدة متوافقة (تشفيريًا) مع الإصدار السابق من الشجرة.
للتحقّق من صحة حزمة APK مغطّاة، عليك إجراء اختبار إثبات التضمين استنادًا إلى نقطة تحقّق تم رصدها. يُرجى العِلم أنّنا نخطّط لدمج هذا السجلّ مع شبكة شهود عامة باستخدام بروتوكول شهود موحّد. سيوفّر ذلك نقطة تحقّق موثوقة تضمن اتّساق السجلّ.
إذا أردت التأكّد من أنّ حزمة APK المتوفّرة على جهازك تتوافق مع الادّعاء الوارد في نموذج المطالبة، يُرجى الرجوع إلى النص أدناه.
مستند إثبات الإدراج
يمكن لمستخدم Android التأكّد من أنّ حزمة APK التي تم فحصها على جهازه مضمّنة في السجلّ من خلال استخراج حزمة APK وبياناتها الوصفية ذات الصلة أولاً، ثم مقارنة قيمة التجزئة الجذرية التي تم إعادة احتسابها بقيمة التجزئة الجذرية الواردة في نقطة التحقّق المنشورة. وفي حال تطابُقها، يمكن لمستخدم Android الاطمئنان إلى توفّر بعض وسائل الحماية الموضّحة في "نموذج التهديدات".
كيفية التحقّق من تضمين حزمة APK في السجلّ
كما هو موضّح سابقًا، يمكن العثور على قائمة بملفات APK التي يشملها التقرير حاليًا في صفحة "نظرة عامة".
المتطلبات الأساسية لإثبات الملكية
قبل المتابعة لإثبات أنّ حزمة APK التي استخرجتها للتو من جهازك تتوافق مع ما ذكرناه، عليك تثبيت الأدوات التالية من جهاز كمبيوتر متصل بشبكة.
Android Debug Bridge (ADB)
ADB هي أداة تتواصل مع جهاز Android، وهي متاحة على الموقع الإلكتروني لأدوات منصة Android SDK.
أداة تجميع الموارد في Android (AAPT2)
AAPT2 (أداة تجميع الموارد في Android) هي أداة إنشاء تُستخدَم في تجميع موارد تطبيق Android وتعبئتها. ويمكن العثور عليها كأداة مستقلة في الإصدار 26.0.2 والإصدارات الأحدث من أدوات إنشاء حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
bundletool
bundletool هي أداة تُستخدَم لإنشاء "مجموعة حزمات تطبيق Android" (AAB). ويمكن استخدامها أيضًا لتحويل حزمة AAB إلى حِزم APK يمكن تثبيتها على الأجهزة.
ويمكن تنزيله من GitHub.
أداة التحقّق من صحة مستند إثبات التضمين
هذه وحدة Go نشرناها في مستودع git ضمن "مشروع Android المفتوح المصدر" (AOSP) باسم avb.
يمكنه طلب البحث في سجلّ شفافية حِزم APK للخدمات التابعة لنظام التشغيل من Google
وعرض ما إذا كانت الحزمة مضمّنة في السجلّ.
يمكنك الاطّلاع على مثال على كيفية استخدام ذلك في قسم لاحق.
لتنزيل هذه الأداة، يجب أولاً استنساخ مستودع avb.
computer:~$ git clone https://android.googlesource.com/platform/external/avb
يمكن العثور على رمز المصدر الخاص بأداة التحقّق في tools/transparency/verify
ضِمن مستودع avb.
إنشاء حمولة للتحقّق
للتأكّد من أنّ حزمة 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) في ملف باسم 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
نحن الآن على استعداد لاستخدام الأمر check-transparency الخاص بـ bundletool
للتحقّق مما إذا كان توقيع الرمز المضمّن في حزمة 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_system_apk
يستخدم المدقّق نقطة التحقّق المقابلة ومحتوى السجلّ (الموجود في دليل المربّعات) للتأكّد من أنّ حمولة حِزمة APK مضمّنة في سجلّ الشفافية، ما يثبت أنّ Google هي الجهة التي نشرتها.
تتم كتابة مخرجات الأمر إلى الإخراج العادي:
OK. inclusion check success!إذا كان رمز الحزمة مضمّنًا في السجلّ،FAILUREإذا لم يكن كذلك.