Google प्रॉडक्ट ऐप्लिकेशन की पूरी तरह से पुष्टि करने की प्रक्रिया

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

पुष्टि की प्रक्रिया

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

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

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

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

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

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

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

इस लॉग की मदद से, Google के पहले पक्ष के ऐप्लिकेशन होने का दावा करने वाले किसी भी Google ऐप्लिकेशन की पुष्टि की जा सकती है.

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

इस बात की पुष्टि करने से पहले कि आर्टफ़ैक्ट (फ़र्मवेयर या APK), दावे के मुताबिक है, पक्का करें कि नेटवर्क से कनेक्ट किए गए कंप्यूटर पर ये टूल उपलब्ध हों. पुष्टि के लक्ष्य के आधार पर, हो सकता है कि आपको इन सभी की ज़रूरत न पड़े.

Golang

पुष्टि करने वाला टूल Go में लिखा गया है. इसे बनाने के लिए, Go साइट से Go 1.24 या इसके बाद का वर्शन इंस्टॉल करें.

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

ADB एक ऐसा टूल है जो Android डिवाइस के साथ कम्यूनिकेट करता है, ताकि इमेज की जांच की जा सके या APKs को एक्सट्रैक्ट किया जा सके. यह Android SDK प्लैटफ़ॉर्म टूल की वेबसाइट पर उपलब्ध है.

इनक्लूज़न प्रूफ़ की पुष्टि करने वाला टूल

प्रूफ़ ऑफ़ इन्क्लूज़न की पुष्टि करने वाला टूल, Go मॉड्यूल है. यह पारदर्शिता लॉग से क्वेरी करता है और यह आउटपुट देता है कि कोई आर्टफ़ैक्ट लॉग में शामिल है या नहीं. इसे android-binary-transparency GitHub रिपॉज़िटरी में पब्लिश किया गया है. यह रिपॉज़िटरी https://github.com/android/android-binary-transparency/tree/main पर मौजूद है

AOSP avb डेटाबेस को क्लोन करने के लिए:

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

android-binary-transparency GitHub रिपॉज़िटरी को क्लोन करने के लिए:

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

AAPT2

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

bundletool

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

wget या curl

wget और curl ऐसे टूल हैं जिनका इस्तेमाल, इंटरनेट से फ़ाइलें डाउनलोड करने या उन्हें वापस पाने के लिए किया जा सकता है. पक्का करें कि इनमें से कोई एक टूल इंस्टॉल हो, क्योंकि पुष्टि करने वाली स्क्रिप्ट इन पर निर्भर हो सकती हैं.

Avbtool

avbtool का इस्तेमाल, फ़ैक्ट्री इमेज के वीबीमेटा डाइजेस्ट की गिनती करने और बाइनरी की पुष्टि करने के लिए किया जाता है. avb रिपॉज़िटरी को क्लोन करने के बाद (जैसा कि Inclusion Proof verifier सेक्शन में दिखाया गया है), avbtool.py को क्लोन की गई avb डायरेक्ट्री में देखा जा सकता है. आपको इस डायरेक्ट्री को अपने $PATH एनवायरमेंट वैरिएबल में जोड़ना चाहिए.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool एक Python स्क्रिप्ट है. इसका इस्तेमाल Pixel के bootloader.img में मौजूद अलग-अलग कॉम्पोनेंट को अनपैक करने के लिए किया जाता है. अगर APKs की पुष्टि की जा रही है, तो आपको इसकी ज़रूरत नहीं है. यह टूल इसलिए ज़रूरी है, क्योंकि इससे avbtool.py को पुष्टि करने के लिए ज़रूरी इमेज मिल जाती हैं.

fbpacktool के लिए, Python 3.6 या उसके बाद के वर्शन और PyYAML पैकेज की ज़रूरत होती है. उदाहरण के लिए, python3 -m pip install pyyaml.

इस टूल का इस्तेमाल करने के लिए, आपको ये छह Python स्क्रिप्ट डाउनलोड करनी होंगी. इन्हें उस डायरेक्ट्री में डाउनलोड करें जहां आपका avbtool.py मौजूद है. इसके बाद, fbpacktool.py को एक्ज़ीक्यूटेबल बनाएं. साथ ही, सुविधा के लिए fbpacktool.py से fbpacktool नाम का एक सिमलिंक बनाएं.

अगर आपके पास wget है, तो:

computer:dir_to_avbtool$ wget https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

अगर आपके पास curl है, तो:

computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

OpenSSL

openssl की मदद से, पुष्टि करने के वर्कफ़्लो में टर्मिनल का इस्तेमाल करके, अलग-अलग क्रिप्टोग्राफ़िक कार्रवाइयां की जा सकती हैं. पक्का करें कि यह आपके सिस्टम पर इंस्टॉल हो. अपने टर्मिनल पर यह कमांड चलाकर देखें और पक्का करें कि नतीजे में कुछ न कुछ ज़रूर दिखे:

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

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

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

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

इसके बाद, अपने डिवाइस पर इंस्टॉल किया गया APK ढूंढें. इस गाइड में, Google Play services APK (com.google.android.gms) का इस्तेमाल, उदाहरण के तौर पर किया गया है.

adb shell pm path com.google.android.gms

आपको इससे मिलता-जुलता आउटपुट दिखेगा:

computer:~$ adb shell pm path com.google.android.gms
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/base.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_CronetDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteLoader_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesA_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesC_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_GoogleCertificates_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MapsDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MeasurementDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.en.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.xxhdpi.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_maps_core_dynamite_ondemand.apk

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

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

mkdir -p /tmp/testdir/gms && cd /tmp/testdir/gms && \
adb shell pm path com.google.android.gms | cut -d':' -f2 | tr -d '\r' | xargs -n1 adb pull

डाउनलोड किए गए APK के पैकेज का नाम और वर्शन की पुष्टि करने के लिए, आपको उनके मेनिफ़ेस्ट (AndroidManifest.xml) की जांच करनी होगी.

APK में मौजूद मेनिफ़ेस्ट, बाइनरी फ़ॉर्मैट में होता है. इसलिए, APK से सीधे जानकारी निकालने और उसे पढ़ने के लिए, aapt2 टूल का इस्तेमाल करें. यह टूल, ज़रूरी शर्तें वाले चरण के दौरान इंस्टॉल किया जाता है:

computer:/tmp/testdir/gms$ aapt2 dump badging ./base.apk
package: name='com.google.android.gms' versionCode='260834035' versionName='26.08.34 (260400-876566425)' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
minSdkVersion:'35'
targetSdkVersion:'36'
...

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

आउटपुट से पुष्टि होती है कि APK के पैकेज का नाम com.google.android.gms है और इसका वर्शन नंबर (versionCode) 260834035 है.

इसके बाद, हर APK के क्रिप्टोग्राफ़िक हैश की गणना करें:

computer:/tmp/testdir/gms$ sha256sum *.apk
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a  base.apk
c20754aee886cc55a9de91ee15c623c59d94ad22b7e435a1a48afc43cf1a106c  split_config.en.apk
68c09b63a1262e0d34020c139bc77deff3c32bd2b01177abac64790a62fb3be6  split_config.xxhdpi.apk
cd746820c27babd855fa5daea6fabcdf7b44abf3060bc547adc4219212410af0  split_CronetDynamite_installtime.apk
512ee48b60fdb0787a17f84a7dc448fdbf885b2b86a9cb50525d4c22d561b0f1  split_DynamiteLoader_installtime.apk
9e0c74bdc75c50c80d4e2e580a7eda6b8391423ab1161645f41ec6cadc07d678  split_DynamiteModulesA_installtime.apk
955780ac01f59b98bd9be12968f3824ad71b762620f7bf223c569c1a6ab7056c  split_DynamiteModulesC_installtime.apk
34c4a2e32d31554d55fc1519e2cfc3ed5027a090fb29b54cfc99f42d1da43bc5  split_GoogleCertificates_installtime.apk
475e18dde92472cde9d8300c082b6dc269613db03398bcd9d1987dff3e68f7b5  split_maps_core_dynamite_ondemand.apk
f83faf40f08bc13f4879302e01c08c863ca2304b4b4e7c9eaf8cd1e869bb6573  split_MapsDynamite_installtime.apk
ec6d854ddda6cd1ba2ba7af2d9fdf4f28c5c78be8713c64521c785429296738c  split_MeasurementDynamite_installtime.apk

अब आपके पास लॉग पेलोड बनाने के लिए ज़रूरी सारी जानकारी है. इसे लॉग कॉन्टेंट सेक्शन में बताए गए तरीके से फ़ॉर्मैट किया गया है. नतीजों में से किसी एक हैश को उदाहरण के तौर पर चुनने पर (आपको हर split APK के हैश की पुष्टि करनी चाहिए), लॉग पेलोड ऐसा दिखता है:

66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035

पक्का करें कि आपने फ़ाइल के आखिर में एक न्यूलाइन वर्ण शामिल किया हो. इस कॉन्टेंट को payload.txt जैसी किसी फ़ाइल में सेव करें, ताकि बाद में verifier टूल के साथ इसका इस्तेमाल किया जा सके.

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

पे लोड बनाने के बाद, अब यह देखा जा सकता है कि पैकेज को पारदर्शिता लॉग में शामिल किया गया है या नहीं. android-binary-transparency की उस रिपॉज़िटरी से, शामिल किए जाने के सबूत वाला टूल बनाएं जिसे आपने पहले क्लोन किया था:

go build cmd/verifier/verifier.go

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

computer:android-binary-transparency$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:android-binary-transparency$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_apk

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

यह कमांड, stderr पर आउटपुट देती है:

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

किसी डिवाइस में मौजूद सभी पैकेज की अपने-आप पुष्टि होने की सुविधा

आपके डिवाइस पर Google के कई ऐप्लिकेशन पहले से इंस्टॉल हो सकते हैं. ऐसे में, हर ऐप्लिकेशन को अलग-अलग करके शामिल करने के सबूत देना मुश्किल हो सकता है.

हम एक और ऑटोमेटेड टूल Uraniborg उपलब्ध कराते हैं. यह आपके डिवाइस पर फ़िलहाल इंस्टॉल किए गए सभी पैकेज का पता लगा सकता है और उन्हें मेज़र कर सकता है. यह टूल, अपने आउटपुट को सीधे verifier टूल में भेजता है. इससे आपको एक ही चरण में, अपने डिवाइस पर मौजूद सभी ऐप्लिकेशन की पारदर्शिता के बारे में पता चलता है और उनकी पुष्टि की जा सकती है.

इस ऑटोमेटेड वर्कफ़्लो का इस्तेमाल करने के लिए, पक्का करें कि आपका Android डिवाइस, ADB के ज़रिए आपके कंप्यूटर से कनेक्ट हो. Uraniborg का सोर्स कोड भी android-binary-transparency रिपॉज़िटरी में शामिल है.

scripts/python डायरेक्ट्री में मौजूद automate_observation.py स्क्रिप्ट चलाएं:

python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>

स्क्रिप्ट पूरी होने पर, आपको इससे मिलता-जुलता आउटपुट दिखेगा:

INFO:automate_observation.py:main(858): SUCCESS! Hubble was successfully deployed and executed on connected device ABCDEFGHN01234.
INFO:automate_observation.py:main(860): Hubble output files can be found at: /Users/user/home/src/android-binary-transparency/uraniborg/scripts/python/results/google/lynx/lynx:16/BP4A.260105.004.E1/14587043:user/release-keys/001

स्क्रिप्ट में बताई गई आउटपुट डायरेक्ट्री पर जाएं. इसके अंदर, packages_with_inclusion_proof_signal.txt नाम की फ़ाइल ढूंढें. इस फ़ाइल में, इंस्टॉल किए गए हर पैकेज की सूची होती है. साथ ही, इसमें inclusion_proof_verified फ़ील्ड होता है, जो true या false पर सेट होता है. true वैल्यू से पता चलता है कि पैकेज की पुष्टि, पारदर्शिता लॉग के हिसाब से क्रिप्टोग्राफ़िक तरीके से की गई है. इससे यह पुष्टि होती है कि पैकेज, लॉग के दावों के मुताबिक है.