Google System Services APK Transparency تأیید کامل

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

فرآیند تأیید

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

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

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

اگر می‌خواهید خودتان را متقاعد کنید که APK موجود در دستگاهتان با ادعای مطرح‌شده در مدل مدعی مطابقت دارد، به متن زیر مراجعه کنید.

اثبات شمول

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

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

همانطور که قبلاً توضیح داده شد، لیست APK هایی که در حال حاضر تحت پوشش هستند را می‌توانید در صفحه مرور کلی پیدا کنید.

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

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

گولانگ

ابزار تأیید با زبان Go نوشته شده است. برای ساخت آن، Go 1.24 یا بالاتر را از سایت Go نصب کنید.

پل اشکال‌زدایی اندروید (ADB)

ADB ابزاری است که با دستگاه اندروید ارتباط برقرار می‌کند تا تصویر را بررسی کند یا فایل‌های APK را استخراج کند، که در وب‌سایت Android SDK Platform Tools موجود است.

تأییدکننده اثبات شمول

تأییدکننده‌ی اثبات شمول، یک ماژول Go است که لاگ شفافیت را بررسی می‌کند و مشخص می‌کند که آیا یک مصنوع در لاگ گنجانده شده است یا خیر. این ماژول در مخزن گیت‌هاب 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 :

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2 (ابزار بسته‌بندی دارایی‌های اندروید) یک ابزار ساخت است که برای کامپایل و بسته‌بندی منابع یک برنامه اندروید استفاده می‌شود. این ابزار را می‌توان به عنوان یک ابزار مستقل در ابزارهای ساخت SDK اندروید نسخه 26.0.2 و بالاتر یافت.

ابزار بسته

bundletool ابزاری است که برای ساخت یک بسته نرم‌افزاری اندروید (AAB) استفاده می‌شود. همچنین می‌توان از آن برای تأیید امضاهای کد APK استفاده کرد. می‌توان آن را از GitHub دانلود کرد.

wget یا curl

wget و curl ابزارهایی هستند که می‌توانند برای بازیابی یا دانلود فایل‌ها از اینترنت استفاده شوند. مطمئن شوید که هر یک از این ابزارها را نصب کرده‌اید، زیرا اسکریپت‌های تأیید ممکن است به آنها متکی باشند.

آوبتول

avbtool برای محاسبه خلاصه VBMeta از تصاویر کارخانه و تأیید فایل‌های باینری استفاده می‌شود. پس از کلون کردن مخزن avb (همانطور که در بخش تأییدکننده اثبات شمول نشان داده شده است)، avbtool.py می‌توان در دایرکتوری avb کلون شده یافت. شما باید این دایرکتوری را به متغیر محیطی $PATH خود اضافه کنید.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

ابزار بسته‌بندی فیسبوک

fbpacktool یک اسکریپت پایتون است که برای باز کردن اجزای جداگانه در bootloader.img پیکسل استفاده می‌شود. اگر در حال تأیید APKها هستید، به این ابزار نیاز ندارید. این ابزار مهم است زیرا به avbtool.py اجازه می‌دهد تصاویر مورد نیاز برای تأیید را کشف کند.

برای استفاده از این ابزار، باید سه اسکریپت پایتون زیر را در دایرکتوری که 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 به انجام عملیات رمزنگاری مختلف با استفاده از ترمینال در گردش کار تأیید کمک می‌کند. مطمئن شوید که روی سیستم شما نصب شده است. می‌توانید با اجرای دستور زیر و اطمینان از خالی نبودن نتیجه‌ی برگشتی، در ترمینال خود بررسی کنید:

computer:~$ which openssl
/usr/bin/openssl

ساخت یک Payload برای تأیید

برای تأیید اینکه APK استخراج‌شده از دستگاه شما مطابق با ادعاهای ما است، باید یک فایل گزارش از اطلاعات به‌دست‌آمده از APK ایجاد کنید.

قبل از شروع، با فعال کردن اشکال‌زدایی adb در دستگاه خود، مطمئن شوید که adb در دستگاه شما قابل استفاده است.

سپس، محل نصب فایل APK روی دستگاه خود را پیدا کنید. برای اهداف این راهنما، ما از فایل APK تأییدکننده کلید سیستم اندروید (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 تأییدکننده کلید سیستم اندروید روی دستگاه شما نصب شده باشد، دستور بالا مسیری را که نشان می‌دهد این فایل روی دستگاه شما نصب شده است، برمی‌گرداند. در غیر این صورت، هیچ خروجی مشاهده نخواهید کرد.

سپس، با استفاده از این دستور، فایل APK را از دستگاه اندروید خود روی رایانه‌ای که با آن کار می‌کنید دانلود کنید (توجه داشته باشید که مکان واقعی و نام فایل 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های مربوطه منتشر می‌شوند. با فرض اینکه گواهی کلید عمومی (مثلاً برای تأییدکننده کلید سیستم اندروید ) را در فایلی به نام signing_cert_pubkey.pem ذخیره کرده‌اید، برای انجام تأیید امضای کد، راهنمای زیر را دنبال کنید.

ابتدا باید یک فایل فشرده (zip) ایجاد کنید و فایل 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 که اعتبارسنجی می‌کنید، تأیید شده است.

تأیید صحت گنجاندن بسته (اثبات گنجاندن)

با استفاده از payload که قبلاً ساخته‌اید، اکنون آماده‌اید تا بررسی کنید که آیا بسته مورد نظر در گزارش شفافیت گنجانده شده است یا خیر.

یک ابزار اثبات شمول در مخزن avb در پروژه متن‌باز اندروید منتشر شده است. برای اجرای آن:

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

تأییدکننده از نقطه‌ی بازرسی مربوطه و محتویات لاگ (که در دایرکتوری tile یافت می‌شود) برای بررسی وجود فایل APK شما در لاگ شفافیت استفاده می‌کند و تأیید می‌کند که واقعاً توسط گوگل منتشر شده است.

خروجی دستور در stdout نوشته می‌شود:

  • OK. inclusion check success! اگر کد بسته در لاگ وجود داشت،
  • اگر اینطور نباشد، FAILURE .