Google System Services APK के लिए पारदर्शिता की पूरी पुष्टि

इस पेज पर, यह पक्का करने के अलग-अलग तरीकों के बारे में बताया गया है कि आपके Android डिवाइस पर इंस्टॉल किया गया APK, दावेदार मॉडल में किए गए दावे से मेल खाता हो. इसमें आपके डिवाइस से उस APK को खींचना, उसके कोड की इंटिग्रिटी की जांच करना, और निकाले गए आर्टफ़ैक्ट पर लॉग इंक्लूज़न प्रूफ़ करना शामिल है.

पुष्टि की प्रोसेस

पारदर्शिता लॉग को हैश वाले मर्कल ट्री के साथ लागू किया जाता है. लीफ़ नोड में डेटा होता है और पैरंट नोड में उसके चाइल्ड नोड का हैश होता है.

असल में, पारदर्शिता लॉग की छेड़छाड़ का पता लगाने वाली प्रॉपर्टी की पुष्टि करने के लिए, Merkle ट्री पर दो तरह की गणनाएं की जाती हैं: शामिल किए जाने का सबूत और एक जैसा होने का सबूत. पहले वाले से यह साबित होता है कि लॉग में किसी खास APK वर्शन से जुड़ी एंट्री शामिल है. लॉग एंट्री में एक हैश शामिल होता है. यह JSON Web Token (JWT) के तौर पर, कोड सिग्नेचर टोकन का SHA256 डाइजेस्ट होता है. इसे संबंधित APK से हासिल किया जा सकता है. इससे यह साबित होता है कि जब ट्री में नई एंट्री जोड़ी जाती हैं, तो नया चेकपॉइंट, ट्री के पिछले वर्शन के साथ (क्रिप्टोग्राफ़िक तौर पर) एक जैसा होता है.

कवर किए गए APK की पुष्टि करने के लिए, देखे गए चेकपॉइंट के आधार पर, शामिल किए जाने का सबूत देने वाला टेस्ट करें. ध्यान दें कि हम इस लॉग को सार्वजनिक विटनेस नेटवर्क के साथ इंटिग्रेट करने का प्लान बना रहे हैं. इसके लिए, स्टैंडर्ड विटनेस प्रोटोकॉल का इस्तेमाल किया जाएगा. इससे एक ऐसा चेकपॉइंट मिलेगा जिसकी निगरानी की गई है. इससे यह पक्का होता है कि लॉग में कोई बदलाव नहीं किया गया है.

अगर आपको यह पक्का करना है कि आपके डिवाइस पर मौजूद APK, दावेदार मॉडल में किए गए दावे के मुताबिक है, तो यहां दिया गया लेख पढ़ें.

शामिल किए जाने का सबूत

Android का इस्तेमाल करने वाला कोई व्यक्ति यह देख सकता है कि उसके डिवाइस पर मौजूद APK, लॉग में शामिल है या नहीं. इसके लिए, उसे पहले APK और उससे जुड़ा मेटाडेटा निकालना होगा. इसके बाद, उसे अपने रीकंप्यूट किए गए रूट हैश की तुलना, पब्लिश किए गए चेकपॉइंट में मौजूद रूट हैश से करनी होगी. अगर ये दोनों मैच करते हैं, तो Android का इस्तेमाल करने वाला व्यक्ति, थ्रेट मॉडल में बताई गई सुरक्षा सुविधाओं का भरोसा कर सकता है.

लॉग में APK शामिल होने की पुष्टि करने का तरीका

जैसा कि पहले बताया गया है, फ़िलहाल जिन APK को कवर किया गया है उनकी सूची, खास जानकारी वाले पेज पर देखी जा सकती है.

पुष्टि कराने से जुड़ी ज़रूरी शर्तें

अपने डिवाइस से अभी-अभी निकाले गए APK की पुष्टि करने से पहले, आपको इन टूल की ज़रूरत होगी. इन्हें नेटवर्क से कनेक्ट किए गए कंप्यूटर पर इंस्टॉल करें.

Android डीबग ब्रिज (ADB)

ADB एक ऐसा टूल है जो Android डिवाइस से कम्यूनिकेट करता है. यह Android SDK Platform Tools की वेबसाइट पर उपलब्ध है.

AAPT2

AAPT2 (Android ऐसेट पैकेजिंग टूल) एक बिल्ड टूल है. इसका इस्तेमाल, Android ऐप्लिकेशन के संसाधनों को कंपाइल और पैकेज करने के लिए किया जाता है. यह Android SDK Build Tools 26.0.2 और इसके बाद के वर्शन में, स्टैंडअलोन टूल के तौर पर उपलब्ध है.

bundletool

bundletool एक ऐसा टूल है जिसका इस्तेमाल Android ऐप्लिकेशन बंडल (एएबी) बनाने के लिए किया जाता है. इसका इस्तेमाल, AAB को ऐसे APK में बदलने के लिए भी किया जा सकता है जिन्हें डिवाइसों पर इंस्टॉल किया जा सकता है. इसे GitHub से डाउनलोड किया जा सकता है.

सबको शामिल करने से जुड़े सबूत की पुष्टि करने वाला

यह एक Go मॉड्यूल है, जिसे हमने Android Open Source Project (AOSP) में avb नाम की git रिपॉज़िटरी में पब्लिश किया है. यह Google System Services APK के पारदर्शिता लॉग से क्वेरी कर सकता है. साथ ही, यह बताता है कि कोई पैकेज लॉग में शामिल है या नहीं. इसका इस्तेमाल कैसे किया जाता है, इसका उदाहरण बाद के सेक्शन में दिया गया है.

इस टूल को डाउनलोड करने के लिए, आपको पहले avb रिपॉज़िटरी को क्लोन करना होगा.

computer:~$ git clone https://android.googlesource.com/platform/external/avb

पुष्टि करने वाले व्यक्ति का सोर्स कोड, tools/transparency/verify में मौजूद avb रिपॉज़िटरी में देखा जा सकता है.

पुष्टि करने के लिए पेलोड बनाना

यह पुष्टि करने के लिए कि आपने हमारे दावों के मुताबिक, अपने डिवाइस से APK निकाला है, आपको APK से मिली जानकारी का इस्तेमाल करके लॉग पेलोड बनाना होगा.

शुरू करने से पहले, पक्का करें कि आपके डिवाइस पर adb का इस्तेमाल किया जा सकता हो. इसके लिए, अपने डिवाइस पर adb डीबगिंग की सुविधा चालू करें.

इसके बाद, अपने डिवाइस पर देखें कि APK कहां इंस्टॉल किया गया है. इस गाइड के लिए, हम Android System Key Verifier 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

अगर आपके डिवाइस पर Android System Key Verifier APK इंस्टॉल है, तो ऊपर दिया गया कमांड, उस पाथ को दिखाएगा जहां यह आपके डिवाइस पर इंस्टॉल है. ऐसा न करने पर, आपको कोई आउटपुट नहीं दिखेगा.

इसके बाद, अपने Android डिवाइस से 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 नाम की फ़ाइल में होता है.

हालांकि, मिली हुई मेनिफ़ेस्ट फ़ाइल बाइनरी फ़ॉर्म में है. इसे कोई भी व्यक्ति आसानी से नहीं पढ़ सकता. बाइनरी एक्सएमएल को इंसानों के पढ़ने लायक फ़ॉर्म में बदलने के लिए, हम पहले इंस्टॉल किए गए 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 फ़ोल्डर में मौजूद होनी चाहिए.

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 और उस कुंजी जोड़े की सार्वजनिक कुंजी का इस्तेमाल करते हैं जिसका इस्तेमाल इसे पहली बार साइन करने के लिए किया गया था. इन्हें संबंधित एपीके के हर सेक्शन में पब्लिश किया जाता है. मान लें कि आपने सार्वजनिक पासकोड सर्टिफ़िकेट (जैसे, Android System Key Verifier के लिए) को 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

अब हम bundletool की check-transparency कमांड का इस्तेमाल करने के लिए तैयार हैं. इससे यह पुष्टि की जा सकेगी कि कैंडिडेट 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 की पुष्टि की जा रही है उसके लिए कोड के हस्ताक्षर की पुष्टि हो गई है.

पैकेज को शामिल किए जाने की पुष्टि करना (शामिल किए जाने का सबूत)

आपने पहले जो पेलोड बनाया था उसका इस्तेमाल करके, अब यह टेस्ट किया जा सकता है कि क्या इस पैकेज को पारदर्शिता लॉग में शामिल किया गया है.

Android ओपन सोर्स प्रोजेक्ट में, avb repository के अंदर, शामिल किए जाने का सबूत देने वाला टूल पब्लिश किया गया है. इसे चलाने के लिए:

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 नहीं है.