توضِّح هذه الصفحة طُرقًا مختلفة لضمان أنّ حزمة APK المثبَّتة على جهاز Android تتوافق مع المطالبة التي تم تقديمها في نموذج المدّعي. ويشمل ذلك سحب ملف APK المعنيّ من جهازك والتحقّق من سلامة رمزه وإجراء إثبات تسجيل التضمين على العنصر المستخرَج.
عملية إثبات الهوية
يتم تنفيذ سجلّ الشفافية باستخدام شجرة Merkle تتألف من تجزئات. تحتوي عقدة الورقة على بيانات، وتحتوي العقدة الرئيسية على التجزئة الخاصة بعقدها الفرعية.
يتم إجراء عمليتَي حساب أساسيتَين على شجرة Merkle للتحقّق من السمة التي تُثبت عدم التلاعب في سجلّات الشفافية: إثبات التضمين وإثبات الاتساق. يثبت ذلك أنّ السجلّ يتضمّن إدخالًا مرتبطًا بإصدار APK معيّن. يتضمّن إدخال السجلّ تجزئة، وهي تقسيم SHA256 لرمز توقيع الرمز البرمجي في شكل رمز JSON المميّز للويب (JWT)، والذي يمكن الحصول عليه من حِزم APK المقابلة. يثبت ذلك أنّه عند إضافة إدخالات جديدة إلى الشجرة، يكون نقطة التحقّق الجديدة متّسقة (تشفيريًا) مع الإصدار السابق من الشجرة.
لإثبات ملكية حِزمة APK مشمولة، عليك إجراء اختبار لإثبات التضمين استنادًا إلى نقطة تفتيش يشهدها شخص آخر. يُرجى العِلم أنّنا نخطّط لدمج هذا السجلّ مع شبكة شهود عامة باستخدام بروتوكول شهود موحّد. سيؤدي ذلك إلى توفير نقطة تفتيش موثَّقة، ما يضمن اتساق السجلّ.
إذا أردت التأكّد من أنّ ملف APK على جهازك متوافق مع المطالبة المقدَّمة في نموذج المدّعي، يُرجى الاطّلاع على التقرير أدناه.
مستند إثبات الأهلية
يمكن لمستخدم Android التحقّق من أنّ حِزمة APK المشمولة في السجلّ على جهازه هي من النوع المشمول من خلال استخراج حِزمة APK أولاً والبيانات الوصفية ذات الصلة بها، ثم مقارنة تجزئة الجذر التي تمت إعادة احتسابها بتجزئة الجذر الواردة في نقطة التحقّق المنشورة. وفي حال تطابقهما، يمكن لمستخدم Android التأكّد من بعض وسائل الحماية описанة في نموذج التهديد.
كيفية التحقّق من تضمين حِزمة APK في السجلّ
كما هو موضّح سابقًا، يمكن العثور على قائمة ملفات APK المشمولة حاليًا في صفحة "نظرة عامة".
المتطلبات الأساسية لإثبات الهوية
قبل المتابعة للتأكّد من أنّ حزمة APK التي استخرجتها للتو من جهازك تتوافق مع مطالبتنا، ستحتاج إلى الأدوات التالية من خلال تثبيتها من جهاز كمبيوتر متصل بالشبكة.
Android Debug Bridge (ADB)
ADB
هي أداة تتواصل مع جهاز Android، وهي متاحة على الموقع الإلكتروني لأدوات حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
bundletool
bundletool
هي أداة تُستخدَم لإنشاء مجموعة حزمات تطبيق Android (AAB). ويمكن
استخدامه أيضًا لتحويل حِزم AAB إلى حِزم APK يمكن تثبيتها على الأجهزة.
ويمكن تنزيله من GitHub.
Androguard
Androguard هي مجموعة من الأدوات التي تُستخدَم لتحليل حِزم APK. يمكن تنزيله وتثبيته من الموقع الإلكتروني الخاص بتطبيق Androguard.
أداة التحقّق من مستند إثبات الأهلية
هذه وحدة 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 الثنائي إلى تنسيق يمكن لشخص عادي قراءته، نستخدم
أداة axml
من مجموعة androguard
(كما هو مطلوب
للتثبيت في قسم المتطلبات الأساسية).
computer:/tmp/testdir$ androguard axml extracted/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1413" android:versionName="1.48.688082145" android:compileSdkVersion="35" android:compileSdkVersionCodename="VanillaIceCream" android:requiredSplitTypes="" android:splitTypes="" package="com.google.android.contactkeys" platformBuildVersionCode="35" platformBuildVersionName="VanillaIceCream">
من خلال النتيجة أعلاه، يمكننا الآن التأكّد من أنّ اسم حزمة ملف 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
باستخدام سلسلة التجزئة هذه، أصبح لدينا الآن كل المعلومات اللازمة لجمع حمولة السجلّ وفقًا للتنسيق الموضّح في قسم "محتوى السجلّ". في هذا المثال، يجب أن تظهر حمولة log المقابلة على النحو التالي:
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143
يُرجى أيضًا ملاحظة حرف سطر جديد بعد إصدار الحزمة.
يمكنك حفظ المحتوى في ملف، مثل payload.txt
. سيفيدك ذلك عند إجراء اختبار إثبات التضمين لاحقًا.
التحقّق من صحة توقيع رمز حزمة APK
الآن، علينا التحقّق من صحة رمز توقيع الرمز البرمجي
المضمّن في حزمة APK. لإجراء ذلك، نستخدم bundletool
والمفتاح
العام من مفتاحَي التشفير اللذَين تم استخدامهما لتوقيعه في المقام الأول. ويتم
نشرها ضمن كل قسم من ملفّات APK الخاصة بكل تطبيق. بافتراض أنّك حفظت شهادة المفتاح العام
(مثلاً لخدمة التحقّق من مفتاح نظام التشغيل Android)
في ملف باسم signing_cert_pubkey.pem
،
اتّبِع الدليل أدناه لإجراء عملية التحقّق من توقيع الرمز.
أولاً، عليك إنشاء أرشيف بتنسيق zip وإضافة حزمة APK المعنيّة إلى أرشيف zip.
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 التي تُجري عملية التحقّق منها.
إثبات تضمين الحزمة
باستخدام الحمولة التي أنشأتها في وقت سابق، أصبحت الآن مستعدًا لاختبار ما إذا كانت الحزمة المعنيّة قد تم تضمينها في سجلّ الشفافية.
تم نشر أداة لإثبات التضمين في 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 هي من نشرتها.
تتم كتابة مخرجات الأمر في stdout:
OK. inclusion check success!
إذا كان رمز الحزمة مضمّنًا في السجلّFAILURE
إذا لم يكن كذلك.