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

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

पृष्ठभूमि के अतिरिक्त
एक कंप्यूटर प्रोग्राम सामान्यतः निर्णय लेने और कोड के विभिन्न भागों का उपयोग करने के लिए अपने नियंत्रण प्रवाह को बदलता है। ऐसे स्थानांतरण प्रत्यक्ष हो सकते हैं, जिसमें लक्ष्य पता स्वयं कोड में लिखा होता है, या अप्रत्यक्ष, जिसमें लक्ष्य पता स्वयं मेमोरी या सीपीयू रजिस्टर में एक चर होता है। एक सामान्य फ़ंक्शन कॉल में, प्रोग्राम प्रत्यक्ष कॉल करता है, लेकिन स्टैक का उपयोग करके कॉलर फ़ंक्शन पर लौटता है - एक अप्रत्यक्ष बैकवर्ड-एज ट्रांसफर। जब किसी फ़ंक्शन सूचक को कॉल किया जाता है, जैसे कि आभासी तालिका  से, तो हम कहते हैं कि एक अप्रत्यक्ष फॉरवर्ड-एज ट्रांसफर है। हमलावर किसी प्रोग्राम के विशेषाधिकारों का उपयोग करने या उसके मेमोरी स्पेस से डेटा निकालने के लिए उसमें कोड इंजेक्ट करना चाहते हैं। निष्पादन योग्य कोड को सामान्यतः केवल-पढ़ने के लिए बनाए जाने से पहले, एक हमलावर कोड को चलाते समय मनमाने ढंग से बदल सकता है, प्रत्यक्ष हस्तांतरण को लक्षित कर सकता है या यहां तक ​​कि बिना किसी स्थानांतरण के भी ऐसा कर सकता है। W^X के व्यापक हो जाने के पश्चात, एक हमलावर अप्रत्यक्ष स्थानान्तरण का उपयोग करते हुए निष्पादन को चलाने के लिए कोड वाले एक अलग, असुरक्षित क्षेत्र में पुनर्निर्देशित करना चाहता है: कोई फॉरवर्ड-एज हमले के लिए वर्चुअल टेबल को ओवरराइट कर सकता है या बैकवर्ड-एज हमले ( वापसी-उन्मुख प्रोग्रामिंग ) के लिए कॉल स्टैक को बदल सकता है। सीएफआई को अप्रत्यक्ष स्थानान्तरण को अनपेक्षित स्थानों पर जाने से बचाने के लिए डिज़ाइन किया गया है।

तकनीक
संबद्ध तकनीकों में कोड-पॉइंटर सेपरेशन (सीपीएस), कोड-पॉइंटर इंटीग्रिटी (सीपीआई), स्टैक कैनरी, छाया ढेर  और  आभासी विधि तालिका  पॉइंटर वेरिफिकेशन सम्मिलित हैं।

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

एलएलवीएम/क्लैंग
एलएलवीएम/क्लैंग एक सीएफआई विकल्प प्रदान करता है जो वर्चुअल टेबल और टाइप कास्ट में त्रुटियों की जांच करके फॉरवर्ड एज में काम करता है। यह जानने के लिए कि सामान्य स्थितियों में कौन से फ़ंक्शन को कॉल किया जाना चाहिए, यह लिंक-टाइम अनुकूलन (LTO) पर निर्भर करता है। एक अलग छाया कॉल स्टैक योजना है जो कॉल स्टैक संशोधनों की जांच करके पिछड़े किनारे पर बचाव करती है, जो केवल aarch64 के लिए उपलब्ध है। Google ने 2018 से लिंक-टाइम ऑप्टिमाइज़ेशन (LTO) और CFI के साथ क्लैंग द्वारा संकलित लिनक्स कर्नेल के साथ Android (OS) को शिप किया है। एससीएस एंड्रॉइड सहित लिनक्स कर्नेल के लिए एक विकल्प के रूप में उपलब्ध है।

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

शैडो स्टैक प्रत्येक कॉल के रिटर्न पते की एक प्रति विशेष रूप से संरक्षित शैडो स्टैक में संग्रहीत करता है। आरईटी पर, प्रोसेसर जांच करता है कि सामान्य स्टैक और शैडो स्टैक में संग्रहीत रिटर्न पता बराबर है या नहीं। यदि पते समान नहीं हैं, तो प्रोसेसर एक INT #21 (नियंत्रण प्रवाह सुरक्षा दोष) उत्पन्न करता है।

अप्रत्यक्ष शाखा ट्रैकिंग अनधिकृत लक्ष्यों के साथ अप्रत्यक्ष जेएमपी या कॉल निर्देशों का पता लगाती है। इसे प्रोसेसर में एक नई आंतरिक स्टेट मशीन जोड़कर कार्यान्वित किया जाता है। अप्रत्यक्ष JMP और CALL निर्देशों का व्यवहार बदल दिया गया है ताकि वे राज्य मशीन को IDLE से WAIT_FOR_ENDBRANCH पर स्विच कर दें। WAIT_FOR_ENDBRANCH स्थिति में, निष्पादित होने वाला अगला निर्देश नया ENDBRANCH निर्देश (32-बिट मोड में ENDBR32 या 64-बिट मोड में ENDBR64) होना आवश्यक है, जो आंतरिक स्थिति मशीन को WAIT_FOR_ENDBRANCH से वापस IDLE में बदल देता है। इस प्रकार अप्रत्यक्ष JMP या CALL का प्रत्येक अधिकृत लक्ष्य ENDBRANCH से प्रारंभ होना चाहिए। यदि प्रोसेसर WAIT_FOR_ENDBRANCH स्थिति में है (मतलब, पिछला निर्देश एक अप्रत्यक्ष JMP या CALL था), और अगला निर्देश ENDBRANCH निर्देश नहीं है, तो प्रोसेसर एक INT #21 (कंट्रोल फ्लो प्रोटेक्शन फॉल्ट) उत्पन्न करता है। सीईटी अप्रत्यक्ष शाखा ट्रैकिंग का समर्थन नहीं करने वाले प्रोसेसर पर, ENDBRANCH निर्देशों को एनओपी के रूप में समझा जाता है और उनका कोई प्रभाव नहीं पड़ता है।

माइक्रोसॉफ्ट कंट्रोल फ्लो गार्ड
कंट्रोल फ्लो गार्ड (सीएफजी) पहली बार नवंबर 2014 में विंडोज 8.1 अपडेट 3 (KB3000850) के लिए जारी किया गया था। डेवलपर्स अपने प्रोग्राम में सीएफजी को जोड़कर जोड़ सकते हैं।  विजुअल स्टूडियो 2015 या नए में प्रोग्राम लिंकिंग से पहले लिंकर ध्वज।

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

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

कार्यान्वयन विवरण
सभी संरक्षित अप्रत्यक्ष फ़ंक्शन कॉल के लिए,  फ़ंक्शन को कॉल किया जाता है, जो निम्नलिखित चरण निष्पादित करता है: # लक्ष्य पते को बिटमैप में ऑफसेट और बिट संख्या में बदलें।
 * 1) उच्चतम 3 बाइट्स बिटमैप में बाइट ऑफसेट हैं
 * 2) बिट ऑफसेट 5-बिट मान है। पहले चार बिट पते के चौथे से आठवें निम्न-क्रम बिट हैं।
 * 3) यदि गंतव्य पता 0x10 (अंतिम चार बिट्स 0 हैं) के साथ संरेखित है, तो बिट ऑफसेट का 5वां बिट 0 पर सेट है, और यदि यह नहीं है तो 1 पर सेट है।
 * 4) बिटमैप में लक्ष्य के पता मान की जांच करें
 * 5) यदि लक्ष्य पता बिटमैप में है, तो बिना किसी त्रुटि के वापस लौटें।
 * 6) यदि लक्ष्य पता बिटमैप में नहीं है, तो प्रोग्राम को समाप्त करें।

बाईपास तकनीक
सीएफजी को बायपास करने के लिए कई सामान्य तकनीकें हैं:


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

Microsoft विस्तारित फ़्लो गार्ड
एक्सटेंडेड फ्लो गार्ड (एक्सएफजी) अभी तक आधिकारिक तौर पर जारी नहीं किया गया है, लेकिन विंडोज इनसाइडर पूर्वावलोकन में उपलब्ध है और 2019 में ब्लूहैट शंघाई में सार्वजनिक रूप से प्रस्तुत किया गया था।

XFG फ़ंक्शन कॉल हस्ताक्षरों को मान्य करके CFG का विस्तार करता है ताकि यह सुनिश्चित किया जा सके कि अप्रत्यक्ष फ़ंक्शन कॉल केवल समान हस्ताक्षर वाले फ़ंक्शन के सबसेट के लिए हों। फ़ंक्शन कॉल हस्ताक्षर सत्यापन अप्रत्यक्ष कॉल से तुरंत पहले लक्ष्य फ़ंक्शन के हैश को रजिस्टर r10 में संग्रहीत करने और लक्ष्य पते के कोड से तुरंत पहले मेमोरी में गणना किए गए फ़ंक्शन हैश को संग्रहीत करने के निर्देश जोड़कर कार्यान्वित किया जाता है। जब अप्रत्यक्ष कॉल किया जाता है, तो XFG सत्यापन फ़ंक्शन r10 में मान की तुलना लक्ष्य फ़ंक्शन के संग्रहीत हैश से करता है।

यह भी देखें

 * बफर अतिप्रवाह संरक्षण