این صفحه نحوهی تأیید مطابقت APK یا APEX نصبشده روی دستگاه اندروید شما با ادعاهای مطرحشده در مدل مدعی را شرح میدهد. این فرآیند شامل استخراج APK از دستگاه شما و انجام یک اثبات شمول گزارش بر روی مصنوع استخراجشده است.
فرآیند تأیید
یک گزارش شفافیت با یک درخت مرکل متشکل از هشها پیادهسازی میشود. یک گره برگ حاوی دادهها است و یک گره والد حاوی هش فرزندانش است.
دو محاسبه اساسی، خاصیت عدم دستکاری لاگهای شفافیت را تأیید میکنند: اثبات شمول و اثبات سازگاری. اثبات شمول تأیید میکند که لاگ شامل یک ورودی برای یک نسخه APK خاص است. این ورودی لاگ حاوی یک هش است که خلاصه SHA256 فایل APK نصب شده روی دستگاه است. اثبات سازگاری تضمین میکند که وقتی ورودیهای جدید اضافه میشوند، نقطه بررسی جدید از نظر رمزنگاری با نسخههای قبلی درخت سازگار باقی میماند (یا اینکه درخت دستکاری نشده است). ما در این راهنما بر فرآیند محاسبه اثبات شمول تمرکز میکنیم، در حالی که به شاهدان متکی هستیم تا به طور مداوم اثبات سازگاری را در برابر آخرین نقاط بررسی انجام دهند.
برای تأیید یک APK تحت پوشش، یک اثبات شمول در برابر یک نقطه بازرسی شاهد انجام دهید. توجه داشته باشید که ما قصد داریم این گزارش را با استفاده از یک پروتکل شاهد استاندارد با یک شبکه شاهد عمومی ادغام کنیم. این ادغام، نقاط بازرسی شاهد را فراهم میکند و ثبات گزارش را تضمین میکند.
برای تأیید اینکه برنامههای گوگل روی دستگاه شما با ادعاهای مطرحشده در مدل مدعی مطابقت دارند، مراحل زیر را دنبال کنید.
اثبات شمول
شما میتوانید با استخراج APK، محاسبه هش آن و استفاده از یک اثبات شمول برای بررسی وجود آن هش در نقطه بررسی منتشر شده، تأیید کنید که یک APK تحت پوشش روی دستگاه شما در گزارش وجود دارد. یک اثبات شمول موفق، تضمینی در برابر خطرات شرح داده شده در مدل تهدید ارائه میدهد و تأیید میکند که برنامه یک برنامه قانونی گوگل است.
نحوه تأیید گنجاندن APK در گزارش
هر برنامهای که ادعا میکند یک برنامهی شخص اول گوگل است، میتواند با این گزارش تأیید شود.
پیشنیازهای تأیید
قبل از تأیید APK استخراج شده، ابزارهای زیر باید روی رایانه شما نصب شوند:
پل اشکالزدایی اندروید (ADB)
ADB ابزاری است که با دستگاه اندروید ارتباط برقرار میکند و در وبسایت Android SDK Platform Tools موجود است.
AAPT2
AAPT2 (ابزار بستهبندی داراییهای اندروید) یک ابزار ساخت است که برای کامپایل و بستهبندی منابع یک برنامه اندروید استفاده میشود. این ابزار به عنوان یک ابزار مستقل در Android SDK Build Tools نسخه ۲۶.۰.۲ و بالاتر در دسترس است.
گولانگ
ابزار تأیید با زبان Go نوشته شده است. برای ساخت آن، Go نسخه ۱.۱۷ یا بالاتر را از سایت Go نصب کنید.
تأییدکننده اثبات شمول
ما یک ماژول Go به نام verifier در مخزن گیتهاب android-binary-transparency منتشر میکنیم. این ابزار از گزارش شفافیت APK شخص اول گوگل پرسوجو میکند تا بررسی کند که آیا بستهای در آن گنجانده شده است یا خیر.
برای استفاده از این ابزار، ابتدا مخزن را روی رایانه محلی خود کپی کنید:
git clone https://github.com/android/android-binary-transparency
کد منبع تأییدکننده را میتوان در مخزن android-binary-transparency یافت.
ساخت یک Payload برای تأیید
برای تأیید APK استخراجشده، باید با استفاده از اطلاعات بهدستآمده از خود APK، یک فایل گزارش (log payload) بسازید.
قبل از شروع، اشکالزدایی USB را در دستگاه خود فعال کنید تا اتصالات adb امکانپذیر شود.
سپس، فایل APK نصب شده روی دستگاه خود را پیدا کنید. این راهنما از فایل APK سرویسهای گوگل پلی ( 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 فهرستشده را با استفاده از دستور زیر از دستگاه اندروید خود به رایانه دانلود کنید (توجه داشته باشید که مسیر واقعی فایلها ممکن است متفاوت باشد):
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 استفاده کنید.
تأیید صحت گنجاندن بسته (اثبات گنجاندن)
با ساخته شدن payload، اکنون میتوانید بررسی کنید که آیا بسته در گزارش شفافیت گنجانده شده است یا خیر. ابزار اثبات شمول را از مخزن android-binary-transparency که قبلاً کلون کردهاید، بسازید:
go build cmd/verifier/verifier.go
این باید منجر به یک فایل اجرایی به نام verifier در آن دایرکتوری شود. verifier را اجرا کنید، مسیر payload خود را ارائه دهید و نوع گزارش را مشخص کنید:
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
تأییدکننده از چکپوینت و محتویات لاگ (از دایرکتوری tile ) برای بررسی وجود فایل APK شما در لاگ شفافیت استفاده میکند و تأیید میکند که توسط گوگل منتشر شده است.
خروجی دستور در stderr به صورت زیر است:
-
OK. inclusion check success!اگر بسته در لاگ وجود داشته باشد. - اگر اینطور نباشد،
FAILURE.
تأیید خودکار تمام بستههای موجود در یک دستگاه
با توجه به تعداد برنامههای گوگل که ممکن است از قبل روی دستگاه شما نصب شده باشند، شمارش هر برنامه و انجام اثباتهای شمول به صورت جداگانه میتواند خستهکننده باشد.
ما ابزار خودکار دیگری به نام Uraniborg ارائه میدهیم که میتواند تمام بستههای نصبشده فعلی روی دستگاه شما را شناسایی و اندازهگیری کند. این ابزار خروجی خود را مستقیماً به ابزار verifier میدهد و به شما امکان میدهد شفافیت تمام برنامههای روی دستگاه خود را در یک مرحله کشف و تأیید کنید.
برای استفاده از این گردش کار خودکار، مطمئن شوید که دستگاه اندروید شما از طریق ADB به رایانه متصل است. کد منبع Uraniborg نیز در مخزن android-binary-transparency موجود است.
اسکریپت 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 نشان میدهد که بسته به صورت رمزنگاری شده در برابر گزارش شفافیت تأیید شده است و تأیید میکند که با ادعاهای گزارش مطابقت دارد.