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

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

पृष्ठभूमि के अतिरिक्त
एक कंप्यूटर प्रोग्राम सामान्यतः निर्णय लेने और कोड के विभिन्न भागों का उपयोग करने के लिए अपने कंट्रोल फ्लो को परिवर्तित करता है है। ऐसे स्थानांतरण प्रत्यक्ष हो सकते हैं, जिसमें टारगेट एड्रेस सैल्फ कोड में लिखा होता है, या अप्रत्यक्ष, जिसमें टारगेट एड्रेस सैल्फ मेमोरी या सीपीयू रजिस्टर में एक वैरिएबल होता है। एक सामान्य फ़ंक्शन कॉल में, प्रोग्राम प्रत्यक्ष कॉल करता है, लेकिन स्टैक का उपयोग करके कॉलर फ़ंक्शन पर लौटता है - एक अप्रत्यक्ष बैकवर्ड-एज ट्रांसफर जब किसी फ़ंक्शन पॉइंटर को कॉल किया जाता है, जैसे कि वर्चुअल टेबल से, तो हम कहते हैं कि एक अप्रत्यक्ष फॉरवर्ड-एज ट्रांसफर है।

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

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

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

एलएलवीएम/क्लैंग
एलएलवीएम/क्लैंग एक सीएफआई विकल्प प्रदान करता है जो वर्चुअल टेबल और टाइप कास्ट में त्रुटियों की जांच करके फॉरवर्ड एज में काम करता है। यह जानने के लिए कि सामान्य स्थितियों में कौन से फ़ंक्शन को कॉल किया जाना चाहिए, यह लिंक-टाइम अनुकूलन (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 में मान की तुलना लक्ष्य फ़ंक्शन के संग्रहीत हैश से करता है।

यह भी देखें

 * बफर अतिफ्लो संरक्षण