درستی‌سنجی کامل شفاف‌سازی برنامه محصول Google

این صفحه نحوه درستی‌سنجی اینکه APK یا APEX نصب‌شده در دستگاه Android شما با ادعاهای مطرح‌شده در مدل مدعی مطابقت دارد را شرح می‌دهد. این فرایند شامل کشیدن APK از دستگاه شما و انجام اثبات درج گزارش روی آرتیفکت استخراج‌شده است.

فرایند درستی‌سنجی

گزارش شفافیت با درخت مرکل متشکل از درهم‌سازها پیاده‌سازی می‌شود. گره برگ حاوی داده است و گره والد حاوی درهم‌سازی فرزندانش است.

دو محاسبه اساسی ویژگی دستکاری‌نمای گزارش‌های شفافیت را درستی‌سنجی می‌کند: اثبات گنجاندن و اثبات سازگاری. گواه گنجاندن تأیید می‌کند که گزارش شامل ورودی برای نسخه خاصی از APK است. این ورودی گزارش حاوی درهم‌سازی است که خلاصه SHA256 فایل APK نصب‌شده در دستگاه است. گواه سازگاری تضمین می‌کند که وقتی ورودی‌های جدید اضافه می‌شوند، ایست بازرسی جدید ازنظر رمزنگاری با نسخه‌های قبلی درخت سازگار باقی می‌ماند (یا درخت دستکاری نشده است). در این راهنما، بر فرایند محاسبه اثبات گنجاندن تمرکز می‌کنیم، درحالی‌که برای انجام مداوم اثبات سازگاری دربرابر آخرین نقاط بازرسی به شاهدان تکیه می‌کنیم.

برای درستی‌سنجی APK تحت پوشش، اثبات گنجاندن را دربرابر نقطه بازرسی شاهد اجرا کنید. توجه داشته باشید که قصد داریم این گزارش را با یک شبکه شاهد عمومی بااستفاده از یک پروتکل شاهد استاندارد ادغام کنیم. این ادغام نقاط بازرسی گواهی‌شده‌ای را ارائه می‌دهد که سازگاری گزارش را تضمین می‌کند.

برای تأیید اینکه برنامه‌های Google در دستگاهتان با ادعاهای مطرح‌شده در مدل مدعی مطابقت دارد، مراحل زیر را دنبال کنید.

مدرک اثبات دربرگیری

می‌توانید با استخراج کردن فایل APK، محاسبه کردن مقدار درهم آن، و استفاده از گواه شمول، بررسی کنید که آیا مقدار درهم در ایست بازرسی منتشرشده وجود دارد یا نه و از این طریق تأیید کنید که فایل APK تحت پوشش در دستگاهتان در گزارش وجود دارد. گواه گنجاندن موفقیت‌آمیز دربرابر خطراتی که در «مدل تهدید» شرح داده شده است تضمین ارائه می‌دهد و تأیید می‌کند که برنامه یک برنامه Google قانونی است.

نحوه درستی‌سنجی گنجاندن APK در گزارش

هر برنامه‌ای که ادعا می‌کند برنامه شخص اول Google است می‌تواند با این گزارش درستی‌سنجی شود.

پیش‌نیازهای تأیید

قبل‌از اقدام به درستی‌سنجی اینکه محصول جانبی (میان‌افزار یا APK) مطابق با ادعا است، مطمئن شوید ابزارهای زیر در رایانه‌ای متصل به شبکه دردسترس باشد. بسته به هدف درستی‌سنجی، ممکن است به همه آن‌ها نیاز نداشته باشید.

Golang

ابزار درستی‌سنجی به زبان Go نوشته شده است. برای ساختن آن، Go نسخه ۱.۲۴ یا جدیدتر را از سایت Go نصب کنید.

پل اشکال‌زدایی Android‏ (ADB)

ADB ابزاری است که با دستگاه Android ارتباط برقرار می‌کند تا تصویر را بررسی کند یا فایل‌های APK را استخراج کند، که در وب‌سایت «ابزارهای پلاتفرم کیت توسعه نرم‌افزار Android» دردسترس است.

درستی‌سنجی‌کننده «مدرک دربرگیری»

درستی‌سنج اثبات گنجاندن یک واحد Go است که گزارش شفاف‌سازی را پُرسمان می‌کند و برونداد می‌کند که آیا یک آرتیفکت در گزارش گنجانده شده است یا نه. این کد در مخزن GitHub android-binary-transparency در 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 استفاده می‌شود. این ابزار را می‌توانید به‌عنوان ابزاری مستقل در ابزارهای ساخت کیت توسعه نرم‌افزار Android نسخه ۲۶.۰.۲ و بالاتر پیدا کنید.

bundletool

bundletool ابزاری است که برای ساختن Android App Bundle‏ (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 اجازه می‌دهد تصاویر موردنیاز برای درستی‌سنجی را پیدا کند.

fbpacktool به Python 3.6 یا جدیدتر و بسته PyYAML نیاز دارد (برای مثال، python3 -m pip install pyyaml).

برای استفاده از این ابزار، باید شش دستورگان python زیر را در دایرکتوری محل avbtool.py بارگیری کنید، fbpacktool.py را اجراپذیر کنید، و برای راحتی، پیوند نمادینی به‌نام fbpacktool به fbpacktool.py ایجاد کنید.

اگر wget دارید:

computer:dir_to_avbtool$ wget https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

اگر curl دارید:

computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.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 به رایانه‌تان متصل باشد. کد منبع 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 نشان می‌دهد که بسته ازنظر رمزنگاری درمقابل گزارش شفاف‌سازی درستی‌سنجی شده است و تأیید می‌کند که با ادعاهای گزارش مطابقت دارد.