Android 8.1 में पेश किया गया Weaver हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल)
(IWeaver.aidl),
लॉक स्क्रीन नॉलेज फ़ैक्टर (एलएसकेएफ़) की मदद से, उपयोगकर्ता की पुष्टि करने के लिए एक सुरक्षित इंटरफ़ेस उपलब्ध कराता है.
एलएसकेएफ़ में पिन, पैटर्न, और पासवर्ड जैसी चीज़ें शामिल होती हैं.
Weaver, गेटकीपर की एलएसकेएफ़ की पुष्टि करने की सुविधा की जगह लेता है. हालांकि, हार्डवेयर की पुष्टि करने वाले टोकन जनरेट करने के लिए, अब भी गेटकीपर का इस्तेमाल किया जाता है.
Android 9 और इसके बाद के वर्शन में, सीडीडी 9.11.2 के तहत, StrongBox की सुविधा वाले डिवाइसों के लिए, सुरक्षित हार्डवेयर उपलब्ध कराना ज़रूरी है. इससे उपयोगकर्ता की पुष्टि करने की सुरक्षित सुविधा मिलती है. इस सुरक्षित हार्डवेयर का इस्तेमाल करके, Weaver एचएएल को लागू करने से, "उपयोगकर्ता की पुष्टि करने की सुरक्षित सुविधा" की ज़रूरत पूरी होती है.
जिन डिवाइसों में समर्पित सुरक्षित एलिमेंट (एसई) की सुविधा नहीं होती उनमें भी, Weaver को ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) में लागू किया जा सकता है. जैसे, Trusty.
Android 17 और इसके बाद के वर्शन में, सुरक्षित एलिमेंट की सुविधा वाले डिवाइसों के साथ-साथ, बिना सुरक्षा चिप की सुविधा वाले डिवाइसों में भी Weaver को लागू करने का सुझाव दिया जाता है.
घटक
Weaver में तीन कॉम्पोनेंट होते हैं:
- वीवर AIDL इंटरफ़ेस (
IWeaver): यह एचएएल की फ़ॉर्मल स्पेसिफ़िकेशन है. Android 13 और इससे पुराने वर्शन में, AIDL के बजाय HIDL का इस्तेमाल किया जाता था. - वीवर हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल) सेवा:
यह वेंडर के हिसाब से Android की एक प्रोसेस है, जो
IWeaverइंटरफ़ेस को लागू करती है. - Weaver ट्रस्टेड ऐप्लिकेशन (टीए): यह एक सुरक्षित एनवायरमेंट में काम करने वाली मुख्य लॉजिक है. यह एलएसकेएफ़ की पुष्टि करता है और लागू करता है रेट-लिमिटिंग. एचएएल सेवा, लागू करने के हिसाब से सुरक्षित चैनल का इस्तेमाल करके, टीए से कम्यूनिकेट करती है.
इंटरफ़ेस
Weaver का इंटरफ़ेस, परसिस्टेंट स्लॉट का तय साइज़ वाला एक कलेक्शन दिखाता है. हर स्लॉट में, तय साइज़ वाली एक कुंजी और तय साइज़ वाली एक वैल्यू होती है. हर स्लॉट की पहचान उसके आईडी से होती है. यह [0, numSlots - 1] इंटरवल में एक इंटिजर होता है. किसी स्लॉट की वैल्यू को सिर्फ़ तब ऐक्सेस किया जा सकता है, जब सेव की गई कुंजी से मेल खाने वाली कुंजी दी जाती है.
Weaver के इंटरफ़ेस में मुख्य रूप से ये शामिल हैं:
getConfig(): यह लागू करने की सुविधा के साथ काम करने वाले स्लॉट की संख्या, कुंजी का साइज़, और वैल्यू का साइज़ वापस लाता है.write(): यह तय किए गए स्लॉट को नई कुंजी-वैल्यू पेयर से बदलता है. यह ऑपरेशन एटॉमिक होता है. साथ ही, इससे पहले का डेटा हमेशा के लिए मिट जाता है . इसे वापस नहीं लाया जा सकता. इसे सुरक्षित तरीके से मिटाना कहा जाता है.read(): यह तय किए गए स्लॉट की वैल्यू वापस लाने की कोशिश करता है. यह सिर्फ़ तब काम करता है, जब रेट-लिमिटिंग का टाइम आउट (टीए के ज़रिए लागू किया गया) चालू न हो और दी गई कुंजी, सेव की गई कुंजी से पूरी तरह मेल खाती हो.warmUp(): Android 17 और इसके बाद के वर्शन में, यह एक हिंट देता है कि जल्द ही रीड या राइट ऑपरेशन हो सकता है.
इंटरफ़ेस की पूरी स्पेसिफ़िकेशन के लिए, देखें
IWeaver.aidl.
Android में इसका इस्तेमाल
जब Weaver को लागू करने की सुविधा उपलब्ध होती है, तब Android सिस्टम सर्वर में मौजूद LockSettingsService, उपयोगकर्ता के डेटा को सुरक्षित रखने के लिए इसका इस्तेमाल करता है. डिवाइस पर मौजूद हर उपयोगकर्ता के लिए, LockSettingsService एक Weaver स्लॉट मैनेज करता है:
- स्लॉट कुंजी (
weaverKey): यह उपयोगकर्ता के एलएसकेएफ़ का हैश है. अगर उपयोगकर्ता के पास स्क्रीन लॉक नहीं है, तो डिफ़ॉल्ट स्ट्रिंग का इस्तेमाल किया जाता है. - स्लॉट वैल्यू (
weaverSecret): यह ज़्यादा एंट्रॉपी वाली, रैंडम तरीके से जनरेट की गई क्रिप्टोग्राफ़िक सीक्रेट है.
weaverSecret को सिर्फ़ इन तरीकों से वापस पाने के लिए डिज़ाइन किया गया है:
- वीवर टीए को उसकी
रेट-लिमिटिंग नीति के तहत, सही
weaverKeyदेना. - उस सुरक्षित एनवायरमेंट से समझौता करना जिसमें Weaver टीए काम करता है. ऐसा करना बहुत मुश्किल होता है.
LockSettingsService , उपयोगकर्ता के सिंथेटिक पासवर्ड को एन्क्रिप्ट (सुरक्षित) करने के लिए, weaverKey और weaverSecret, दोनों का इस्तेमाल करता है. सिंथेटिक पासवर्ड,
फ़ाइल-बेस्ड एन्क्रिप्शन (एफ़बीई) के लिए,
उपयोगकर्ता के क्रेडेंशियल-एन्क्रिप्टेड (सीई) स्टोरेज
और Android Keystore में उपयोगकर्ता की
पुष्टि करने से जुड़ी कुंजियोंको सुरक्षित रखता है.
इसलिए, जब तक Weaver सीक्रेट रिलीज़ नहीं करता, तब तक डेटा को ऐक्सेस नहीं किया जा सकता.
Android 17 और इसके बाद के वर्शन में, एलएसकेएफ़ डालने की प्रोसेस शुरू होने पर, LockSettingsService, Weaver के warmUp() तरीके को कॉल करता है. Weaver को लागू करने की सुविधा, इस सिग्नल का इस्तेमाल करके, सुरक्षित हार्डवेयर को कम पावर वाली स्थिति से बाहर ला सकती है. इससे, आने वाले read() अनुरोध के लिए, इंतज़ार का समय कम हो जाता है.
Weaver बनाम गेटकीपर
पहले,
गेटकीपर एचएएल
, verify() कॉल में दो अलग-अलग भूमिकाएं निभाता था:
- पुष्टि करना: टीईई के ज़रिए लागू किए गए रेट-लिमिटिंग के साथ, एलएसकेएफ़ की जांच करना.
- प्रमाणित करना: KeyMint (पहले Keymaster) को यह बताने के लिए
HardwareAuthTokenजारी करना कि एलएसकेएफ़ की पुष्टि हो गई है.
Weaver का इस्तेमाल क्यों किया जाता है?
Android 8.1 में, सुरक्षित
पासकोड रीसेट करने के टोकन की सुविधा शुरू होने के बाद, सिंथेटिक पासवर्ड,
मुख्य क्रिप्टोग्राफ़िक सीक्रेट बन गया. ऊपर बताई गई दोनों भूमिकाओं को, गेटकीपर के अलग-अलग एनरोलमेंट से हैंडल किया जाता है. इनमें से एक एलएसकेएफ़ के लिए userId + 100000
के तहत और दूसरा सिंथेटिक पासवर्ड के लिए userIdके तहत होता है.
Weaver को पहली भूमिका निभाने के लिए पेश किया गया था. इसके लिए, सुरक्षित एलिमेंट (एसई) पर आधारित लागू करने की सुविधा के साथ, आसान एचएएल इंटरफ़ेस का इस्तेमाल किया जाता है.
| सुविधा | Weaver | गेटकीपर |
|---|---|---|
| सुरक्षित तरीके से मिटाना | सुरक्षित तरीके से मिटाना ज़रूरी है. साथ ही, इसे लागू करना आसान है, क्योंकि इंटरफ़ेस में तय साइज़ वाले स्लॉट की तय संख्या का इस्तेमाल किया जाता है. | सुरक्षित तरीके से मिटाना ज़रूरी नहीं है. साथ ही, इसे लागू करना मुश्किल है, क्योंकि इंटरफ़ेस में एनरोलमेंट की संख्या की कोई सीमा नहीं होती. |
| हार्डवेयर | एसई के लिए ऑप्टिमाइज़ किया गया है, लेकिन यह टीईई में भी काम करता है. | सिर्फ़ टीईई के लिए. मौजूदा डिज़ाइन के साथ, एसई में इसे लागू करने से सुरक्षा से जुड़ा कोई फ़ायदा नहीं मिलता. |
| गड़बड़ी ठीक करना | गड़बड़ी के कोड ज़्यादा साफ़ होते हैं. | गड़बड़ी के कोड अस्पष्ट होते हैं. इस वजह से, लॉक स्क्रीन, गलत एलएसकेएफ़ और दूसरी गड़बड़ियों के बीच अंतर नहीं कर पाती. |
| एटॉमिकिटी | LockSettingsService में मौजूद वह कोड जो Weaver का इस्तेमाल करता है,
एलएसकेएफ़ में बदलाव एटॉमिक तरीके से करता है. नया डेटा, Weaver के नए स्लॉट में लिखा जाता है. साथ ही,
पुराना स्लॉट सिर्फ़ तब मिटाया जाता है, जब ऐसा करना सुरक्षित हो. |
LockSettingsService में मौजूद वह कोड जो गेटकीपर
का इस्तेमाल करता है, एलएसकेएफ़ में बदलाव एटॉमिक तरीके से नहीं करता. एलएसकेएफ़ में बदलाव करते समय, अगर कोई गड़बड़ी होती है, तो उपयोगकर्ता का सारा डेटा मिट सकता है. |
रेफ़रंस कोड
AOSP में, Weaver के दो रेफ़रंस लागू करने की सुविधा मौजूद है:
-
Android 17 और इसके बाद के वर्शन में,
system/weaver/में सामान्य सुरक्षित एनवायरमेंट के लिए, Weaver को लागू करने की सुविधा मौजूद है. -
Android 8.1 और इसके बाद के वर्शन में,
external/libese/ISO/IEC7816-4 के साथ काम करने वाले सुरक्षित एलिमेंट के लिए, Weaver को लागू करने की सुविधा मौजूद है.
जांच करना
Weaver को लागू करने की सुविधा की पुष्टि करने के लिए, VtsHalWeaverTargetTest का इस्तेमाल करें:
atest VtsHalWeaverTargetTest
या:
vts-tradefed run vts -m VtsHalWeaverTargetTest