इस पेज पर, यह पक्का करने के अलग-अलग तरीकों के बारे में बताया गया है कि आपके Android डिवाइस पर इंस्टॉल किया गया APK, दावेदार मॉडल में किए गए दावे से मेल खाता है या नहीं. इसके लिए, आपके डिवाइस से उस APK को निकाला जाता है जिसकी जांच करनी है. इसके बाद, उसके कोड की इंटिग्रिटी की जांच की जाती है. साथ ही, निकाले गए आर्टफ़ैक्ट पर, लॉग में शामिल होने का सबूत दिखाया जाता है.
पुष्टि की प्रोसेस
पारदर्शिता लॉग को, हैश वाले मर्कल ट्री के साथ लागू किया जाता है. लीफ़ नोड में डेटा होता है और पेरेंट नोड में उसके चाइल्ड नोड का हैश होता है.
पारदर्शिता लॉग की छेड़छाड़ से सुरक्षित होने की पुष्टि करने के लिए, मर्कल ट्री पर दो तरह की गणनाएं की जाती हैं: शामिल होने का सबूत और एक जैसा होने का सबूत. पहले सबूत से यह साबित होता है कि लॉग में, किसी खास APK वर्शन से जुड़ी एंट्री शामिल है. लॉग एंट्री में एक हैश शामिल होता है. यह SHA256 डाइजेस्ट, JSON वेब टोकन (JWT) के फ़ॉर्मैट में कोड सिग्नेचर टोकन का होता है. इसे, संबंधित APK से हासिल किया जा सकता है. दूसरे सबूत से यह साबित होता है कि ट्री में नई एंट्री जोड़ने पर, नया चेकपॉइंट, ट्री के पिछले वर्शन के साथ (क्रिप्टोग्राफ़िक तरीके से) एक जैसा होता है.
कवर किए गए APK की पुष्टि करने के लिए, देखे गए चेकपॉइंट के आधार पर, शामिल होने के सबूत का टेस्ट करें. ध्यान दें कि हम इस लॉग को, स्टैंडर्ड विटनेस प्रोटोकॉल का इस्तेमाल करके, सार्वजनिक विटनेस नेटवर्क के साथ इंटिग्रेट करने की योजना बना रहे हैं using a standardized witness protocol. इससे, देखा गया चेकपॉइंट मिलेगा. इससे लॉग के एक जैसा होने की गारंटी मिलती है.
अगर आपको यह पक्का करना है कि आपके डिवाइस पर मौजूद APK, दावेदार मॉडल में किए गए दावे के मुताबिक है, तो यहां दिया गया लेख पढ़ें.
शामिल होने का सबूत
कोई Android उपयोगकर्ता, यह देख सकता है कि उसके डिवाइस पर कवर किया गया APK, लॉग में शामिल है या नहीं. इसके लिए, सबसे पहले उसे APK और उससे जुड़ा मेटाडेटा निकालना होगा. इसके बाद, फिर से कंप्यूट किए गए रूट हैश की तुलना, पब्लिश किए गए चेकपॉइंट में मौजूद रूट हैश से करनी होगी. अगर दोनों हैश मेल खाते हैं, तो Android उपयोगकर्ता को थ्रेट मॉडल में बताई गई कुछ सुरक्षाओं का भरोसा मिल सकता है.
लॉग में, किसी APK के शामिल होने की पुष्टि करने का तरीका
जैसा कि पहले बताया गया है, फ़िलहाल कवर किए गए APK की सूची, खास जानकारी वाले पेज पर देखी जा सकती है.
पुष्टि के आवेदन से जुड़ी शर्तें
आर्टफ़ैक्ट (फ़र्मवेयर या APK) के दावे के मुताबिक होने की पुष्टि करने से पहले, पक्का करें कि नेटवर्क से कनेक्ट किए गए कंप्यूटर पर ये टूल उपलब्ध हों. पुष्टि के टारगेट के आधार पर, आपको इन सभी टूल की ज़रूरत नहीं पड़ सकती है.
Golang
पुष्टि करने वाला टूल, Go में लिखा गया है. इसे बनाने के लिए, Go की साइट से Go 1.24 या उसके बाद का वर्शन इंस्टॉल करें.
Android डीबग ब्रिज (ADB)
ADB एक ऐसा टूल है जो Android डिवाइस से कम्यूनिकेट करके, इमेज की जांच करता है या
APK निकालता है. यह 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 एक ऐसा टूल है जिसका इस्तेमाल, Android ऐप्लिकेशन बंडल (एएबी) बनाने के लिए किया जाता है. इसका इस्तेमाल, APK के कोड सिग्नेचर की पुष्टि करने के लिए भी किया जा सकता है.
इसे GitHub से डाउनलोड किया जा सकता है.
wget या curl
wget और curl ऐसे टूल हैं जिनका इस्तेमाल, इंटरनेट से फ़ाइलें पाने या डाउनलोड करने के लिए किया जा सकता है. पक्का करें कि इनमें से कोई एक टूल इंस्टॉल हो, क्योंकि पुष्टि करने वाले स्क्रिप्ट इन पर निर्भर हो सकते हैं.
Avbtool
avbtool
का इस्तेमाल, फ़ैक्ट्री इमेज के VBMeta डाइजेस्ट और
बाइनरी की पुष्टि करने के लिए किया जाता है.
avb रिपॉज़िटरी को क्लोन करने के बाद (जैसा कि शामिल होने के सबूत की पुष्टि करने वाले टूल
सेक्शन में दिखाया गया है), क्लोन की गई avb डायरेक्ट्री में avbtool.py मिल सकता है.
आपको इस डायरेक्ट्री को अपने $PATH एनवायरमेंट वैरिएबल में जोड़ना चाहिए.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool एक Python स्क्रिप्ट है. इसका इस्तेमाल, Pixel के कॉम्पोनेंट को अनपैक करने के लिए किया जाता हैbootloader.img.
अगर आपको APK की पुष्टि करनी है, तो इसकी ज़रूरत नहीं है.
यह टूल ज़रूरी है, क्योंकि इसकी मदद से avbtool.py को पुष्टि के लिए ज़रूरी इमेज मिलती हैं.
इस टूल का इस्तेमाल करने के लिए, आपको ये तीन Python स्क्रिप्ट
उस डायरेक्ट्री में डाउनलोड करनी होंगी जहां आपका avbtool.py मौजूद है.
साथ ही, fbpacktool.py को एक्ज़ीक्यूटेबल बनाना होगा,
और आसानी के लिए, fbpacktool.py के लिए fbpacktool नाम का एक सिमलंक बनाना होगा.
अगर आपके पास wget है, तो:
computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
अगर आपके पास curl है, तो:
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.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 का इस्तेमाल किया जा सकता है. इसके लिए, अपने डिवाइस पर
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 नाम की फ़ाइल में होता है.
हालांकि, मिली हुई मेनिफ़ेस्ट फ़ाइल बाइनरी फ़ॉर्म में होती है, जिसे पढ़ा नहीं जा सकता.
बाइनरी 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 नाम की एक फ़ाइल होनी चाहिए. यह 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 नाम की फ़ाइल में सेव कर लिया है.
अब कोड सिग्नेचर की पुष्टि करने के लिए, यहां दिया गया तरीका अपनाएं.
सबसे पहले, आपको एक 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
अब हम 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 repository within
शामिल होने के सबूत का टूल पब्लिश किया गया है. इसे चलाने के लिए:
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_1p_code
पुष्टि करने वाला टूल, संबंधित चेकपॉइंट और लॉग के कॉन्टेंट (जो टाइल डायरेक्ट्री में मौजूद हैं) का इस्तेमाल करके, यह जांचता है कि आपका APK पेलोड, पारदर्शिता लॉग में शामिल है या नहीं. साथ ही, यह पुष्टि करता है कि इसे Google ने ही पब्लिश किया है.
कमांड का आउटपुट, stdout में लिखा जाता है:
- अगर पैकेज का कोड लॉग में शामिल है, तो
OK. inclusion check success! - अगर ऐसा नहीं है, तो
FAILURE.