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

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{distinguish|text = [[Common Flash Interface]], the flash memory device identification standard}}
{{distinguish|text = [[कॉमन फ़्लैश इंटरफ़ेस]], फ़्लैश मेमोरी डिवाइस आइडेंटिफिकेशन स्टैंडर्ड}}
{{Short description|Term in computer security}}
{{Short description|Term in computer security}}
नियंत्रण-प्रवाह अखंडता (सीएफआई) [[कंप्यूटर सुरक्षा]] तकनीकों के लिए एक सामान्य शब्द है जो किसी प्रोग्राम के निष्पादन के प्रवाह (नियंत्रण प्रवाह) को पुनर्निर्देशित करने से विभिन्न प्रकार के [[मैलवेयर]] हमलों को रोकता है।
'''कंट्रोल फ्लो इंटीग्रिटी''' (सीएफआई) [[कंप्यूटर सुरक्षा]] तकनीकों के लिए एक सामान्य शब्द है जो किसी प्रोग्राम के एक्सिक्यूशन के फ्लो (कंट्रोल फ्लो) को पुनर्निर्देशित करने से विभिन्न प्रकार के [[मैलवेयर]] अटैक्स को रोकता है।


==पृष्ठभूमि के अतिरिक्त==
==पृष्ठभूमि के अतिरिक्त==
एक कंप्यूटर प्रोग्राम सामान्यतः निर्णय लेने और कोड के विभिन्न भागों का उपयोग करने के लिए अपने नियंत्रण प्रवाह को बदलता है। ऐसे स्थानांतरण प्रत्यक्ष हो सकते हैं, जिसमें लक्ष्य पता स्वयं कोड में लिखा होता है, या अप्रत्यक्ष, जिसमें लक्ष्य पता स्वयं मेमोरी या सीपीयू रजिस्टर में एक चर होता है। एक सामान्य फ़ंक्शन कॉल में, प्रोग्राम प्रत्यक्ष कॉल करता है, लेकिन स्टैक का उपयोग करके कॉलर फ़ंक्शन पर लौटता है - एक अप्रत्यक्ष बैकवर्ड-एज ट्रांसफर। जब किसी [[फ़ंक्शन सूचक]] को कॉल किया जाता है, जैसे कि [[ आभासी तालिका ]] से, तो हम कहते हैं कि एक अप्रत्यक्ष फॉरवर्ड-एज ट्रांसफर है।<ref name=Payer>{{cite web |last1=Payer |first1=Mattias |title=Control-Flow Integrity: An Introduction |url=https://nebelwelt.net/blog/20160913-ControlFlowIntegrity.html |website=nebelwelt.net}}</ref><ref>{{cite journal |last1=Burow |first1=Nathan |last2=Carr |first2=Scott A. |last3=Nash |first3=Joseph |last4=Larsen |first4=Per |last5=Franz |first5=Michael |last6=Brunthaler |first6=Stefan |last7=Payer |first7=Mathias |title=Control-Flow Integrity: Precision, Security, and Performance |journal=ACM Computing Surveys |date=31 January 2018 |volume=50 |issue=1 |pages=1–33 |doi=10.1145/3054924}}</ref>
एक कंप्यूटर प्रोग्राम सामान्यतः निर्णय लेने और कोड के विभिन्न भागों का उपयोग करने के लिए अपने कंट्रोल फ्लो को परिवर्तित करता है है। ऐसे स्थानांतरण प्रत्यक्ष हो सकते हैं, जिसमें टारगेट एड्रेस सैल्फ कोड में लिखा होता है, या अप्रत्यक्ष, जिसमें टारगेट एड्रेस सैल्फ मेमोरी या सीपीयू रजिस्टर में एक वैरिएबल होता है। एक सामान्य फ़ंक्शन कॉल में, प्रोग्राम प्रत्यक्ष कॉल करता है, लेकिन स्टैक का उपयोग करके कॉलर फ़ंक्शन पर लौटता है - एक अप्रत्यक्ष बैकवर्ड-एज ट्रांसफर जब किसी [[फ़ंक्शन सूचक|फ़ंक्शन पॉइंटर]] को कॉल किया जाता है, जैसे कि [[ आभासी तालिका |वर्चुअल टेबल]] से, तो हम कहते हैं कि एक अप्रत्यक्ष फॉरवर्ड-एज ट्रांसफर है।<ref name=Payer>{{cite web |last1=Payer |first1=Mattias |title=Control-Flow Integrity: An Introduction |url=https://nebelwelt.net/blog/20160913-ControlFlowIntegrity.html |website=nebelwelt.net}}</ref><ref>{{cite journal |last1=Burow |first1=Nathan |last2=Carr |first2=Scott A. |last3=Nash |first3=Joseph |last4=Larsen |first4=Per |last5=Franz |first5=Michael |last6=Brunthaler |first6=Stefan |last7=Payer |first7=Mathias |title=Control-Flow Integrity: Precision, Security, and Performance |journal=ACM Computing Surveys |date=31 January 2018 |volume=50 |issue=1 |pages=1–33 |doi=10.1145/3054924}}</ref>
हमलावर किसी प्रोग्राम के विशेषाधिकारों का उपयोग करने या उसके मेमोरी स्पेस से डेटा निकालने के लिए उसमें कोड इंजेक्ट करना चाहते हैं। निष्पादन योग्य कोड को सामान्यतः केवल-पढ़ने के लिए बनाए जाने से पहले, एक हमलावर कोड को चलाते समय मनमाने ढंग से बदल सकता है, प्रत्यक्ष हस्तांतरण को लक्षित कर सकता है या यहां तक ​​कि बिना किसी स्थानांतरण के भी ऐसा कर सकता है। W^X के व्यापक हो जाने के पश्चात, एक हमलावर अप्रत्यक्ष स्थानान्तरण का उपयोग करते हुए निष्पादन को चलाने के लिए कोड वाले एक अलग, असुरक्षित क्षेत्र में पुनर्निर्देशित करना चाहता है: कोई फॉरवर्ड-एज हमले के लिए वर्चुअल टेबल को ओवरराइट कर सकता है या बैकवर्ड-एज हमले ([[ वापसी-उन्मुख प्रोग्रामिंग ]]) के लिए कॉल स्टैक को बदल सकता है। सीएफआई को अप्रत्यक्ष स्थानान्तरण को अनपेक्षित स्थानों पर जाने से बचाने के लिए डिज़ाइन किया गया है।<ref name=Payer/>
 
अटैकर किसी प्रोग्राम के विशेषाधिकारों का उपयोग करने या उसके मेमोरी स्पेस से डेटा निकालने के लिए उसमें कोड इंजेक्ट करना चाहते हैं। एक्सिक्यूशन कोड को सामान्यतः रीड-ओनली के लिए बनाए जाने से पहले, एक अटैकर कोड को चलाते समय आर्बिटरी से परिवर्तित कर सकता है, डायरेक्ट ट्रांसफर को टार्गेटिंग कर सकता है या यहां तक ​​कि बिना किसी स्थानांतरण के भी ऐसा कर सकता है। W^X के व्यापक हो जाने के पश्चात, एक अटैकर अप्रत्यक्ष स्थानान्तरण का उपयोग करते हुए एक्सिक्यूशन को चलाने के लिए कोड वाले एक भिन्न, असुरक्षित क्षेत्र में पुनर्निर्देशित करना चाहता है: कोई फॉरवर्ड-एज अटैक के लिए वर्चुअल टेबल को ओवरराइट कर सकता है या बैकवर्ड-एज अटैक ([[ वापसी-उन्मुख प्रोग्रामिंग | रिटर्न ओरिएन्टेड प्रोग्रामिंग]] ) के लिए कॉल स्टैक को परिवर्तित कर सकता है। सीएफआई को अप्रत्यक्ष स्थानान्तरण को अनपेक्षित स्थानों पर जाने से बचाने के लिए डिज़ाइन किया गया है।<ref name="Payer" />
==तकनीक==
==तकनीक==
संबद्ध तकनीकों में कोड-पॉइंटर सेपरेशन (सीपीएस), कोड-पॉइंटर इंटीग्रिटी (सीपीआई), [[स्टैक कैनरी]], [[ छाया ढेर ]] और [[ आभासी विधि तालिका ]] पॉइंटर वेरिफिकेशन सम्मिलित हैं।<ref name="cfi_vs_vps_vs_cpi" /><ref name="adobe_darkreading" /><ref name="endgame_blackhat" />
संबद्ध तकनीकों में कोड-पॉइंटर सेपरेशन (सीपीएस), कोड-पॉइंटर इंटीग्रिटी (सीपीआई), [[स्टैक कैनरी]], [[शैडो स्टैक]] और वीटेबल पॉइंटर वेरिफिकेशन सम्मिलित हैं।<ref name="cfi_vs_vps_vs_cpi" /><ref name="adobe_darkreading" /><ref name="endgame_blackhat" />
==कार्यान्वयन==
==इम्प्लिमेंटेशन्स==
संबंधित कार्यान्वयन [[बजना]] (सामान्य रूप से एलएलवीएम) में उपलब्ध हैं,<ref name="clang_cfi"/>माइक्रोसॉफ्ट का नियंत्रण प्रवाह गार्ड<ref name="theregister_windows_cfg"/><ref name="threatpost_cfg"/><ref name="derbycon_bluehat"/>और रिटर्न फ्लो गार्ड,<ref name="Tencent - Return Flow Guard"/>Google की अप्रत्यक्ष फ़ंक्शन-कॉल जाँच<ref name="gcc_cfi_usenix14"/>और पुन: उपयोग आक्रमण रक्षक (आरएपी)<ref name="pax_rap_de"/><ref name="grsecurity_rap"/>
रिलेटेड इम्प्लिमेंटेशन्स [[क्लैंग]] (सामान्य रूप से एलएलवीएम),<ref name="clang_cfi"/> माइक्रोसॉफ्ट के कंट्रोल फ्लो गार्ड<ref name="theregister_windows_cfg"/><ref name="threatpost_cfg"/><ref name="derbycon_bluehat"/> और रिटर्न फ्लो गार्ड<ref name="Tencent - Return Flow Guard"/> गूगल के इनडायरेक्ट फंक्शन-कॉल चेक्स<ref name="gcc_cfi_usenix14"/> और रीयूज अटैक प्रोटेक्टर (आरएपी) में उपलब्ध हैं।<ref name="pax_rap_de"/><ref name="grsecurity_rap"/>
===एलएलवीएम/क्लैंग===
===एलएलवीएम/क्लैंग===
एलएलवीएम/क्लैंग एक सीएफआई विकल्प प्रदान करता है जो वर्चुअल टेबल और टाइप कास्ट में त्रुटियों की जांच करके फॉरवर्ड एज में काम करता है। यह जानने के लिए कि सामान्य स्थितियों में कौन से फ़ंक्शन को कॉल किया जाना चाहिए, यह [[लिंक-टाइम अनुकूलन]] (LTO) पर निर्भर करता है।<ref>{{cite web |title=Control Flow Integrity — Clang 17.0.0git documentation |url=https://clang.llvm.org/docs/ControlFlowIntegrity.html |website=clang.llvm.org}}</ref> एक अलग [[छाया कॉल स्टैक]] योजना है जो कॉल स्टैक संशोधनों की जांच करके पिछड़े किनारे पर बचाव करती है, जो केवल aarch64 के लिए उपलब्ध है।<ref>{{cite web |title=ShadowCallStack — Clang 17.0.0git documentation |url=https://clang.llvm.org/docs/ShadowCallStack.html |website=clang.llvm.org}}</ref>
एलएलवीएम/क्लैंग एक सीएफआई विकल्प प्रदान करता है जो वर्चुअल टेबल और टाइप कास्ट में त्रुटियों की जांच करके फॉरवर्ड एज में काम करता है। यह जानने के लिए कि सामान्य स्थितियों में कौन से फ़ंक्शन को कॉल किया जाना चाहिए, यह [[लिंक-टाइम अनुकूलन]] (LTO) पर निर्भर करता है।<ref>{{cite web |title=Control Flow Integrity — Clang 17.0.0git documentation |url=https://clang.llvm.org/docs/ControlFlowIntegrity.html |website=clang.llvm.org}}</ref> एक भिन्न [[छाया कॉल स्टैक]] योजना है जो कॉल स्टैक संशोधनों की जांच करके पिछड़े किनारे पर बचाव करती है, जो केवल aarch64 के लिए उपलब्ध है।<ref>{{cite web |title=ShadowCallStack — Clang 17.0.0git documentation |url=https://clang.llvm.org/docs/ShadowCallStack.html |website=clang.llvm.org}}</ref>
 
Google ने 2018 से लिंक-टाइम ऑप्टिमाइज़ेशन (LTO) और CFI के साथ क्लैंग द्वारा संकलित [[लिनक्स कर्नेल]] के साथ [[Android (OS)]] को शिप किया है।<ref>{{Cite web|url=https://www.phoronix.com/scan.php?page=news_item&px=Clang-LTO-Linux-Kernel-V2|title = Clang LTO Patches Updated for the Linux Kernel - Phoronix}}</ref> एससीएस एंड्रॉइड सहित लिनक्स कर्नेल के लिए एक विकल्प के रूप में उपलब्ध है।<ref>{{cite web |title=शैडोकॉलस्टैक|url=https://source.android.com/docs/security/test/shadow-call-stack |website=Android Open Source Project |language=en}}</ref>
Google ने 2018 से लिंक-टाइम ऑप्टिमाइज़ेशन (LTO) और CFI के साथ क्लैंग द्वारा संकलित [[लिनक्स कर्नेल]] के साथ [[Android (OS)]] को शिप किया है।<ref>{{Cite web|url=https://www.phoronix.com/scan.php?page=news_item&px=Clang-LTO-Linux-Kernel-V2|title = Clang LTO Patches Updated for the Linux Kernel - Phoronix}}</ref> एससीएस एंड्रॉइड सहित लिनक्स कर्नेल के लिए एक विकल्प के रूप में उपलब्ध है।<ref>{{cite web |title=शैडोकॉलस्टैक|url=https://source.android.com/docs/security/test/shadow-call-stack |website=Android Open Source Project |language=en}}</ref>
===इंटेल नियंत्रण-प्रवाह प्रवर्तन प्रौद्योगिकी===
===इंटेल कंट्रोल-फ्लो प्रवर्तन प्रौद्योगिकी===
इंटेल कंट्रोल-फ्लो एनफोर्समेंट टेक्नोलॉजी (सीईटी) शैडो स्टैक (एसएस) और अप्रत्यक्ष शाखा ट्रैकिंग (आईबीटी) के साथ प्रवाह अखंडता को नियंत्रित करने के लिए समझौते का पता लगाता है।<ref name="Control-flow Enforcement Technology Specification"/><ref name="R.I.P ROP: CET Internals in Windows 20H1"/>
इंटेल कंट्रोल-फ्लो एनफोर्समेंट टेक्नोलॉजी (सीईटी) शैडो स्टैक (एसएस) और अप्रत्यक्ष शाखा ट्रैकिंग (आईबीटी) के साथ फ्लो अखंडता को नियंत्रित करने के लिए समझौते का पता लगाता है।<ref name="Control-flow Enforcement Technology Specification" /><ref name="R.I.P ROP: CET Internals in Windows 20H1" />


शैडो स्टैक प्रत्येक कॉल के रिटर्न पते की एक प्रति विशेष रूप से संरक्षित शैडो स्टैक में संग्रहीत करता है। आरईटी पर, प्रोसेसर जांच करता है कि सामान्य स्टैक और शैडो स्टैक में संग्रहीत रिटर्न पता बराबर है या नहीं। यदि पते समान नहीं हैं, तो प्रोसेसर एक INT #21 (नियंत्रण प्रवाह सुरक्षा दोष) उत्पन्न करता है।
शैडो स्टैक प्रत्येक कॉल के रिटर्न पते की एक प्रति विशेष रूप से संरक्षित शैडो स्टैक में संग्रहीत करता है। आरईटी पर, प्रोसेसर जांच करता है कि सामान्य स्टैक और शैडो स्टैक में संग्रहीत रिटर्न पता बराबर है या नहीं। यदि पते समान नहीं हैं, तो प्रोसेसर एक 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 निर्देशों को एनओपी के रूप में समझा जाता है और उनका कोई प्रभाव नहीं पड़ता है।
अप्रत्यक्ष शाखा ट्रैकिंग अनधिकृत लक्ष्यों के साथ अप्रत्यक्ष जेएमपी या कॉल निर्देशों का पता लगाती है। इसे प्रोसेसर में एक नई आंतरिक स्टेट मशीन जोड़कर कार्यान्वित किया जाता है। अप्रत्यक्ष 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 निर्देशों को एनओपी के रूप में समझा जाता है और उनका कोई प्रभाव नहीं पड़ता है।
Line 25: Line 27:
[[विंडोज़ 10 क्रिएटर्स अपडेट]] (विंडोज़ 10 संस्करण 1703) के अनुसार, विंडोज़ कर्नेल को सीएफजी के साथ संकलित किया गया है।<ref name="TechNet - Shadow Brokers"/>विंडोज़ कर्नेल दुर्भावनापूर्ण कर्नेल कोड को सीएफजी बिटमैप को ओवरराइट करने से रोकने के लिए [[हाइपर-वी]] का उपयोग करता है।<ref name="Ionescu - Universally Bypassing CFG Through Mutability Abuse"/>
[[विंडोज़ 10 क्रिएटर्स अपडेट]] (विंडोज़ 10 संस्करण 1703) के अनुसार, विंडोज़ कर्नेल को सीएफजी के साथ संकलित किया गया है।<ref name="TechNet - Shadow Brokers"/>विंडोज़ कर्नेल दुर्भावनापूर्ण कर्नेल कोड को सीएफजी बिटमैप को ओवरराइट करने से रोकने के लिए [[हाइपर-वी]] का उपयोग करता है।<ref name="Ionescu - Universally Bypassing CFG Through Mutability Abuse"/>


सीएफजी एक प्रति-प्रक्रिया बिटमैप बनाकर संचालित होता है, जहां एक सेट बिट इंगित करता है कि पता एक वैध गंतव्य है। प्रत्येक अप्रत्यक्ष फ़ंक्शन कॉल करने से पहले, एप्लिकेशन जांचता है कि गंतव्य पता बिटमैप में है या नहीं। यदि गंतव्य पता बिटमैप में नहीं है, तो प्रोग्राम समाप्त हो जाता है।<ref name="MSDN - Control Flow Guard"/>इससे किसी हमलावर के लिए किसी ऑब्जेक्ट की सामग्री को प्रतिस्थापित करके और फिर पेलोड निष्पादित करने के लिए अप्रत्यक्ष फ़ंक्शन कॉल का उपयोग करके उपयोग-पश्चात-मुक्त उपयोग करना अधिक कठिन हो जाता है।<ref name="Exploiting CVE-2015-0311, Part II"/>
सीएफजी एक प्रति-प्रक्रिया बिटमैप बनाकर संचालित होता है, जहां एक सेट बिट इंगित करता है कि पता एक वैध गंतव्य है। प्रत्येक अप्रत्यक्ष फ़ंक्शन कॉल करने से पहले, एप्लिकेशन जांचता है कि गंतव्य पता बिटमैप में है या नहीं। यदि गंतव्य पता बिटमैप में नहीं है, तो प्रोग्राम समाप्त हो जाता है।<ref name="MSDN - Control Flow Guard"/>इससे किसी अटैकर के लिए किसी ऑब्जेक्ट की सामग्री को प्रतिस्थापित करके और फिर पेलोड निष्पादित करने के लिए अप्रत्यक्ष फ़ंक्शन कॉल का उपयोग करके उपयोग-पश्चात-मुक्त उपयोग करना अधिक कठिन हो जाता है।<ref name="Exploiting CVE-2015-0311, Part II"/>
====कार्यान्वयन विवरण====
====इम्प्लिमेंटेशन्स विवरण====
सभी संरक्षित अप्रत्यक्ष फ़ंक्शन कॉल के लिए, <code> _guard_check_icall</code> फ़ंक्शन को कॉल किया जाता है, जो निम्नलिखित चरण निष्पादित करता है:<ref name="Exploring Control Flow Guard in Windows 10"/># लक्ष्य पते को बिटमैप में ऑफसेट और बिट संख्या में बदलें।
सभी संरक्षित अप्रत्यक्ष फ़ंक्शन कॉल के लिए, <code>_guard_check_icall</code> फ़ंक्शन को कॉल किया जाता है, जो निम्नलिखित वैरिएबलण निष्पादित करता है:<ref name="Exploring Control Flow Guard in Windows 10"/># लक्ष्य पते को बिटमैप में ऑफसेट और बिट संख्या में बदलें।
## उच्चतम 3 बाइट्स बिटमैप में बाइट ऑफसेट हैं
## उच्चतम 3 बाइट्स बिटमैप में बाइट ऑफसेट हैं
## बिट ऑफसेट 5-बिट मान है। पहले चार बिट पते के चौथे से आठवें निम्न-क्रम बिट हैं।
## बिट ऑफसेट 5-बिट मान है। पहले चार बिट पते के चौथे से आठवें निम्न-क्रम बिट हैं।
## यदि गंतव्य पता 0x10 (अंतिम चार बिट्स 0 हैं) के साथ संरेखित है, तो बिट ऑफसेट का 5वां बिट 0 पर सेट है, और यदि यह नहीं है तो 1 पर सेट है।
## यदि गंतव्य पता 0x10 (अंतिम चार बिट्स 0 हैं) के साथ संरेखित है, तो बिट ऑफसेट का 5वां बिट 0 पर सेट है, और यदि यह नहीं है तो 1 पर सेट है।
# बिटमैप में लक्ष्य के पता मान की जांच करें
# बिटमैप में लक्ष्य के पता मान की जांच करें
## यदि लक्ष्य पता बिटमैप में है, तो बिना किसी त्रुटि के वापस लौटें।
## यदि टारगेट एड्रेस बिटमैप में है, तो बिना किसी त्रुटि के वापस लौटें।
## यदि लक्ष्य पता बिटमैप में नहीं है, तो प्रोग्राम को समाप्त करें।
## यदि टारगेट एड्रेस बिटमैप में नहीं है, तो प्रोग्राम को समाप्त करें।


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


* गंतव्य को उसी प्रक्रिया में लोड किए गए गैर-सीएफजी मॉड्यूल में स्थित कोड पर सेट करें।<ref name="Exploiting CVE-2015-0311, Part II"/><ref name="Windows 10 Control Flow Guard Internals"/>* एक अप्रत्यक्ष कॉल ढूंढें जो सीएफजी (या तो कॉल या जेएमपी) द्वारा संरक्षित नहीं थी।<ref name="Exploiting CVE-2015-0311, Part II"/><ref name="Windows 10 Control Flow Guard Internals"/><ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>* जिस फ़ंक्शन कॉल के लिए डिज़ाइन किया गया है उससे भिन्न संख्या में तर्कों के साथ फ़ंक्शन कॉल का उपयोग करें, जिससे स्टैक मिसलिग्न्मेंट हो जाता है, और फ़ंक्शन के वापस आने के पश्चात कोड निष्पादन होता है (विंडोज 10 में पैच किया गया)।<ref name="Bromium CFG stack desync"/>* समान संख्या में तर्कों के साथ एक फ़ंक्शन कॉल का उपयोग करें, लेकिन पास किए गए पॉइंटर्स में से एक को ऑब्जेक्ट के रूप में माना जाता है और पॉइंटर-आधारित ऑफसेट पर लिखता है, जिससे रिटर्न एड्रेस को ओवरराइट करने की अनुमति मिलती है।<ref name="Object Oriented Exploitation: New techniques in Windows mitigation bypass"/>* पते को सत्यापित करने के लिए सीएफजी द्वारा उपयोग किए गए फ़ंक्शन कॉल को अधिलेखित करें (मार्च 2015 में पैच किया गया)<ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>* सीएफजी बिटमैप को सभी 1 पर सेट करें, जिससे सभी अप्रत्यक्ष फ़ंक्शन कॉल की अनुमति मिल सके<ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>* स्टैक पर किसी पते को अधिलेखित करने के लिए नियंत्रित-लेखन आदिम का उपयोग करें (चूंकि स्टैक सीएफजी द्वारा संरक्षित नहीं है) <ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>
* गंतव्य को उसी प्रक्रिया में लोड किए गए गैर-सीएफजी मॉड्यूल में स्थित कोड पर सेट करें।<ref name="Exploiting CVE-2015-0311, Part II"/><ref name="Windows 10 Control Flow Guard Internals"/>* एक अप्रत्यक्ष कॉल ढूंढें जो सीएफजी (या तो कॉल या जेएमपी) द्वारा संरक्षित नहीं थी।<ref name="Exploiting CVE-2015-0311, Part II"/><ref name="Windows 10 Control Flow Guard Internals"/><ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>* जिस फ़ंक्शन कॉल के लिए डिज़ाइन किया गया है उससे भिन्न संख्या में तर्कों के साथ फ़ंक्शन कॉल का उपयोग करें, जिससे स्टैक मिसलिग्न्मेंट हो जाता है, और फ़ंक्शन के वापस आने के पश्चात कोड एक्सिक्यूशन होता है (विंडोज 10 में पैच किया गया)।<ref name="Bromium CFG stack desync"/>* समान संख्या में तर्कों के साथ एक फ़ंक्शन कॉल का उपयोग करें, लेकिन पास किए गए पॉइंटर्स में से एक को ऑब्जेक्ट के रूप में माना जाता है और पॉइंटर-आधारित ऑफसेट पर लिखता है, जिससे रिटर्न एड्रेस को ओवरराइट करने की अनुमति मिलती है।<ref name="Object Oriented Exploitation: New techniques in Windows mitigation bypass"/>* पते को सत्यापित करने के लिए सीएफजी द्वारा उपयोग किए गए फ़ंक्शन कॉल को अधिलेखित करें (मार्च 2015 में पैच किया गया)<ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>* सीएफजी बिटमैप को सभी 1 पर सेट करें, जिससे सभी अप्रत्यक्ष फ़ंक्शन कॉल की अनुमति मिल सके<ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>* स्टैक पर किसी पते को अधिलेखित करने के लिए नियंत्रित-लेखन आदिम का उपयोग करें (चूंकि स्टैक सीएफजी द्वारा संरक्षित नहीं है) <ref name="BYPASS CONTROL FLOW GUARD COMPREHENSIVELY"/>
===Microsoft विस्तारित फ़्लो गार्ड===
===Microsoft विस्तारित फ़्लो गार्ड===
एक्सटेंडेड फ्लो गार्ड (एक्सएफजी) अभी तक आधिकारिक तौर पर जारी नहीं किया गया है, लेकिन विंडोज इनसाइडर पूर्वावलोकन में उपलब्ध है और 2019 में ब्लूहैट शंघाई में सार्वजनिक रूप से प्रस्तुत किया गया था।<ref name="Advancing Windows Security Bluehat Shanghai 2019"/>
एक्सटेंडेड फ्लो गार्ड (एक्सएफजी) अभी तक आधिकारिक तौर पर जारी नहीं किया गया है, लेकिन विंडोज इनसाइडर पूर्वावलोकन में उपलब्ध है और 2019 में ब्लूहैट शंघाई में सार्वजनिक रूप से प्रस्तुत किया गया था।<ref name="Advancing Windows Security Bluehat Shanghai 2019"/>
Line 44: Line 46:
XFG फ़ंक्शन कॉल हस्ताक्षरों को मान्य करके CFG का विस्तार करता है ताकि यह सुनिश्चित किया जा सके कि अप्रत्यक्ष फ़ंक्शन कॉल केवल समान हस्ताक्षर वाले फ़ंक्शन के सबसेट के लिए हों। फ़ंक्शन कॉल हस्ताक्षर सत्यापन अप्रत्यक्ष कॉल से तुरंत पहले लक्ष्य फ़ंक्शन के हैश को रजिस्टर r10 में संग्रहीत करने और लक्ष्य पते के कोड से तुरंत पहले मेमोरी में गणना किए गए फ़ंक्शन हैश को संग्रहीत करने के निर्देश जोड़कर कार्यान्वित किया जाता है। जब अप्रत्यक्ष कॉल किया जाता है, तो XFG सत्यापन फ़ंक्शन r10 में मान की तुलना लक्ष्य फ़ंक्शन के संग्रहीत हैश से करता है। <ref name="EXTENDED FLOW GUARD UNDER THE MICROSCOPE"/><ref name="Exploit Development: Between a Rock and a (Xtended Flow) Guard Place: Examining XFG"/>
XFG फ़ंक्शन कॉल हस्ताक्षरों को मान्य करके CFG का विस्तार करता है ताकि यह सुनिश्चित किया जा सके कि अप्रत्यक्ष फ़ंक्शन कॉल केवल समान हस्ताक्षर वाले फ़ंक्शन के सबसेट के लिए हों। फ़ंक्शन कॉल हस्ताक्षर सत्यापन अप्रत्यक्ष कॉल से तुरंत पहले लक्ष्य फ़ंक्शन के हैश को रजिस्टर r10 में संग्रहीत करने और लक्ष्य पते के कोड से तुरंत पहले मेमोरी में गणना किए गए फ़ंक्शन हैश को संग्रहीत करने के निर्देश जोड़कर कार्यान्वित किया जाता है। जब अप्रत्यक्ष कॉल किया जाता है, तो XFG सत्यापन फ़ंक्शन r10 में मान की तुलना लक्ष्य फ़ंक्शन के संग्रहीत हैश से करता है। <ref name="EXTENDED FLOW GUARD UNDER THE MICROSCOPE"/><ref name="Exploit Development: Between a Rock and a (Xtended Flow) Guard Place: Examining XFG"/>
==यह भी देखें==
==यह भी देखें==
* [[बफर अतिप्रवाह संरक्षण]]
* [[बफर अतिप्रवाह संरक्षण|बफर अतिफ्लो संरक्षण]]


==संदर्भ==
==संदर्भ==

Revision as of 20:40, 5 August 2023

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

पृष्ठभूमि के अतिरिक्त

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

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

तकनीक

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

इम्प्लिमेंटेशन्स

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

एलएलवीएम/क्लैंग

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

Google ने 2018 से लिंक-टाइम ऑप्टिमाइज़ेशन (LTO) और CFI के साथ क्लैंग द्वारा संकलित लिनक्स कर्नेल के साथ Android (OS) को शिप किया है।[16] एससीएस एंड्रॉइड सहित लिनक्स कर्नेल के लिए एक विकल्प के रूप में उपलब्ध है।[17]

इंटेल कंट्रोल-फ्लो प्रवर्तन प्रौद्योगिकी

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

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

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

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

इम्प्लिमेंटेशन्स विवरण

सभी संरक्षित अप्रत्यक्ष फ़ंक्शन कॉल के लिए, _guard_check_icall फ़ंक्शन को कॉल किया जाता है, जो निम्नलिखित वैरिएबलण निष्पादित करता है:[24]# लक्ष्य पते को बिटमैप में ऑफसेट और बिट संख्या में बदलें।

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

बाईपास तकनीक

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

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

Microsoft विस्तारित फ़्लो गार्ड

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

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

यह भी देखें

संदर्भ

  1. 1.0 1.1 Payer, Mattias. "Control-Flow Integrity: An Introduction". nebelwelt.net.
  2. Burow, Nathan; Carr, Scott A.; Nash, Joseph; Larsen, Per; Franz, Michael; Brunthaler, Stefan; Payer, Mathias (31 January 2018). "Control-Flow Integrity: Precision, Security, and Performance". ACM Computing Surveys. 50 (1): 1–33. doi:10.1145/3054924.
  3. Payer, Mathias; Kuznetsov, Volodymyr. "On differences between the CFI, CPS, and CPI properties". nebelwelt.net. Retrieved 2016-06-01.
  4. "Adobe Flash Bug Discovery Leads To New Attack Mitigation Method". Dark Reading. 10 November 2015. Retrieved 2016-06-01.
  5. Endgame. "Endgame to Present at Black Hat USA 2016". www.prnewswire.com. Retrieved 2016-06-01.
  6. "Control Flow Integrity — Clang 3.9 documentation". clang.llvm.org. Retrieved 2016-06-01.
  7. Pauli, Darren. "Microsoft's malware mitigator refreshed, but even Redmond says it's no longer needed". The Register. Retrieved 2016-06-01.
  8. Mimoso, Michael (2015-09-22). "Bypass Developed for Microsoft Memory Protection, Control Flow Guard". Threatpost | The first stop for security news. Retrieved 2016-06-01.
  9. Smith, Ms. (23 September 2015). "DerbyCon: Former BlueHat prize winner will bypass Control Flow Guard in Windows 10". Network World. Retrieved 2016-06-01.
  10. "Return Flow Guard". Tencent. 2 November 2016. Retrieved 2017-01-19.
  11. Tice, Caroline; Roeder, Tom; Collingbourne, Peter; Checkoway, Stephen; Erlingsson, Úlfar; Lozano, Luis; Pike, Geoff (2014-01-01). Enforcing Forward-Edge Control-Flow Integrity in GCC & LLVM. pp. 941–955. ISBN 9781931971157.
  12. Security, heise. "PaX Team stellt Schutz vor Code Reuse Exploits vor". Security (in Deutsch). Retrieved 2016-06-01.
  13. "Frequently Asked Questions About RAP". Retrieved 2016-06-01.
  14. "Control Flow Integrity — Clang 17.0.0git documentation". clang.llvm.org.
  15. "ShadowCallStack — Clang 17.0.0git documentation". clang.llvm.org.
  16. "Clang LTO Patches Updated for the Linux Kernel - Phoronix".
  17. "शैडोकॉलस्टैक". Android Open Source Project (in English).
  18. "Control-flow Enforcement Technology Specification" (PDF). Intel Developer Zone. Retrieved 2021-01-05.[dead link]
  19. "R.I.P ROP: CET Internals in Windows 20H1". Winsider Seminars & Solutions Inc. Retrieved 2021-01-05.
  20. 20.0 20.1 "Control Flow Guard". MSDN. Retrieved 2017-01-19.
  21. "Analysis of the Shadow Brokers release and mitigation with Windows 10 virtualization-based security". Microsoft Technet. 16 June 2017. Retrieved 2017-06-20.
  22. "Universally Bypassing CFG Through Mutability Abuse" (PDF). Alex Ionescu's Blog. Retrieved 2017-07-07.
  23. 23.0 23.1 23.2 Falcón, Francisco (2015-03-25). "Exploiting CVE-2015-0311, Part II: Bypassing Control Flow Guard on Windows 8.1 Update 3". Core Security. Retrieved 2017-01-19.
  24. "Control Flow Guard" (PDF). Trend Micro. Retrieved 2017-01-19.
  25. 25.0 25.1 "Windows 10 Control Flow Guard Internals" (PDF). Power of Community. Retrieved 2017-01-19.
  26. 26.0 26.1 26.2 26.3 "Bypass Control Flow Guard Comprehensively" (PDF). BlackHat. Retrieved 2017-01-19.
  27. "An interesting detail about Control Flow Guard". Bromium. Retrieved 2017-01-19.
  28. Thomas, Sam (18 August 2016). "Object Oriented Exploitation: New techniques in Windows mitigation bypass". Slideshare. Retrieved 2017-01-19.
  29. "Advancing Windows Security". Retrieved 2021-05-19.
  30. "EXTENDED FLOW GUARD UNDER THE MICROSCOPE". Retrieved 2021-05-19.
  31. "Exploit Development: Between a Rock and a (Xtended Flow) Guard Place: Examining XFG". 23 August 2020. Retrieved 2021-05-19.