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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

bundletool

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

Androguard

Androguard, टूल का एक कलेक्शन है. इसका इस्तेमाल APK का विश्लेषण करने के लिए किया जाता है. इसे Androguard की वेबसाइट से डाउनलोड और इंस्टॉल किया जा सकता है.

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

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

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

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

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

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

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

हालांकि, मिली मेनिफ़ेस्ट फ़ाइल बाइनरी फ़ॉर्मैट में होती है, जिसे कोई भी व्यक्ति पढ़ नहीं सकता. बाइनरी एक्सएमएल को ऐसे फ़ॉर्मैट में बदलने के लिए जिसे कोई भी पढ़ सके, हम androguard सुइट के axml टूल का इस्तेमाल करते हैं. यह टूल, ज़रूरी शर्त सेक्शन में इंस्टॉल किया जाना चाहिए.

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 नाम वाली फ़ाइल होनी चाहिए, जो APK से निकाली गई अन्य फ़ाइलों के साथ 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 और उस पासकोड जोड़े की सार्वजनिक कुंजी का इस्तेमाल करते हैं जिसका इस्तेमाल, पासकोड पर हस्ताक्षर करने के लिए किया गया था. इन्हें संबंधित APK के हर सेक्शन में पब्लिश किया जाता है. मान लें कि आपने सार्वजनिक पासकोड सर्टिफ़िकेट (उदाहरण के लिए, 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 Open Source Project में मौजूद 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

पुष्टि करने वाला टूल, उससे जुड़े चेकपॉइंट और लॉग कॉन्टेंट (टाइल डायरेक्ट्री में मौजूद) का इस्तेमाल करके यह जांच करता है कि आपका APK पेलोड, पारदर्शिता वाले लॉग में मौजूद है या नहीं. इससे यह पुष्टि की जाती है कि इसे Google ने ही पब्लिश किया है.

कमांड का आउटपुट स्टैंडर्ड आउटपुट में लिखा जाता है:

  • OK. inclusion check success! अगर पैकेज का कोड लॉग में शामिल है,
  • FAILURE अगर ऐसा नहीं है.