नियंत्रण-प्रवाह अखंडता: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{distinguish|text = [[कॉमन फ़्लैश इंटरफ़ेस]], फ़्लैश मेमोरी डिवाइस आइडेंटिफिकेशन स्टैंडर्ड}} | {{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> | ||
अटैकर किसी प्रोग्राम के विशेषाधिकारों का उपयोग करने या उसके मेमोरी स्पेस से डेटा निकालने के लिए उसमें कोड इंजेक्ट करना चाहते हैं। एक्सिक्यूशन कोड को सामान्यतः रीड-ओनली के लिए बनाए जाने से पहले, एक अटैकर कोड को चलाते समय आर्बिटरी से परिवर्तित कर सकता है, डायरेक्ट ट्रांसफर को टार्गेटिंग कर सकता है या यहां तक कि बिना किसी स्थानांतरण के भी ऐसा कर सकता है। W^X के व्यापक हो जाने के पश्चात, एक अटैकर | अटैकर किसी प्रोग्राम के विशेषाधिकारों का उपयोग करने या उसके मेमोरी स्पेस से डेटा निकालने के लिए उसमें कोड इंजेक्ट करना चाहते हैं। एक्सिक्यूशन कोड को सामान्यतः रीड-ओनली के लिए बनाए जाने से पहले, एक अटैकर कोड को चलाते समय आर्बिटरी से परिवर्तित कर सकता है, डायरेक्ट ट्रांसफर को टार्गेटिंग कर सकता है या यहां तक कि बिना किसी स्थानांतरण के भी ऐसा कर सकता है। 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" /> | ||
Line 12: | Line 12: | ||
रिलेटेड इम्प्लिमेंटेशन्स [[क्लैंग]] (सामान्य रूप से एलएलवीएम),<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"/> | रिलेटेड इम्प्लिमेंटेशन्स [[क्लैंग]] (सामान्य रूप से एलएलवीएम),<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"/> | ||
===एलएलवीएम/क्लैंग=== | ===एलएलवीएम/क्लैंग=== | ||
एलएलवीएम/क्लैंग एक सीएफआई विकल्प प्रदान करता है जो वर्चुअल टेबल और टाइप कास्ट में त्रुटियों की जांच करके फॉरवर्ड एज में काम करता है। यह जानने के लिए कि सामान्य | एलएलवीएम/क्लैंग एक सीएफआई विकल्प प्रदान करता है जो वर्चुअल टेबल और टाइप कास्ट में त्रुटियों की जांच करके फॉरवर्ड एज में काम करता है। यह जानने के लिए कि सामान्य स्टेटयों में कौन से फ़ंक्शन को कॉल किया जाना चाहिए, यह [[लिंक-टाइम अनुकूलन|लिंक-टाइम ऑप्टिमाइजेशन]] (एलटीओ) पर निर्भर करता है।<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> एक भिन्न [[छाया कॉल स्टैक|शैडो कॉल स्टैक]] योजना है जो कॉल स्टैक संशोधनों की जांच करके बैकवर्ड एज पर बचाव करती है, जो केवल आर्च64 के लिए उपलब्ध है।<ref>{{cite web |title=ShadowCallStack — Clang 17.0.0git documentation |url=https://clang.llvm.org/docs/ShadowCallStack.html |website=clang.llvm.org}}</ref> | ||
गूगल ने 2018 से लिंक-टाइम ऑप्टिमाइज़ेशन (एलटीओ) और सीएफआई के साथ क्लैंग द्वारा संकलित [[लिनक्स कर्नेल]] के साथ [[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" /> | ||
शैडो स्टैक प्रत्येक कॉल के रिटर्न | शैडो स्टैक प्रत्येक कॉल के रिटर्न एड्रेस की एक प्रति विशेष रूप से संरक्षित शैडो स्टैक में संग्रहीत करता है। आरईटी पर, प्रोसेसर जांच करता है कि सामान्य स्टैक और शैडो स्टैक में संग्रहीत रिटर्न एड्रेस समतुल्य है या नहीं, यदि एड्रेस समान नहीं हैं, तो प्रोसेसर एक INT #21 (कंट्रोल फ्लो प्रोटेक्शन फॉल्ट) उत्पन्न करता है। | ||
इनडायरेक्ट ब्रांच ट्रैकिंग अनधिकृत टार्गेट्स के साथ इनडायरेक्ट जेएमपी या कॉल इंस्ट्रक्शंस का एड्रेस लगाती है। इसे प्रोसेसर में एक नवीनतम इंटरनल स्टेट मशीन जोड़कर इम्प्लिमेंटेड किया जाता है। इनडायरेक्ट जेएमपी और कॉल इंस्ट्रक्शंस का व्यवहार परिवर्तित कर दिया गया है जिससे की वे स्टेट मशीन को आईडीएलइ से वेट_फॉर_एन्डब्राँच पर स्विच कर सकते है। वेट_फॉर_एन्डब्राँच स्टेट में, निष्पादित होने वाला अगला इंस्ट्रक्शन नया एन्डब्राँच इंस्ट्रक्शन (32-बिट मोड में इएनडीबीआर32 या 64-बिट मोड में इएनडीबीआर64) होना आवश्यक है, जो इंटरनल स्टेट मशीन को वेट_फॉर_एन्डब्राँच से दोबारा आईडीएलइ में परिवर्तित कर देता है। इस प्रकार इनडायरेक्ट जेएमपी या कॉल का प्रत्येक अधिकृत टारगेट एन्डब्राँच से प्रारंभ होना चाहिए, यदि प्रोसेसर वेट_फॉर_एन्डब्राँच स्टेट में है (अर्थात, प्रिवियस इंस्ट्रक्शन एक इनडायरेक्ट जेएमपी या कॉल था), और अगला इंस्ट्रक्शन एन्डब्राँच इंस्ट्रक्शन नहीं है, तो प्रोसेसर एक INT #21 (कंट्रोल फ्लो प्रोटेक्शन फॉल्ट) उत्पन्न करता है। सीईटी इनडायरेक्ट ब्रांच ट्रैकिंग का समर्थन नहीं करने वाले प्रोसेसर पर, एन्डब्राँच इंस्ट्रक्शंस को एनओपी के रूप में समझा जाता है और उनका कोई प्रभाव नहीं पड़ता है। | |||
===माइक्रोसॉफ्ट कंट्रोल फ्लो गार्ड=== | ===माइक्रोसॉफ्ट कंट्रोल फ्लो गार्ड=== | ||
कंट्रोल फ्लो गार्ड (सीएफजी) पहली बार नवंबर 2014 में विंडोज 8.1 अपडेट 3 (KB3000850) के लिए | कंट्रोल फ्लो गार्ड (सीएफजी) पहली बार नवंबर 2014 में विंडोज 8.1 अपडेट 3 (KB3000850) के लिए व्यवस्थित किया गया था। डेवलपर्स विज़ुअल स्टूडियो 2015 या नवीनतम में प्रोग्राम लिंक करने से पहले <code>/guard:cf</code> लिंकर फ़्लैग जोड़कर अपने प्रोग्राम में कंट्रोल फ्लो गार्ड जोड़ सकते हैं।<ref name="MSDN - Control Flow Guard"/> | ||
[[विंडोज़ 10 क्रिएटर्स अपडेट]] (विंडोज़ 10 संस्करण 1703) के अनुसार, विंडोज़ कर्नेल को सीएफजी के साथ संकलित किया गया है।<ref name="TechNet - Shadow Brokers"/>विंडोज़ कर्नेल | [[विंडोज़ 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"/> | ||
====इम्प्लिमेंटेशन्स विवरण==== | ====इम्प्लिमेंटेशन्स विवरण==== | ||
सभी संरक्षित | सभी संरक्षित इनडायरेक्ट फ़ंक्शन कॉल के लिए, <code>_guard_check_iकॉल</code> फ़ंक्शन को कॉल किया जाता है, जो निम्नलिखित चरण निष्पादित करता है:<ref name="Exploring Control Flow Guard in Windows 10"/> | ||
#टारगेट एड्रेस को बिटमैप में ऑफसेट और बिट संख्या में परिवर्तन। | |||
## उच्चतम 3 बाइट्स बिटमैप में बाइट ऑफसेट हैं | ## उच्चतम 3 बाइट्स बिटमैप में बाइट ऑफसेट हैं | ||
## बिट ऑफसेट 5-बिट | ## बिट ऑफसेट 5-बिट वैल्यू है। पहले चार बिट एड्रेस के चौथे से आठवें निम्न-क्रम बिट हैं। | ||
## यदि | ## यदि डेस्टिनेशन एड्रेस 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" /> | |||
===माइक्रोसॉफ्ट एक्सटेंडेड फ़्लो गार्ड=== | |||
एक्सटेंडेड फ्लो गार्ड (एक्सएफजी) अभी तक सामान्यतः व्यवस्थित नहीं किया गया है, लेकिन विंडोज इनसाइडर पूर्वावलोकन में उपलब्ध है और 2019 में ब्लूहैट शंघाई में सार्वजनिक रूप से प्रस्तुत किया गया था।<ref name="Advancing Windows Security Bluehat Shanghai 2019"/> | |||
एक्सएफजी फ़ंक्शन कॉल सिग्नेचरों को मान्य करके सीएफजी का विस्तार करता है जिससे की यह सुनिश्चित किया जा सके कि इनडायरेक्ट फ़ंक्शन कॉल केवल समान सिग्नेचर वाले फ़ंक्शन के सबसेट के लिए हों, फ़ंक्शन कॉल सिग्नेचर सत्यापन इनडायरेक्ट कॉल से तुरंत पहले टारगेट फ़ंक्शन के हैश को रजिस्टर r10 में संग्रहीत करने और टारगेट एड्रेस के कोड से तुरंत पहले मेमोरी में गणना किए गए फ़ंक्शन हैश को संग्रहीत करने के इंस्ट्रक्शन जोड़कर इम्प्लिमेंटेड किया जाता है। जब इनडायरेक्ट कॉल किया जाता है, तो एक्सएफजी सत्यापन फ़ंक्शन 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 09:11, 7 August 2023
कंट्रोल फ्लो इंटीग्रिटी (सीएफआई) कंप्यूटर सुरक्षा तकनीकों के लिए एक सामान्य शब्द है जो किसी प्रोग्राम के एक्सिक्यूशन के फ्लो (कंट्रोल फ्लो) को पुनर्इंस्ट्रक्शनित करने से विभिन्न प्रकार के मैलवेयर अटैक्स को रोकता है।
बैकग्राउंड
एक कंप्यूटर प्रोग्राम सामान्यतः निर्णय लेने और कोड के विभिन्न भागों का उपयोग करने के लिए अपने कंट्रोल फ्लो को परिवर्तित करता है है। ऐसे स्थानांतरण प्रत्यक्ष हो सकते हैं, जिसमें टारगेट एड्रेस सैल्फ कोड में लिखा होता है, या इनडायरेक्ट, जिसमें टारगेट एड्रेस सैल्फ मेमोरी या सीपीयू रजिस्टर में एक वैरिएबल होता है। एक सामान्य फ़ंक्शन कॉल में, प्रोग्राम प्रत्यक्ष कॉल करता है, लेकिन स्टैक का उपयोग करके कॉलर फ़ंक्शन पर लौटता है - एक इनडायरेक्ट बैकवर्ड-एज ट्रांसफर जब किसी फ़ंक्शन पॉइंटर को कॉल किया जाता है, जैसे कि वर्चुअल टेबल से, तो हम कहते हैं कि एक इनडायरेक्ट फॉरवर्ड-एज ट्रांसफर है।[1][2]
अटैकर किसी प्रोग्राम के विशेषाधिकारों का उपयोग करने या उसके मेमोरी स्पेस से डेटा निकालने के लिए उसमें कोड इंजेक्ट करना चाहते हैं। एक्सिक्यूशन कोड को सामान्यतः रीड-ओनली के लिए बनाए जाने से पहले, एक अटैकर कोड को चलाते समय आर्बिटरी से परिवर्तित कर सकता है, डायरेक्ट ट्रांसफर को टार्गेटिंग कर सकता है या यहां तक कि बिना किसी स्थानांतरण के भी ऐसा कर सकता है। W^X के व्यापक हो जाने के पश्चात, एक अटैकर इनडायरेक्ट स्थानान्तरण का उपयोग करते हुए एक्सिक्यूशन को चलाने के लिए कोड वाले एक भिन्न, असुरक्षित क्षेत्र में पुनर्इंस्ट्रक्शनित करना चाहता है: कोई फॉरवर्ड-एज अटैक के लिए वर्चुअल टेबल को ओवरराइट कर सकता है या बैकवर्ड-एज अटैक ( रिटर्न ओरिएन्टेड प्रोग्रामिंग ) के लिए कॉल स्टैक को परिवर्तित कर सकता है। सीएफआई को इनडायरेक्ट स्थानान्तरण को अनपेक्षित स्थानों पर जाने से बचाने के लिए डिज़ाइन किया गया है।[1]
तकनीक
संबद्ध तकनीकों में कोड-पॉइंटर सेपरेशन (सीपीएस), कोड-पॉइंटर इंटीग्रिटी (सीपीआई), स्टैक कैनरी, शैडो स्टैक और वीटेबल पॉइंटर वेरिफिकेशन सम्मिलित हैं।[3][4][5]
इम्प्लिमेंटेशन्स
रिलेटेड इम्प्लिमेंटेशन्स क्लैंग (सामान्य रूप से एलएलवीएम),[6] माइक्रोसॉफ्ट के कंट्रोल फ्लो गार्ड[7][8][9] और रिटर्न फ्लो गार्ड[10] गूगल के इनडायरेक्ट फंक्शन-कॉल चेक्स[11] और रीयूज अटैक प्रोटेक्टर (आरएपी) में उपलब्ध हैं।[12][13]
एलएलवीएम/क्लैंग
एलएलवीएम/क्लैंग एक सीएफआई विकल्प प्रदान करता है जो वर्चुअल टेबल और टाइप कास्ट में त्रुटियों की जांच करके फॉरवर्ड एज में काम करता है। यह जानने के लिए कि सामान्य स्टेटयों में कौन से फ़ंक्शन को कॉल किया जाना चाहिए, यह लिंक-टाइम ऑप्टिमाइजेशन (एलटीओ) पर निर्भर करता है।[14] एक भिन्न शैडो कॉल स्टैक योजना है जो कॉल स्टैक संशोधनों की जांच करके बैकवर्ड एज पर बचाव करती है, जो केवल आर्च64 के लिए उपलब्ध है।[15]
गूगल ने 2018 से लिंक-टाइम ऑप्टिमाइज़ेशन (एलटीओ) और सीएफआई के साथ क्लैंग द्वारा संकलित लिनक्स कर्नेल के साथ एंड्रॉइड (ओएस) को शिप किया है।[16] एससीएस एंड्रॉइड सहित लिनक्स कर्नेल के लिए एक विकल्प के रूप में उपलब्ध है।[17]
इंटेल कंट्रोल-फ्लो एनफोर्समेंट टेक्नोलॉजी
इंटेल कंट्रोल-फ्लो एनफोर्समेंट टेक्नोलॉजी (सीईटी) शैडो स्टैक (एसएस) और इनडायरेक्ट ब्रांच ट्रैकिंग (आईबीटी) के साथ फ्लो इंटीग्रिटी को कंट्रोल करने के लिए समझौते का एड्रेस लगाता है।[18][19]
शैडो स्टैक प्रत्येक कॉल के रिटर्न एड्रेस की एक प्रति विशेष रूप से संरक्षित शैडो स्टैक में संग्रहीत करता है। आरईटी पर, प्रोसेसर जांच करता है कि सामान्य स्टैक और शैडो स्टैक में संग्रहीत रिटर्न एड्रेस समतुल्य है या नहीं, यदि एड्रेस समान नहीं हैं, तो प्रोसेसर एक INT #21 (कंट्रोल फ्लो प्रोटेक्शन फॉल्ट) उत्पन्न करता है।
इनडायरेक्ट ब्रांच ट्रैकिंग अनधिकृत टार्गेट्स के साथ इनडायरेक्ट जेएमपी या कॉल इंस्ट्रक्शंस का एड्रेस लगाती है। इसे प्रोसेसर में एक नवीनतम इंटरनल स्टेट मशीन जोड़कर इम्प्लिमेंटेड किया जाता है। इनडायरेक्ट जेएमपी और कॉल इंस्ट्रक्शंस का व्यवहार परिवर्तित कर दिया गया है जिससे की वे स्टेट मशीन को आईडीएलइ से वेट_फॉर_एन्डब्राँच पर स्विच कर सकते है। वेट_फॉर_एन्डब्राँच स्टेट में, निष्पादित होने वाला अगला इंस्ट्रक्शन नया एन्डब्राँच इंस्ट्रक्शन (32-बिट मोड में इएनडीबीआर32 या 64-बिट मोड में इएनडीबीआर64) होना आवश्यक है, जो इंटरनल स्टेट मशीन को वेट_फॉर_एन्डब्राँच से दोबारा आईडीएलइ में परिवर्तित कर देता है। इस प्रकार इनडायरेक्ट जेएमपी या कॉल का प्रत्येक अधिकृत टारगेट एन्डब्राँच से प्रारंभ होना चाहिए, यदि प्रोसेसर वेट_फॉर_एन्डब्राँच स्टेट में है (अर्थात, प्रिवियस इंस्ट्रक्शन एक इनडायरेक्ट जेएमपी या कॉल था), और अगला इंस्ट्रक्शन एन्डब्राँच इंस्ट्रक्शन नहीं है, तो प्रोसेसर एक INT #21 (कंट्रोल फ्लो प्रोटेक्शन फॉल्ट) उत्पन्न करता है। सीईटी इनडायरेक्ट ब्रांच ट्रैकिंग का समर्थन नहीं करने वाले प्रोसेसर पर, एन्डब्राँच इंस्ट्रक्शंस को एनओपी के रूप में समझा जाता है और उनका कोई प्रभाव नहीं पड़ता है।
माइक्रोसॉफ्ट कंट्रोल फ्लो गार्ड
कंट्रोल फ्लो गार्ड (सीएफजी) पहली बार नवंबर 2014 में विंडोज 8.1 अपडेट 3 (KB3000850) के लिए व्यवस्थित किया गया था। डेवलपर्स विज़ुअल स्टूडियो 2015 या नवीनतम में प्रोग्राम लिंक करने से पहले /guard:cf
लिंकर फ़्लैग जोड़कर अपने प्रोग्राम में कंट्रोल फ्लो गार्ड जोड़ सकते हैं।[20]
विंडोज़ 10 क्रिएटर्स अपडेट (विंडोज़ 10 संस्करण 1703) के अनुसार, विंडोज़ कर्नेल को सीएफजी के साथ संकलित किया गया है।[21] विंडोज़ कर्नेल मैलिसियस कर्नेल कोड को तथा इसके अतिरिक्त सीएफजी बिटमैप को ओवरराइट करने से रोकने के लिए हाइपर-वी का उपयोग करता है।[22]
सीएफजी एक प्रति-प्रक्रिया बिटमैप बनाकर संचालित होता है, जहां एक सेट बिट इंगित करता है कि एड्रेस एक वैध डेस्टिनेशन है। प्रत्येक इनडायरेक्ट फ़ंक्शन कॉल करने से पहले, एप्लिकेशन जांचता है कि डेस्टिनेशन एड्रेस बिटमैप में है या नहीं, यदि डेस्टिनेशन एड्रेस बिटमैप में नहीं है, तो प्रोग्राम समाप्त हो जाता है।[20] इससे किसी अटैकर के लिए किसी ऑब्जेक्ट की सामग्री को प्रतिस्थापित करके और फिर पेलोड निष्पादित करने के लिए इनडायरेक्ट फ़ंक्शन कॉल का उपयोग करके यूज़ आफ्टर फ्री उपयोग करना अधिक कठिन हो जाता है।[23]
इम्प्लिमेंटेशन्स विवरण
सभी संरक्षित इनडायरेक्ट फ़ंक्शन कॉल के लिए, _guard_check_iकॉल
फ़ंक्शन को कॉल किया जाता है, जो निम्नलिखित चरण निष्पादित करता है:[24]
- टारगेट एड्रेस को बिटमैप में ऑफसेट और बिट संख्या में परिवर्तन।
- उच्चतम 3 बाइट्स बिटमैप में बाइट ऑफसेट हैं
- बिट ऑफसेट 5-बिट वैल्यू है। पहले चार बिट एड्रेस के चौथे से आठवें निम्न-क्रम बिट हैं।
- यदि डेस्टिनेशन एड्रेस 0x10 (अंतिम चार बिट्स 0 हैं) के साथ संरेखित है, तो बिट ऑफसेट का 5वां बिट 0 पर सेट है, और यदि यह नहीं है तो 1 पर सेट है।
- बिटमैप में टारगेट के एड्रेस वैल्यू की जांच करें,
- यदि टारगेट एड्रेस बिटमैप में है, तो रिटर्न विदाउट एरर हो सकता है।
- यदि टारगेट एड्रेस बिटमैप में नहीं है, तो प्रोग्राम टर्मिनेट हो सकता है।
बाईपास तकनीक
सीएफजी को बायपास करने के लिए कई सामान्य तकनीकें हैं:
- डेस्टिनेशन को उसी प्रक्रिया में लोड किए गए नॉन-सीएफजी मॉड्यूल में स्थित कोड पर सेट कर सकते है।[23][25]
- एक इनडायरेक्ट कॉल ढूंढें जो सीएफजी (या तो कॉल या जेएमपी) द्वारा संरक्षित नहीं थी।[23][25][26]
- जिस फ़ंक्शन कॉल के लिए डिज़ाइन किया गया है उससे भिन्न संख्या में आर्ग्युमेंट्स के साथ फ़ंक्शन कॉल का उपयोग करें, जिससे स्टैक मिसलिग्न्मेंट हो जाता है, और (विंडोज 10 में पैच किया गया) फ़ंक्शन के दोबारा आने के पश्चात कोड एक्सिक्यूशन होता है।[27]
- समान संख्या में आर्ग्युमेंट्स के साथ एक फ़ंक्शन कॉल का उपयोग करें, लेकिन पास किए गए पॉइंटर्स में से एक को ऑब्जेक्ट के रूप में माना जाता है और पॉइंटर-बेस्ड ऑफसेट पर लिखता है, जिससे रिटर्न एड्रेस को ओवरराइट करने की अनुमति मिलती है।[28]
- एड्रेस को सत्यापित करने के लिए सीएफजी द्वारा उपयोग किए गए फ़ंक्शन कॉल को अधिलेखित करें जिसे मार्च 2015 में पैच किया गया था।[26]
- सीएफजी बिटमैप को सभी 1 पर सेट करें, जिससे सभी इनडायरेक्ट फ़ंक्शन कॉल की अनुमति मिल सकती है।[26]
- स्टैक पर किसी एड्रेस को अधिलेखित करने के लिए (चूंकि स्टैक सीएफजी द्वारा संरक्षित नहीं है) कंट्रोल-लेखन प्रिमिटिव का उपयोग कर सकते है।[26]
माइक्रोसॉफ्ट एक्सटेंडेड फ़्लो गार्ड
एक्सटेंडेड फ्लो गार्ड (एक्सएफजी) अभी तक सामान्यतः व्यवस्थित नहीं किया गया है, लेकिन विंडोज इनसाइडर पूर्वावलोकन में उपलब्ध है और 2019 में ब्लूहैट शंघाई में सार्वजनिक रूप से प्रस्तुत किया गया था।[29]
एक्सएफजी फ़ंक्शन कॉल सिग्नेचरों को मान्य करके सीएफजी का विस्तार करता है जिससे की यह सुनिश्चित किया जा सके कि इनडायरेक्ट फ़ंक्शन कॉल केवल समान सिग्नेचर वाले फ़ंक्शन के सबसेट के लिए हों, फ़ंक्शन कॉल सिग्नेचर सत्यापन इनडायरेक्ट कॉल से तुरंत पहले टारगेट फ़ंक्शन के हैश को रजिस्टर r10 में संग्रहीत करने और टारगेट एड्रेस के कोड से तुरंत पहले मेमोरी में गणना किए गए फ़ंक्शन हैश को संग्रहीत करने के इंस्ट्रक्शन जोड़कर इम्प्लिमेंटेड किया जाता है। जब इनडायरेक्ट कॉल किया जाता है, तो एक्सएफजी सत्यापन फ़ंक्शन r10 में वैल्यू की तुलना टारगेट फ़ंक्शन के संग्रहीत हैश से करता है। [30][31]
यह भी देखें
संदर्भ
- ↑ 1.0 1.1 Payer, Mattias. "Control-Flow Integrity: An Introduction". nebelwelt.net.
- ↑ 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.
- ↑ Payer, Mathias; Kuznetsov, Volodymyr. "On differences between the CFI, CPS, and CPI properties". nebelwelt.net. Retrieved 2016-06-01.
- ↑ "Adobe Flash Bug Discovery Leads To New Attack Mitigation Method". Dark Reading. 10 November 2015. Retrieved 2016-06-01.
- ↑ Endgame. "Endgame to Present at Black Hat USA 2016". www.prnewswire.com. Retrieved 2016-06-01.
- ↑ "Control Flow Integrity — Clang 3.9 documentation". clang.llvm.org. Retrieved 2016-06-01.
- ↑ Pauli, Darren. "Microsoft's malware mitigator refreshed, but even Redmond says it's no longer needed". The Register. Retrieved 2016-06-01.
- ↑ 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.
- ↑ Smith, Ms. (23 September 2015). "DerbyCon: Former BlueHat prize winner will bypass Control Flow Guard in Windows 10". Network World. Retrieved 2016-06-01.
- ↑ "Return Flow Guard". Tencent. 2 November 2016. Retrieved 2017-01-19.
- ↑ 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.
- ↑ Security, heise. "PaX Team stellt Schutz vor Code Reuse Exploits vor". Security (in Deutsch). Retrieved 2016-06-01.
- ↑ "Frequently Asked Questions About RAP". Retrieved 2016-06-01.
- ↑ "Control Flow Integrity — Clang 17.0.0git documentation". clang.llvm.org.
- ↑ "ShadowCallStack — Clang 17.0.0git documentation". clang.llvm.org.
- ↑ "Clang LTO Patches Updated for the Linux Kernel - Phoronix".
- ↑ "शैडोकॉलस्टैक". Android Open Source Project (in English).
- ↑ "Control-flow Enforcement Technology Specification" (PDF). Intel Developer Zone. Retrieved 2021-01-05.[dead link]
- ↑ "R.I.P ROP: CET Internals in Windows 20H1". Winsider Seminars & Solutions Inc. Retrieved 2021-01-05.
- ↑ 20.0 20.1 "Control Flow Guard". MSDN. Retrieved 2017-01-19.
- ↑ "Analysis of the Shadow Brokers release and mitigation with Windows 10 virtualization-based security". Microsoft Technet. 16 June 2017. Retrieved 2017-06-20.
- ↑ "Universally Bypassing CFG Through Mutability Abuse" (PDF). Alex Ionescu's Blog. Retrieved 2017-07-07.
- ↑ 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.
- ↑ "Control Flow Guard" (PDF). Trend Micro. Retrieved 2017-01-19.
- ↑ 25.0 25.1 "Windows 10 Control Flow Guard Internals" (PDF). Power of Community. Retrieved 2017-01-19.
- ↑ 26.0 26.1 26.2 26.3 "Bypass Control Flow Guard Comprehensively" (PDF). BlackHat. Retrieved 2017-01-19.
- ↑ "An interesting detail about Control Flow Guard". Bromium. Retrieved 2017-01-19.
- ↑ Thomas, Sam (18 August 2016). "Object Oriented Exploitation: New techniques in Windows mitigation bypass". Slideshare. Retrieved 2017-01-19.
- ↑ "Advancing Windows Security". Retrieved 2021-05-19.
- ↑ "EXTENDED FLOW GUARD UNDER THE MICROSCOPE". Retrieved 2021-05-19.
- ↑ "Exploit Development: Between a Rock and a (Xtended Flow) Guard Place: Examining XFG". 23 August 2020. Retrieved 2021-05-19.