द्वारपाल

गेटकीपर सबसिस्टम एक विश्वसनीय निष्पादन वातावरण (टीईई) में डिवाइस पैटर्न/पासवर्ड प्रमाणीकरण करता है। गेटकीपर हार्डवेयर-समर्थित गुप्त कुंजी के साथ HMAC के माध्यम से पासवर्ड का नामांकन और सत्यापन करता है। इसके अतिरिक्त, गेटकीपर लगातार विफल सत्यापन प्रयासों को रोक देता है और उसे एक निश्चित समय-सीमा और लगातार विफल प्रयासों की एक निश्चित संख्या के आधार पर सेवा अनुरोधों को अस्वीकार करना होगा।

जब उपयोगकर्ता अपने पासवर्ड सत्यापित करते हैं, तो गेटकीपर हार्डवेयर-समर्थित कीस्टोर को भेजने के लिए प्रमाणीकरण सत्यापन पर हस्ताक्षर करने के लिए टीईई-व्युत्पन्न साझा रहस्य का उपयोग करता है। अर्थात्, गेटकीपर सत्यापन कीस्टोर को सूचित करता है कि प्रमाणीकरण-बाध्य कुंजियाँ (उदाहरण के लिए, ऐप्स द्वारा बनाई गई कुंजियाँ) ऐप्स द्वारा उपयोग के लिए जारी की जा सकती हैं।

वास्तुकला

द्वारपाल में तीन मुख्य घटक शामिल हैं:

  • gatekeeperd (द्वारपाल डेमन)। एक C++ बाइंडर सेवा जिसमें प्लेटफ़ॉर्म-स्वतंत्र तर्क और GateKeeperService जावा इंटरफ़ेस के अनुरूप है।
  • गेटकीपर हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल)hardware/libhardware/include/hardware/gatekeeper.h में HAL इंटरफ़ेस और कार्यान्वयन मॉड्यूल।
  • द्वारपाल (टीईई)gatekeeperd का टीईई समकक्ष। गेटकीपर का टीईई-आधारित कार्यान्वयन।

गेटकीपर को गेटकीपर एचएएल (विशेष रूप से hardware/libhardware/include/hardware/gatekeeper.h में कार्य) और टीईई-विशिष्ट गेटकीपर घटक ( system/gatekeeper/include/gatekeeper/gatekeeper.h हेडर फ़ाइल पर आधारित) के कार्यान्वयन की आवश्यकता होती है। जिसमें कुंजी बनाने/पहुँचने और हस्ताक्षरों की गणना करने के लिए शुद्ध आभासी कार्य शामिल हैं)।

LockSettingsService एक अनुरोध करता है (बाइंडर के माध्यम से) जो एंड्रॉइड ओएस में gatekeeperd डेमॉन तक पहुंचता है। इसके बाद gatekeeperd डेमॉन एक अनुरोध करता है जो टीईई में उसके समकक्ष (गेटकीपर) तक पहुंचता है:

द्वारपाल प्रवाह
चित्र 1. गेटकीपर द्वारा प्रमाणीकरण के लिए उच्च स्तरीय डेटा प्रवाह

gatekeeperd डेमॉन एंड्रॉइड फ्रेमवर्क एपीआई को एचएएल तक पहुंच प्रदान करता है, और कीस्टोर को डिवाइस प्रमाणीकरण की रिपोर्टिंग में भाग लेता है। gatekeeperd डेमॉन अपनी प्रक्रिया में चलता है और सिस्टम सर्वर से अलग होता है।

एचएएल कार्यान्वयन

gatekeeperd डेमॉन पासवर्ड प्रमाणीकरण के लिए gatekeeperd डेमॉन के टीईई समकक्ष के साथ बातचीत करने के लिए एचएएल का उपयोग करता है। एचएएल कार्यान्वयन को ब्लॉब्स पर हस्ताक्षर (नामांकन) और सत्यापन करने में सक्षम होना चाहिए। सभी कार्यान्वयनों से प्रत्येक सफल पासवर्ड सत्यापन पर उत्पन्न प्रमाणीकरण टोकन (ऑथटोकन) के मानक प्रारूप का पालन करने की अपेक्षा की जाती है। ऑथटोकन की सामग्री और अर्थ संबंधी विवरण के लिए, ऑथटोकन प्रारूप देखें।

hardware/libhardware/include/hardware/gatekeeper.h हेडर फ़ाइल के कार्यान्वयन को enroll और verify कार्यों को लागू करना होगा:

  • enroll फ़ंक्शन एक पासवर्ड ब्लॉब लेता है, उस पर हस्ताक्षर करता है, और हस्ताक्षर को एक हैंडल के रूप में लौटाता है। लौटाए गए ब्लॉब ( enroll के लिए कॉल से) में system/gatekeeper/include/gatekeeper/password_handle.h में दिखाई गई संरचना होनी चाहिए।
  • verify फ़ंक्शन को दिए गए पासवर्ड द्वारा उत्पादित हस्ताक्षर की तुलना करनी चाहिए और यह सुनिश्चित करना चाहिए कि यह नामांकित पासवर्ड हैंडल से मेल खाता है।

नामांकन और सत्यापन के लिए उपयोग की जाने वाली कुंजी कभी नहीं बदलनी चाहिए, और प्रत्येक डिवाइस बूट पर पुनः प्राप्त की जानी चाहिए।

भरोसेमंद और अन्य कार्यान्वयन

भरोसेमंद ऑपरेटिंग सिस्टम टीईई वातावरण के लिए Google का खुला स्रोत विश्वसनीय ओएस है और इसमें गेटकीपर का अनुमोदित कार्यान्वयन शामिल है। हालाँकि, आप गेटकीपर को लागू करने के लिए किसी भी टीईई ओएस का उपयोग कर सकते हैं, जब तक कि टीईई के पास हार्डवेयर-समर्थित कुंजी और एक सुरक्षित, मोनोटोनिक घड़ी तक पहुंच है जो सस्पेंड में टिक करती है

ट्रस्टी कीमास्टर और गेटकीपर ( ट्रस्टी गेटकीपर ) के ट्रस्टी कार्यान्वयन के बीच सीधे साझा रहस्य को संप्रेषित करने के लिए एक आंतरिक आईपीसी प्रणाली का उपयोग करता है। इस साझा रहस्य का उपयोग पासवर्ड सत्यापन के सत्यापन प्रदान करने के लिए कीस्टोर को भेजे गए ऑथटोकन पर हस्ताक्षर करने के लिए किया जाता है। भरोसेमंद गेटकीपर प्रत्येक उपयोग के लिए कीमास्टर से कुंजी का अनुरोध करता है और मूल्य को जारी या कैश नहीं करता है। कार्यान्वयन इस रहस्य को किसी भी तरह से साझा करने के लिए स्वतंत्र है जिससे सुरक्षा से समझौता न हो।

पासवर्ड को नामांकित और सत्यापित करने के लिए उपयोग की जाने वाली HMAC कुंजी पूरी तरह से गेटकीपर में प्राप्त और रखी जाती है।

एंड्रॉइड गेटकीपर का एक सामान्य C++ कार्यान्वयन प्रदान करता है जिसे पूरा करने के लिए केवल डिवाइस-विशिष्ट रूटीन को जोड़ने की आवश्यकता होती है। अपने टीईई के लिए डिवाइस-विशिष्ट कोड के साथ टीईई गेटकीपर को लागू करने के लिए, system/gatekeeper/include/gatekeeper/gatekeeper.h में फ़ंक्शन और टिप्पणियों को देखें। टीईई गेटकीपर के लिए, अनुपालन कार्यान्वयन की प्राथमिक जिम्मेदारियों में शामिल हैं:

  • गेटकीपर एचएएल का पालन।
  • लौटाए गए ऑथटोकन को ऑथेंटिकेशन विनिर्देश ( प्रमाणीकरण में वर्णित) के अनुसार स्वरूपित किया जाना चाहिए।
  • टीईई गेटकीपर को कीमास्टर के साथ एचएमएसी कुंजी साझा करने में सक्षम होना चाहिए, या तो मांग पर टीईई आईपीसी के माध्यम से कुंजी का अनुरोध करके या हर समय मूल्य का वैध कैश बनाए रखना चाहिए।

उपयोगकर्ता सुरक्षित आईडी (एसआईडी)

उपयोगकर्ता एसआईडी एक उपयोगकर्ता का टीईई प्रतिनिधित्व है (एंड्रॉइड उपयोगकर्ता आईडी से कोई मजबूत संबंध नहीं है)। जब भी कोई उपयोगकर्ता पिछला पासवर्ड उपलब्ध कराए बिना नया पासवर्ड दर्ज करता है तो SID एक क्रिप्टोग्राफ़िक स्यूडोरैंडम नंबर जनरेटर (PRNG) के साथ उत्पन्न होता है। इसे अविश्वसनीय पुनः नामांकन के रूप में जाना जाता है और सामान्य परिस्थितियों में एंड्रॉइड फ्रेमवर्क द्वारा इसकी अनुमति नहीं है। एक विश्वसनीय पुनः नामांकन तब होता है जब कोई उपयोगकर्ता एक वैध, पिछला पासवर्ड प्रदान करता है; इस मामले में, उपयोगकर्ता SID को नए पासवर्ड हैंडल पर माइग्रेट किया जाता है, जो इससे जुड़ी कुंजियों को संरक्षित करता है।

पासवर्ड नामांकित होने पर उपयोगकर्ता SID को पासवर्ड हैंडल में पासवर्ड के साथ HMAC'ed किया जाता है।

उपयोगकर्ता एसआईडी को verify फ़ंक्शन द्वारा लौटाए गए ऑथटोकन में लिखा जाता है और सभी प्रमाणीकरण-बाउंड कीस्टोर कुंजियों से जुड़ा होता है (ऑथटोकन प्रारूप और कीस्टोर पर विवरण के लिए, प्रमाणीकरण देखें)। चूंकि enroll फ़ंक्शन पर एक अविश्वसनीय कॉल उपयोगकर्ता एसआईडी को बदल देगी, कॉल उस पासवर्ड से जुड़ी कुंजियों को बेकार कर देगी। यदि हमलावर एंड्रॉइड ओएस को नियंत्रित करते हैं तो वे डिवाइस के लिए पासवर्ड बदल सकते हैं, लेकिन वे इस प्रक्रिया में रूट-संरक्षित, संवेदनशील कुंजियों को नष्ट कर देंगे।

थ्रॉटलिंग का अनुरोध करें

गेटकीपर को उपयोगकर्ता क्रेडेंशियल पर क्रूर-बल प्रयासों को सुरक्षित रूप से रोकने में सक्षम होना चाहिए। जैसा कि hardware/libhardware/include/hardware/gatekeeper.h में दिखाया गया है, HAL मिलीसेकंड में टाइमआउट लौटाने का प्रावधान करता है। टाइमआउट क्लाइंट को सूचित करता है कि टाइमआउट समाप्त होने तक गेटकीपर को दोबारा कॉल न करें; यदि कोई समय समाप्ति लंबित है तो गेटकीपर को अनुरोधों की सेवा नहीं देनी चाहिए।

उपयोगकर्ता पासवर्ड सत्यापित करने से पहले गेटकीपर को एक विफलता काउंटर लिखना होगा। यदि पासवर्ड सत्यापन सफल हो जाता है, तो विफलता काउंटर को साफ़ कर दिया जाना चाहिए। यह उन हमलों को रोकता है जो verify कॉल जारी करने के बाद एम्बेडेड एमएमसी (ईएमएमसी) को अक्षम करके थ्रॉटलिंग को रोकते हैं। enroll फ़ंक्शन उपयोगकर्ता पासवर्ड को भी सत्यापित करता है (यदि प्रदान किया गया है) और इसे उसी तरह से थ्रॉटल किया जाना चाहिए।

यदि डिवाइस द्वारा समर्थित है, तो यह अत्यधिक अनुशंसित है कि विफलता काउंटर को सुरक्षित भंडारण के लिए लिखा जाए। यदि डिवाइस फ़ाइल-आधारित एन्क्रिप्शन का समर्थन नहीं करता है, या यदि सुरक्षित भंडारण बहुत धीमा है, तो कार्यान्वयन सीधे रीप्ले प्रोटेक्टेड मेमोरी ब्लॉक (आरपीएमबी) का उपयोग कर सकता है।