साल 2016 तक, Android पर सभी जोखिमों में से करीब 86% जोखिम की आशंका, मेमोरी की सुरक्षा के तौर पर होती है संबंधित. ज़्यादातर जोखिमों का फ़ायदा, हमलावर ऑनलाइन खतरों में बदलते हैं नुकसान पहुंचाने वाली गतिविधियां करने के लिए ऐप्लिकेशन को कंट्रोल करना उन ऐप्लिकेशन के सभी खास अधिकार थे जिनका इस्तेमाल किया गया है. कंट्रोल फ़्लो इंटिग्रिटी (सीएफ़आई) एक ऐसा सुरक्षा सिस्टम है जो कंपाइल बाइनरी का ओरिजनल कंट्रोल फ़्लो ग्राफ़, जिससे यह काफ़ी मुश्किल हो जाता है की अनुमति है.
Android 8.1 में, हमने मीडिया स्टैक में LLVM को सीएफ़आई लागू करने की सुविधा चालू की है. तय सीमा में Android 9 में, हमने ज़्यादा कॉम्पोनेंट के साथ-साथ कर्नेल में CFI चालू कर दिया है. सिस्टम CFI है डिफ़ॉल्ट रूप से चालू रहता है, लेकिन आपको कर्नेल CFI को चालू करना होगा.
एलएलवीएम के सीएफ़आई को कंपाइल करने की ज़रूरत है लिंक-टाइम ऑप्टिमाइज़ेशन (एलटीओ). एलटीओ, ऑब्जेक्ट फ़ाइलों के एलएलवीएम बिटकोड को तब तक सुरक्षित रखता है, जब तक कि link-time की मदद से, कंपाइलर को यह जानने में मदद मिलती है कि किस ऑप्टिमाइज़ेशन किया जा सकता है. एलटीओ को चालू करने से फ़ाइनल बाइनरी का साइज़ कम हो जाता है और इसमें सुधार होता है काम करता है, लेकिन कंपाइल करने का समय बढ़ाता है. Android पर टेस्टिंग में, एलटीओ और सीएफ़आई के नतीजों से, कोड के साइज़ और परफ़ॉर्मेंस के लिए ज़्यादा ओवरहेड नहीं होता है; में कुछ मामलों में सुधार हुआ.
सीएफ़आई और फ़ॉरवर्ड कंट्रोल से जुड़ी अन्य जांचों की ज़्यादा तकनीकी जानकारी के लिए हैंडल की गई हो, तो एलएलवीएम डिज़ाइन देखें दस्तावेज़ में दिया गया है.
उदाहरण और सोर्स
कंपाइलर सीएफ़आई देता है और बाइनरी में इंस्ट्रुमेंटेशन जोड़ता है कंपाइल टाइम. हम Clang टूलचेन और Android बिल्ड सिस्टम में CFI के साथ काम करते हैं में हो रही है.
CFI, आर्म64 डिवाइसों के लिए डिफ़ॉल्ट रूप से चालू होती है. ऐसा, कॉम्पोनेंट के सेट के लिए किया जाता है
/platform/build/target/product/cfi-common.mk
.
यह मीडिया कॉम्पोनेंट के सेट में भी सीधे तौर पर चालू होता है' फ़ाइल/ब्लूप्रिंट
फ़ाइलें, जैसे कि /platform/frameworks/av/media/libmedia/Android.bp
और /platform/frameworks/av/cmds/stagefright/Android.mk
.
सिस्टम में सीएफ़आई को लागू करना
अगर Clang और Android बिल्ड सिस्टम का इस्तेमाल किया जा रहा है, तो सीएफ़आई डिफ़ॉल्ट रूप से चालू रहता है. सीएफ़आई, Android इस्तेमाल करने वालों को सुरक्षित रखता है. इसलिए, आपको इसे बंद नहीं करना चाहिए.
असल में, हम आपको अतिरिक्त कॉम्पोनेंट के लिए सीएफ़आई चालू करने का सुझाव देते हैं. सबसे बेहतर उम्मीदवार वे हैं जिन्हें खास अधिकारों वाला नेटिव कोड या नेटिव कोड के तौर पर इस्तेमाल किया जाता है. उपयोगकर्ता का इनपुट भरोसेमंद नहीं है. अगर clang और Android बिल्ड सिस्टम का इस्तेमाल किया जा रहा है, तो नए कॉम्पोनेंट में सीएफ़आई को चालू कर सकता है. इसके लिए आपको अपनी मेकफ़ाइल में कुछ लाइन जोड़नी होंगी या ब्लूप्रिंट फ़ाइलें हो सकती हैं.
मेकफ़ाइल में सीएफ़आई की मदद करना
किसी फ़ाइल में सीएफ़आई को चालू करने के लिए, जैसे कि /platform/frameworks/av/cmds/stagefright/Android.mk
,
जोड़ें:
LOCAL_SANITIZE := cfi # Optional features LOCAL_SANITIZE_DIAG := cfi LOCAL_SANITIZE_BLACKLIST := cfi_blacklist.txt
LOCAL_SANITIZE
बिल्ड.LOCAL_SANITIZE_DIAG
, CFI के लिए डाइग्नोस्टिक्स मोड चालू करता है. डाइग्नोस्टिक मोड, लॉगकैट में डीबग की ज़्यादा जानकारी को प्रिंट करता है क्रैश हो जाता है, जो आपके बिल्ड को डेवलप करने और उनकी जांच करने में मदद करता है. कंपनी या ब्रैंड हालांकि, प्रोडक्शन बिल्ड में डाइग्नोस्टिक मोड को ज़रूर हटा दें.LOCAL_SANITIZE_BLACKLIST
कॉम्पोनेंट को चुनने की अनुमति देता है अलग-अलग फ़ंक्शन या सोर्स फ़ाइलों के लिए, CFI इंस्ट्रुमेंटेशन बंद करें. आपने लोगों तक पहुंचाया मुफ़्त में ब्लैकलिस्ट का इस्तेमाल अंतिम उपाय के रूप में उपयोगकर्ता को होने वाली ऐसी किसी भी समस्या को ठीक करने के लिए कर सकता है अन्य मामलों में हो सकती है. ज़्यादा जानकारी के लिए, यह देखें सीएफ़आई को बंद करना.
ब्लूप्रिंट फ़ाइलों में सीएफ़आई के साथ काम करने की सुविधा
किसी ब्लूप्रिंट फ़ाइल, जैसे कि /platform/frameworks/av/media/libmedia/Android.bp
में सीएफ़आई को चालू करने के लिए,
जोड़ें:
sanitize: { cfi: true, diag: { cfi: true, }, blacklist: "cfi_blacklist.txt", },
समस्या का हल
अगर नए कॉम्पोनेंट में सीएफ़आई को चालू किया जा रहा है, तो आपको इनके साथ कुछ समस्याएं आ सकती हैं फ़ंक्शन टाइप के मेल न खाने से जुड़ी गड़बड़ियां और असेंबली कोड टाइप मेल नहीं खाते गड़बड़ियां शामिल हैं.
फ़ंक्शन टाइप के मेल न खाने से जुड़ी गड़बड़ियां होती हैं, क्योंकि सीएफ़आई ने इनडायरेक्ट कॉल को सिर्फ़ सीधे उन फ़ंक्शन पर जाएं जिनका डाइनैमिक टाइप, कॉल. सीएफ़आई, सदस्य के वर्चुअल और नॉन-वर्चुअल फ़ंक्शन कॉल को सिर्फ़ जंप करने की अनुमति देता है उन ऑब्जेक्ट के लिए इस्तेमाल किया जाता है जो कॉल करो. इसका मतलब है कि अगर आपके पास ऐसा कोड है जो इनमें से किसी एक का उल्लंघन करता है माना जाता है, तो सीएफ़आई ने जो इंस्ट्रुमेंटेशन जोड़ा वह रद्द हो जाएगा. उदाहरण के लिए, स्टैक ट्रेस, SIGABRT और Logcat में कंट्रोल फ़्लो के बारे में एक लाइन दिखाता है इंटिग्रिटी की एक गड़बड़ी को ठीक किया गया है.
इसे ठीक करने के लिए, पक्का करें कि कॉल किए गए फ़ंक्शन का टाइप वही है जो स्टैटिक रूप से एलान किया गया. यहां दो सीएल के उदाहरण दिए गए हैं:
- ब्लूटूथ: /c/platform/system/bt/+/532377
- एनएफ़सी: /c/platform/system/nfc/+/527858
एक अन्य समस्या, कोड में सीएफ़आई को चालू करने की कोशिश कर रही है. इस कोड में सीधे तौर पर न दिखने वाला सीएफ़आई होता है कॉल असेंबल करने का समय देती है. क्योंकि असेंबली कोड टाइप नहीं किया गया है, इसलिए यह एक प्रकार मेल नहीं खा रहा है.
इसे ठीक करने के लिए, हर असेंबली कॉल के लिए नेटिव कोड रैपर बनाएं और रैपर, कॉलिंग पोइनर के जैसा फ़ंक्शन सिग्नेचर होता है. रैपर यह कर सकता है तो सीधे असेंबली कोड पर कॉल करें. क्योंकि प्रत्यक्ष शाखाओं का काम सीएफ़आई (इन्हें रनटाइम के दौरान फिर से कॉन्फ़िगर नहीं किया जा सकता और इसलिए सुरक्षा से जुड़ा कोई जोखिम नहीं होता), इससे समस्या ठीक हो जाएगी.
अगर कई असेंबली फ़ंक्शन हैं और वे सभी ठीक नहीं किए जा सकते, तो आप साथ ही, उन सभी फ़ंक्शन को ब्लैकलिस्ट कर दें जिनमें अप्रत्यक्ष कॉल असेंबली होते हैं. यह है इसका सुझाव नहीं दिया जाता, क्योंकि इससे इन फ़ंक्शन पर सीएफ़आई की जांच बंद हो जाती है. इससे हमले की जगह तैयार करें.
सीएफ़आई को बंद करना
हमें परफ़ॉर्मेंस से जुड़े किसी ओवरहेड का पता नहीं चला. इसलिए, आपको इसे बंद नहीं करना चाहिए सीएफ़आई. हालांकि, अगर इसका असर उपयोगकर्ताओं पर पड़ता है, तो अपने हिसाब से सीएफ़आई को बंद किया जा सकता है सैनिटाइज़र ब्लैकलिस्ट फ़ाइल उपलब्ध कराकर अलग-अलग फ़ंक्शन या सोर्स फ़ाइलों के लिए इकट्ठा करने के दौरान. ब्लैकलिस्ट, कंपाइलर को सीएफ़आई बंद करने का निर्देश देती है कुछ खास जगहों पर इंस्ट्रुमेंटेशन.
Android बिल्ड सिस्टम हर कॉम्पोनेंट की ब्लैकलिस्ट के लिए सहायता देता है (इनकी अनुमति दे रहा है) की मदद से सोर्स फ़ाइलें या ऐसे अलग-अलग फ़ंक्शन चुने जा सकते हैं जिन्हें CFI नहीं मिलेगा इंस्ट्रुमेंटेशन). लाइव स्ट्रीम के फ़ॉर्मैट की मदद से, ब्लैकलिस्ट फ़ाइल, अपस्ट्रीम देखें Clang दस्तावेज़.
पुष्टि करें
फ़िलहाल, खास तौर पर सीएफ़आई के लिए कोई सीटीएस टेस्ट उपलब्ध नहीं है. इसके बजाय, पक्का करें कि सीएफ़आई की सुविधा चालू होने के साथ या उसके बिना भी, सीटीएस टेस्ट में पास होने से यह पुष्टि होती है कि सीएफ़आई का असर डिवाइस.