
यह Python उपयोगिता जाँचती है कि Android वेरिफाइड बूट इमेज (vbmeta) सार्वजनिक रूप से ज्ञात टेस्ट कुंजियों से हस्ताक्षरित हैं या नहीं, तथा रिलीज़ बिल्ड में गलत कॉन्फ़िगरेशन की पहचान करती है।
NCC Group के सलाहकारों को कभी-कभी एक त्रुटि का सामना करना पड़ता है, जो ज्ञात निजी कुंजियों के साथ एंड्रॉइड बिल्ड्स पर हस्ताक्षर करना है। यह डिवाइस निर्माताओं (और बदले में उनके उपयोगकर्ताओं) को असुरक्षित बनाता है, यहाँ तक कि उन डिवाइसों पर भी जहाँ सिक्योर बूट सक्षम है। इस ब्लॉग पोस्ट के दो लक्ष्य हैं:
जब एंड्रॉइड-आधारित डिवाइस बूट होते हैं, तो पहले बूटलोडर को हस्ताक्षरित कोड चलाने के लिए सत्यापित किया जाता है, फिर बूटलोडर उच्च-स्तरीय ऑपरेटिंग सिस्टम (HLOS) को सत्यापित करता है। यह ब्लॉग पोस्ट केवल बाद वाले भाग को कवर करता है।
प्रत्येक चिपसेट विक्रेता रूट ऑफ ट्रस्ट (RoT) को अलग-अलग तरीके से लागू कर सकता है, लेकिन आम तौर पर, डिवाइस e-fuses को कॉन्फ़िगर करके सुरक्षित किए जाते हैं। चिपसेट पर बर्न किया गया अपरिवर्तनीय ROM कोड इन e-fuses को पढ़ता है और उन्हें एक क्रिप्टोग्राफिक हैश के बिट्स के रूप में व्याख्या करता है। फिर हैश का उपयोग एक विश्वसनीय सार्वजनिक कुंजी को सत्यापित करने के लिए किया जाता है, जो आम तौर पर बूटलोडर बाइनरी में शामिल होती है। एक बार सार्वजनिक कुंजी मान्य हो जाने के बाद, इसका उपयोग बाद में क्रिप्टोग्राफिक रूप से यह सत्यापित करने के लिए किया जाता है कि डिवाइस पर चलने वाला पहला संशोधन योग्य कोड हस्ताक्षरित है। यदि यह प्रक्रिया सही ढंग से लागू की जाती है, तो बूटलोडर को संशोधित करने का कोई भी प्रयास विफल हो जाएगा। एंड्रॉइड-आधारित डिवाइस (सुरक्षा कैमरे, स्मार्ट प्लग या सेंसर, आदि) बनाने वाले OEM आम तौर पर अपने उत्पाद के लिए शुरुआती बिंदु के रूप में चिप विक्रेता (यानी Qualcomm) के संदर्भ डिज़ाइन और नमूना कोड का उपयोग करते हैं।
AVB उस तंत्र का हिस्सा है जिसका उपयोग डिवाइस पर चलने वाले सॉफ़्टवेयर की अखंडता सुनिश्चित करने के लिए किया जाता है। डिवाइस में vbmeta नामक एक पार्टीशन होता है जिसमें एक इमेज होती है जिसे क्रिप्टोग्राफिक रूप से सत्यापित किया जाता है। बूटलोडर द्वारा सफल सत्यापन करने के बाद, डिवाइस vbmeta इमेज की सामग्री पर भरोसा करता है। इमेज में ऐसी जानकारी होती है जिसका उपयोग बूटलोडर बाद में boot, vendor, या system जैसे पार्टीशनों पर मौजूद सॉफ़्टवेयर को मान्य करने के लिए करता है।
सुविधा के लिए, चिपसेट विक्रेता संदर्भ कोड प्रदान करते हैं जो बिना किसी बदलाव के सफलतापूर्वक कंपाइल हो जाता है, ताकि OEM की डिवाइस ब्रिंग-अप प्रक्रिया सरल हो सके। प्रारंभ में, इन इमेजों पर टेस्ट निजी कुंजियों का उपयोग करके हस्ताक्षर किए जाते हैं, जो पहली बार Google द्वारा जनरेट की गई थीं, और सभी वेनिला एंड्रॉइड बिल्ड्स पर मौजूद होती हैं। कभी-कभी चिप विक्रेता इन टेस्ट कुंजियों को अपडेट करते हैं, लेकिन निजी हस्ताक्षर कुंजियाँ अभी भी नमूना कोड में मौजूद होती हैं, इसलिए उन्हें अविश्वसनीय माना जाना चाहिए।
NCC Group ने पाया कि डिवाइस निर्माता फ़्यूज़ कॉन्फ़िगर करके बूटलोडर को सही ढंग से सुरक्षित कर सकते हैं, हालाँकि वे HLOS पर हस्ताक्षर करने के लिए उपयोग की जाने वाली डिफ़ॉल्ट टेस्ट निजी कुंजी नहीं बदलते हैं। इसलिए, जबकि बूटलोडर को संशोधित नहीं किया जा सकता, एक हमलावर कस्टम HLOS कोड बना और हस्ताक्षरित कर सकता है, और उन पार्टीशनों को अपडेट कर सकता है जिन्हें AVB प्रक्रिया द्वारा सफलतापूर्वक सत्यापित किया जाएगा।
NCC Group ने एक उपकरण बनाया है जो जाँचता है कि vbmeta.img में किसी ज्ञात निजी कुंजी का सार्वजनिक भाग शामिल है या नहीं। टेस्ट कुंजियों के लिए, उपकरण उपयोगकर्ता द्वारा प्रदान किया गया पथ स्वीकार करता है (एंड्रॉइड बिल्ड में BOARD_AVB_KEY_PATH पर्यावरण चर द्वारा इंगित), या यह GitHub से एकत्रित और उपकरण के साथ शामिल ज्ञात कुंजियों के संग्रह का उपयोग करता है।
$ python3 test_avb_key.py --help
Usage:
python test_avb_key.py [VBMETA.IMG] [PATH_PRIVATE_KEY]
Parameters:
* Parameter 'VBMETA.IMG' points to a user or userdebug file from an Android build.
Note: the userdebug image fails this test, it is expected.
* Grep Android build for 'BOARD_AVB_KEY_PATH' to obtain path of signing file,
and leave only the path, i.e. 'external/avb/test/data/'.
यदि HLOS सॉफ़्टवेयर पर डिफ़ॉल्ट निजी कुंजी के साथ हस्ताक्षर किए गए हैं, और समस्या फ़्लैग की जाती है। उदाहरण के लिए, LineageOS बिल्ड के लिए:
$ python test_avb_key.py ./sample/vbmeta/lineage/vbmeta.img ./sample/aosp/external/avb/test/data/
Opening vbmeta file: ./sample/vbmeta/lineage/vbmeta.img
Using known private key for verification: ./sample/aosp/external/avb/test/data/sign_key.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_pik.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_prk.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_psk.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_puk.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa2048.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa2048_gsi.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa2048_oneplus.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa4096.pem. Public key found at index: 945
If the script was executed on a vbmeta.img file from an Android user build, there is a problem.
अन्यथा, उपकरण एक सफलता संदेश लौटाता है, उदाहरण के लिए Pixel9 बिल्ड:
$ python test_avb_key.py ./sample/vbmeta/pixel9/vbmeta.img ./sample/aosp/external/avb/test/data/
Opening vbmeta file: ./sample/vbmeta/pixel9/vbmeta.img
Using known private key for verification: ./sample/aosp/external/avb/test/data/sign_key.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_pik.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_prk.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_psk.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_atx_puk.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa2048.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa2048_gsi.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa2048_oneplus.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa4096.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa4096_oneplus.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa4096_realtek.pem. Public key not found in vbmeta.img file. That's good.
Using known private key for verification: ./sample/aosp/external/avb/test/data/testkey_rsa8192.pem. Public key not found in vbmeta.img file. That's good.
No issues were found with ./sample/vbmeta/pixel9/vbmeta.img
एंड्रॉइड डेवलपर इस उपकरण का उपयोग एक त्वरित जांच के रूप में कर सकते हैं, ताकि यह सुनिश्चित किया जा सके कि रिलीज़/प्रोडक्शन के लिए बिल्ड्स सार्वजनिक रूप से ज्ञात निजी कुंजियों का उपयोग करके हस्ताक्षरित न हों। इसे बिल्ड प्रक्रिया में भी एकीकृत किया जा सकता है ताकि यह सुनिश्चित किया जा सके कि एंड्रॉइड यूज़र बिल्ड्स सही ढंग से हस्ताक्षरित हैं, अन्यथा बिल्ड विफल हो जाएगा।