این صفحه روشهای مختلفی را برای اطمینان از اینکه APK نصب شده در دستگاه Android شما با ادعایی که در مدل ادعا شده بود مطابقت دارد، تشریح میکند. این شامل بیرون کشیدن APK مورد نظر از دستگاه شما، بررسی یکپارچگی کد آن و انجام اثبات گنجاندن گزارش روی مصنوع استخراج شده است.
فرآیند تأیید
گزارش شفافیت با درخت مرکل متشکل از هش پیاده سازی می شود. یک گره برگ حاوی داده است و یک گره والد حاوی هش فرزندانش است.
اساساً، دو محاسبات روی درخت مرکل انجام میشود تا خاصیت دستکاری آشکار گزارشهای شفافیت را تأیید کند: اثبات گنجاندن و اثبات سازگاری. اولی ثابت می کند که گزارش شامل ورودی مربوط به یک نسخه APK خاص است. ورودی گزارش شامل یک هش است که خلاصه SHA256 از کد امضای کد به شکل یک توکن وب JSON (JWT) است که میتوان آن را از APKهای مربوطه دریافت کرد. مورد دوم ثابت میکند که وقتی ورودیهای جدید به درخت اضافه میشوند، نقطه بازرسی جدید (از نظر رمزنگاری) با نسخه قبلی درخت سازگار است.
برای تأیید یک APK تحت پوشش، یک آزمایش اثبات گنجاندن بر اساس یک ایست بازرسی مشاهده شده انجام دهید. توجه داشته باشید که ما در حال برنامه ریزی برای ادغام این گزارش با یک شبکه شاهد عمومی با استفاده از یک پروتکل شاهد استاندارد هستیم. این یک ایست بازرسی شاهد را فراهم می کند، که ثبات ورود را تضمین می کند.
اگر میخواهید خود را متقاعد کنید که APK موجود در دستگاهتان با ادعایی که در مدل شاکی مطرح شده است مطابقت دارد، به نوشته زیر مراجعه کنید.
اثبات شمول
یک کاربر اندرویدی میتواند بررسی کند که یک APK پوشانده شده در دستگاهش در گزارش وجود دارد، ابتدا APK و ابرداده مربوطه آن را استخراج میکند، سپس هش ریشه دوباره محاسبهشدهاش را با هش ریشه موجود در چک پوینت منتشر شده مقایسه میکند. اگر آنها مطابقت داشته باشند، کاربر Android می تواند از برخی از محافظت های شرح داده شده در مدل تهدید مطمئن شود.
نحوه تأیید ورود APK در ورود
همانطور که قبلاً توضیح داده شد، فهرست APKهایی که در حال حاضر تحت پوشش هستند را میتوانید در صفحه نمای کلی فهرست شده پیدا کنید.
پیش نیازهای تایید
قبل از اینکه تأیید کنید APK که به تازگی از دستگاه خود استخراج کرده اید مطابق با ادعای ما است، با نصب آنها از یک رایانه متصل به شبکه به ابزارهای زیر نیاز خواهید داشت.
پل اشکال زدایی اندروید (ADB)
ADB
ابزاری است که با یک دستگاه Android ارتباط برقرار می کند و در وب سایت Android SDK Platform Tools موجود است.
ابزار بسته بندی
bundletool
ابزاری است که برای ساخت یک Android App Bundle (AAB) استفاده می شود. همچنین میتوان از آن برای تبدیل یک AAB به فایلهای APK قابل نصب بر روی دستگاهها استفاده کرد. از GitHub قابل دانلود است.
اندروگارد
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
اگر Android System Key Verifier APK روی دستگاه شما نصب شده باشد، دستور بالا مسیری را نشان می دهد که نشان می دهد کجا روی دستگاه شما نصب شده است. در غیر این صورت، هیچ خروجی نخواهید دید.
سپس، با استفاده از این دستور، 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 Content در اختیار داریم. در این مثال، یک payload گزارش مربوطه باید به شکل زیر باشد:
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143
همچنین به کاراکتر newline بعد از نسخه بسته توجه کنید.
می توانید محتوا را در یک فایل ذخیره کنید، مانند payload.txt
. این در هنگام انجام آزمون اثبات گنجاندن بعداً مفید خواهد بود.
صحت امضای کد APK را تأیید کنید
اکنون، باید صحت کد امضای کد تعبیه شده در APK را بررسی کنیم. برای این کار از bundletool
و کلید عمومی جفت کلیدی که در ابتدا برای امضای آن استفاده شده است استفاده می کنیم. آنها در هر بخش از APKهای مربوطه منتشر می شوند. با فرض اینکه گواهی کلید عمومی (مثلاً برای تأیید کننده کلید سیستم اندروید ) را در فایلی به نام signing_cert_pubkey.pem
ذخیره کرده اید، برای انجام تأیید امضای کد، راهنمای زیر را دنبال کنید.
ابتدا باید یک بایگانی فشرده ایجاد کنید و 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 مورد تأیید شما تأیید شده است.
تأیید درج بسته (اثبات درج بسته)
با استفاده از محمولهای که قبلاً ساختهاید، اکنون آماده هستید تا آزمایش کنید که آیا بسته مورد نظر در گزارش شفافیت گنجانده شده است یا خیر.
یک ابزار اثبات گنجاندن در مخزن 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
اگر نیست.