این صفحه روشهای مختلفی را برای اطمینان از مطابقت APK نصب شده روی دستگاه اندروید شما با ادعای مطرح شده در مدل مدعی ارائه میدهد. این شامل استخراج APK مورد نظر از دستگاه شما، بررسی یکپارچگی کد آن و انجام یک اثبات شمول گزارش بر روی مصنوع استخراج شده است.
فرآیند تأیید
یک گزارش شفافیت با یک درخت مرکل متشکل از هشها پیادهسازی میشود. یک گره برگ حاوی دادهها است و یک گره والد حاوی هش فرزندانش است.
اساساً، دو محاسبه روی درخت مرکل انجام میشود تا ویژگی آشکار-دستکاریِ لاگهای شفافیت تأیید شود: اثبات شمول و اثبات سازگاری. مورد اول ثابت میکند که لاگ شامل یک ورودی مربوط به یک نسخه APK خاص است. ورودی لاگ شامل یک هش است که خلاصه SHA256 از توکن امضای کد به شکل یک توکن وب JSON (JWT) است که میتوان آن را از APKهای مربوطه به دست آورد. مورد دوم ثابت میکند که وقتی ورودیهای جدید به درخت اضافه میشوند، نقطه بازرسی جدید (از نظر رمزنگاری) با نسخه قبلی درخت سازگار است.
برای تأیید یک APK تحت پوشش، یک تست اثبات شمول بر اساس یک چک پوینت شاهد انجام دهید. توجه داشته باشید که ما قصد داریم این گزارش را با استفاده از یک پروتکل شاهد استاندارد با یک شبکه شاهد عمومی ادغام کنیم. این یک چک پوینت شاهد فراهم میکند که ثبات گزارش را تضمین میکند.
اگر میخواهید خودتان را متقاعد کنید که APK موجود در دستگاهتان با ادعای مطرحشده در مدل مدعی مطابقت دارد، به متن زیر مراجعه کنید.
اثبات شمول
یک کاربر اندروید میتواند با استخراج APK و فرادادههای مربوط به آن و سپس مقایسه هش ریشه محاسبهشده خود با هش ریشه موجود در چکپوینت منتشر شده، بررسی کند که آیا یک APK تحت پوشش روی دستگاهش در لاگ وجود دارد یا خیر. اگر این دو با هم مطابقت داشته باشند، کاربر اندروید میتواند از برخی محافظتهای شرح داده شده در مدل تهدید مطمئن شود.
نحوه تأیید گنجاندن APK در گزارش
همانطور که قبلاً توضیح داده شد، لیست APK هایی که در حال حاضر تحت پوشش هستند را میتوانید در صفحه مرور کلی پیدا کنید.
پیشنیازهای تأیید
قبل از اینکه تأیید کنید فایل APK که از دستگاه خود استخراج کردهاید مطابق با ادعای ما است، به ابزارهای زیر نیاز دارید که باید آنها را از طریق یک کامپیوتر متصل به شبکه نصب کنید.
پل اشکالزدایی اندروید (ADB)
ADB ابزاری است که با دستگاه اندروید ارتباط برقرار میکند و در وبسایت Android SDK Platform Tools موجود است.
AAPT2
AAPT2 (ابزار بستهبندی داراییهای اندروید) یک ابزار ساخت است که برای کامپایل و بستهبندی منابع یک برنامه اندروید استفاده میشود. این ابزار را میتوان به عنوان یک ابزار مستقل در Android SDK Build Tools نسخه ۲۶.۰.۲ و بالاتر یافت.
ابزار بسته
bundletool ابزاری است که برای ساخت یک بسته نرمافزاری اندروید (AAB) استفاده میشود. همچنین میتوان از آن برای تبدیل AAB به APKهایی که میتوانند روی دستگاهها نصب شوند، استفاده کرد. میتوان آن را از GitHub دانلود کرد.
تأییدکننده اثبات شمول
این یک ماژول Go است که ما در یک مخزن git در پروژه متنباز اندروید (AOSP) به نام avb منتشر کردهایم. این ماژول قادر به پرسوجو از گزارش شفافیت APK سرویسهای سیستم گوگل است و مشخص میکند که آیا بستهای در گزارش گنجانده شده است یا خیر. مثالی از نحوه استفاده از این ماژول را میتوانید در بخش بعدی بیابید.
برای دانلود این ابزار، ابتدا باید مخزن avb را کلون کنید.
computer:~$ git clone https://android.googlesource.com/platform/external/avb
کد منبع تأییدکننده را میتوانید در tools/transparency/verify در مخزن avb پیدا کنید.
ساخت یک 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_system_apk
تأییدکننده از نقطهی بازرسی مربوطه و محتویات لاگ (که در دایرکتوری tile یافت میشود) برای بررسی وجود فایل APK شما در لاگ شفافیت استفاده میکند و تأیید میکند که واقعاً توسط گوگل منتشر شده است.
خروجی دستور در stdout نوشته میشود:
-
OK. inclusion check success!اگر کد بسته در لاگ وجود داشت، - اگر اینطور نباشد،
FAILURE.