नियंत्रण प्रवाह अखंडता

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

एंड्रॉइड 8.1 में, हमने मीडिया स्टैक में एलएलवीएम के सीएफआई के कार्यान्वयन को सक्षम किया। एंड्रॉइड 9 में, हमने सीएफआई को अधिक घटकों और कर्नेल में भी सक्षम किया। सिस्टम CFI डिफ़ॉल्ट रूप से चालू है लेकिन आपको कर्नेल CFI को सक्षम करने की आवश्यकता है।

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

सीएफआई के बारे में अधिक तकनीकी विवरण और अन्य फॉरवर्ड-कंट्रोल चेक कैसे प्रबंधित किए जाते हैं, एलएलवीएम डिज़ाइन दस्तावेज़ देखें।

उदाहरण और स्रोत

CFI संकलक द्वारा प्रदान किया जाता है और संकलन समय के दौरान बाइनरी में इंस्ट्रूमेंटेशन जोड़ता है। हम क्लैंग टूलचेन में सीएफआई और एओएसपी में एंड्रॉइड बिल्ड सिस्टम का समर्थन करते हैं।

CFI डिफ़ॉल्ट रूप से /platform/build/target/product/cfi-common.mk में घटकों के सेट के लिए आर्म64 उपकरणों के लिए सक्षम है। यह मीडिया घटकों के मेकफ़ाइल/ब्लूप्रिंट फ़ाइलों के सेट में भी सीधे तौर पर सक्षम है, जैसे कि /platform/frameworks/av/media/libmedia/Android.bp और /platform/frameworks/av/cmds/stagefright/Android.mk

कार्यान्वयन प्रणाली सीएफआई

यदि आप क्लैंग और एंड्रॉइड बिल्ड सिस्टम का उपयोग करते हैं तो सीएफआई डिफ़ॉल्ट रूप से सक्षम है। क्योंकि CFI Android उपयोगकर्ताओं को सुरक्षित रखने में मदद करता है, इसलिए आपको इसे अक्षम नहीं करना चाहिए।

वास्तव में, हम आपको अतिरिक्त घटकों के लिए CFI को सक्षम करने के लिए दृढ़ता से प्रोत्साहित करते हैं। आदर्श उम्मीदवार विशेषाधिकार प्राप्त मूल कोड, या मूल कोड होते हैं जो अविश्वसनीय उपयोगकर्ता इनपुट को संसाधित करते हैं। यदि आप क्लैंग और Android बिल्ड सिस्टम का उपयोग कर रहे हैं, तो आप अपनी मेकफ़ाइल या ब्लूप्रिंट फ़ाइलों में कुछ पंक्तियाँ जोड़कर नए घटकों में CFI को सक्षम कर सकते हैं।

मेकफ़ाइल में CFI का समर्थन करना

मेक फ़ाइल में CFI को सक्षम करने के लिए, जैसे /platform/frameworks/av/cmds/stagefright/Android.mk , जोड़ें:

LOCAL_SANITIZE := cfi
# Optional features
LOCAL_SANITIZE_DIAG := cfi
LOCAL_SANITIZE_BLACKLIST := cfi_blacklist.txt
  • LOCAL_SANITIZE निर्माण के दौरान CFI को सैनिटाइज़र के रूप में निर्दिष्ट करता है।
  • LOCAL_SANITIZE_DIAG CFI के लिए नैदानिक ​​मोड चालू करता है। डायग्नोस्टिक मोड क्रैश के दौरान लॉगकैट में अतिरिक्त डिबग जानकारी को प्रिंट करता है, जो आपके बिल्ड के विकास और परीक्षण के दौरान उपयोगी होता है। हालाँकि, प्रोडक्शंस बिल्ड पर डायग्नोस्टिक मोड को हटाना सुनिश्चित करें।
  • LOCAL_SANITIZE_BLACKLIST घटकों को अलग-अलग कार्यों या स्रोत फ़ाइलों के लिए चुनिंदा रूप से CFI इंस्ट्रूमेंटेशन को अक्षम करने की अनुमति देता है। आप किसी भी उपयोगकर्ता-सामना करने वाली समस्याओं को ठीक करने के लिए अंतिम उपाय के रूप में ब्लैकलिस्ट का उपयोग कर सकते हैं जो अन्यथा मौजूद हो सकती हैं। अधिक जानकारी के लिए, CFI को अक्षम करना देखें।

ब्लूप्रिंट फाइलों में सीएफआई का समर्थन करना

ब्लूप्रिंट फ़ाइल में CFI को सक्षम करने के लिए, जैसे /platform/frameworks/av/media/libmedia/Android.bp , जोड़ें:

   sanitize: {
        cfi: true,
        diag: {
            cfi: true,
        },
        blacklist: "cfi_blacklist.txt",
    },

समस्या निवारण

यदि आप नए घटकों में CFI को सक्षम कर रहे हैं, तो आप फ़ंक्शन प्रकार बेमेल त्रुटियों और असेंबली कोड प्रकार बेमेल त्रुटियों के साथ कुछ समस्याओं का सामना कर सकते हैं।

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

इसे ठीक करने के लिए, सुनिश्चित करें कि कॉल किए गए फ़ंक्शन में वही प्रकार है जो स्थिर रूप से घोषित किया गया था। यहाँ दो उदाहरण CL हैं:

एक अन्य संभावित समस्या कोड में CFI को सक्षम करने का प्रयास कर रही है जिसमें असेंबली के लिए अप्रत्यक्ष कॉल शामिल हैं। चूंकि असेंबली कोड टाइप नहीं किया गया है, इसका परिणाम एक प्रकार का मेल नहीं है।

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

यदि बहुत अधिक असेंबली फ़ंक्शन हैं और वे सभी ठीक नहीं किए जा सकते हैं, तो आप उन सभी फ़ंक्शंस को ब्लैकलिस्ट भी कर सकते हैं जिनमें असेंबली के लिए अप्रत्यक्ष कॉल शामिल हैं। यह अनुशंसित नहीं है क्योंकि यह इन कार्यों पर सीएफआई जांच को अक्षम करता है, जिससे हमले की सतह खुल जाती है।

सीएफआई अक्षम करना

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

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

मान्यकरण

वर्तमान में, विशेष रूप से CFI के लिए कोई CTS परीक्षण नहीं है। इसके बजाय, यह सुनिश्चित करने के लिए कि CFI डिवाइस को प्रभावित नहीं कर रहा है, सुनिश्चित करें कि CTS परीक्षण CFI के साथ या उसके बिना पास हैं।