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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

यह भी देखें

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