वापसी-उन्मुख प्रोग्रामिंग

वापसी-उन्मुख प्रोग्रामिंग (आरओपी) एक कंप्यूटर सुरक्षा समुपयोजन तकनीक है जो आक्रामकों को सुरक्षा गढ़ की उपस्थिति में कोड निष्पादित करने की अनुमति देती है। जैसे निष्पादन योग्य स्थान सुरक्षा और कोड हस्ताक्षर आदि।

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

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

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

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

रिटर्न-इन-लाइब्रेरी तकनीक
डेटा निष्पादन रोकथाम के व्यापक कार्यान्वयन ने पारंपरिक बफर ओवरफ्लो कमजोरियों को ऊपर वर्णित विधियों से उपयोग करना कठिन या असंभव बना दिया है। इसके अतिरिक्त, एक आक्रामक को पहले से ही निष्पादन योग्य चिह्नित स्मृति में कोड, जैसे स्वयं प्रोग्राम कोड और किसी भी लिंक की गई साझा लाइब्रेरी तक सीमित कर दिया गया था। चूंकि साझा लाइब्रेरी, जैसे कि libc, में प्रायः सिस्टम कॉल करने के लिए सबरूटीन्स होते हैं और अन्य कार्यक्षमता एक आक्रामक के लिए संभावित रूप से उपयोगी होती है, वे एक आक्रमण को एकत्र करने के लिए कोड खोजने के लिए सबसे संभावित उम्मीदवार हैं।

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

उधार कोड भाग
64-बिट x86 प्रोसेसर के उदय ने अपने साथ सबरूटीन कॉलिंग प्रयोग में कई परिवर्तन लाए, जिसके लिए स्टैक के अतिरिक्त प्रोसेसर रजिस्टर में पारित होने के लिए फलन के पहले तर्क की आवश्यकता थी। इसका तात्पर्य यह था कि एक आक्रामक केवल बफर ओवररन प्रयोग के माध्यम से कॉल स्टैक का क्रमभंग करके वांछित तर्कों के साथ लाइब्रेरी फलन कॉल समायोजित नहीं कर सकता था। साझा लाइब्रेरी डेवलपर्स ने उन लाइब्रेरी फ़ंक्शंस को हटाना या प्रतिबंधित करना भी प्रारंभ कर दिया, जो किसी आक्रामक के लिए विशेष रूप से उपयोगी कार्य करते थे, जैसे कि सिस्टम कॉल रैपर आदि। नतीजतन, रिटर्न-इन-लाइब्रेरी आक्रमणों को सफलतापूर्वक आरोपित करना अधिक कठिन हो गया।

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

आक्रमण
वापसी-उन्मुख प्रोग्रामिंग उधार कोड चंक्स प्रस्ताव पर निर्मित होता है और लूप संगणनीयता और सशर्त शाखाओं सहित आक्रामक को ट्यूरिंग पूर्ण कार्यक्षमता प्रदान करने के लिए इसका विस्तार करता है। दूसरे विधि से कहे तों, वापसी-उन्मुख प्रोग्रामिंग एक पूरी तरह कार्यात्मक भाषा प्रदान करती है जिसका उपयोग एक आक्रामक किसी समझौता यंत्र को वांछित संक्रिया करने के लिए कर सकता है। होवव शाचम ने 2007 में तकनीक प्रकाशित की और प्रदर्शित किया कि कैसे सी मानक लाइब्रेरी से जुड़े लक्ष्य एप्लिकेशन के खिलाफ वापसी-उन्मुख प्रोग्रामिंग का उपयोग करके सभी महत्वपूर्ण प्रोग्रामिंग निर्माणों का अनुकरण किया जा सकता है और एक प्रयोग बफर ओवररन भेद्यता को सम्मिलित करता है।

वापसी-उन्मुख प्रोग्रामिंग आक्रमण अभिव्यंजक शक्ति और रक्षात्मक उपायों के प्रतिरोध दोनों में चर्चा किए गए अन्य आक्रमण प्रकारों से उपयुक्त है। साझा लाइब्रेरीों से संभावित रूप से खतरनाक कार्यों को पूरी तरह से हटाने सहित ऊपर वर्णित प्रति-प्रयोग तकनीकों में से कोई भी वापसी-उन्मुख प्रोग्रामिंग आक्रमण के सापेक्ष प्रभावी नहीं है।

x86-स्थापत्य पर
यद्यपि विभिन्न प्रकार के स्थापत्य पर वापसी-उन्मुख प्रोग्रामिंग आक्रमण किए जा सकते हैं, शाचम के लेख और अधिकांश अनुवर्ती कार्य, इंटेल x86 स्थापत्य पर केंद्रित हैं। x86 स्थापत्य एक चर-लंबाई जटिल निर्देश समुच्चय संगणनीयता निर्देश समुच्चय है। x86 पर वापसी-उन्मुख प्रोग्रामिंग इस तथ्य का लाभ उठाती है कि निर्देश समुच्चय अत्यधिक सघन है, अर्थात, बाइट्स के किसी भी यादृच्छिक क्रम को x86 निर्देशों के कुछ वैध समुच्चय के रूप में व्याख्या करने की संभावना है।

इसलिए ऐसे ऑपकोड की खोज करना संभव है जो नियंत्रण प्रवाह को परिवर्तित करता है, विशेष रूप से वापसी निर्देश (0xC3) और पुनः पूर्ववर्ती बाइट्स के लिए द्विआधारी निर्देश जो संभवतः उपयोगी निर्देश बनाते हैं। निर्देश गैजेट के इन समुच्चयों को पहले गैजेट के पहले निर्देश के पते के साथ, एक बफर ओवररन प्रयोग के माध्यम से रिटर्न पते को उपरिलेखित करके जंजीर से बांधा जा सकता है। इसके उपरांत, बाद के गैजेट्स का पहला पता स्टैक पर क्रमिक रूप से लिखा जाता है। पहले गैजेट के समापन पर, एक वापसी निर्देश निष्पादित किया जाएगा, जो स्टैक से अगले गैजेट के पते को प्रेषित करेगा और उस पर स्थित हों जाएगा। उस गैजेट के समापन पर, श्रृंखला तीसरे के साथ जारी रहती है, और इसी तरह आगे भी कार्य करती रहती है। छोटे अनुदेश अनुक्रमों का पीछा करके, एक आक्रामक पूर्व-उपलब्ध लाइब्रेरी कोड से यादृच्छिक कार्यक्रम व्यवहार उत्पन्न करने में सक्षम होता है। शाचम का दावा है कि किसी भी पर्याप्त मात्रा में कोड (सी मानक लाइब्रेरी सहित, लेकिन सीमित नहीं) के सापेक्ष, ट्यूरिंग-पूर्ण कार्यक्षमता के लिए पर्याप्त गैजेट उपलब्ध होंगे।

गैजेट का पता लगाने की प्रक्रिया को स्वचालित करने और द्विआधारी के सापेक्ष आक्रमण के निर्माण में मदद के लिए एक स्वचालित उपकरण विकसित किया गया है। आरओपी गैजेट के रूप में जाना जाने वाला यह उपकरण, संभावित उपयोगी गैजेट्स की खोज द्विआधारी के माध्यम से करता है, और उन्हें एक आक्रमण के पेलोड में एकत्र करने का प्रयास करता है जो आक्रामक से यादृच्छिक निर्देश को स्वीकार करने के लिए एक आवरण उत्पन्न करता है।

पता स्थान अभिविन्यास यादृच्छिकीकरण पर
पता स्थान अभिविन्यास यादृच्छिकीकरण में भी कमजोरियां हैं। शाचम एट अल के लेख के अनुसार, 32-बिट स्थापत्य पर एएसएलआर पता यादृच्छिकीकरण के लिए उपलब्ध बिट्स की संख्या से सीमित है। 32 एड्रेस बिट्स में से मात्र 16 यादृच्छिकीकरण के लिए उपलब्ध हैं, और 16 बिट्स पता यादृच्छिकीकरण को मिनटों में ब्रूट फोर्स आक्रमण से हराया जा सकता है। 64-बिट स्थापत्य अधिक शक्तिशाली हैं, 64 बिट्स में से 40 यादृच्छिकीकरण के लिए उपलब्ध हैं। 40-बिट रेंडमाइजेशन के लिए क्रूर बल का आक्रमण संभव है, परंतु किसी का ध्यान नहीं जाने की संभावना नहीं है. ब्रूट फ़ोर्स आक्रमण के अतिरिक्त, यादृच्छिकीकरण को हटाने के लिए तकनीकें उपलब्ध हैं।

यहां तक ​​​​कि सही यादृच्छिककरण के साथ, यदि स्मृति सामग्री का कोई रिसाव होता है तो यह रनटाइम पर साझा लाइब्रेरीों के उदाहरण के आधार पते की गणना करने में मदद करेगा।

वापसी निर्देश के उपयोग के बिना
चेकोवे एट अल के पेपर के अनुसार, रिटर्न इंस्ट्रक्शन (x86 पर 0xC3) का उपयोग किए बिना x86 और ARM स्थापत्य पर रिटर्न-ओरिएंटेड-प्रोग्रामिंग करना संभव है। इसके अतिरिक्त उन्होंने सावधानी से तैयार किए गए निर्देश अनुक्रमों का उपयोग किया जो पहले से ही यंत्र की मेमोरी में रिटर्न निर्देश की तरह व्यवहार करने के लिए उपलब्ध हैं। एक वापसी निर्देश के दो प्रभाव होते हैं: सबसे पहले, यह स्टैक के शीर्ष पर चार-बाइट मान को पढ़ता है, और निर्देश सूचक को उस मान पर समुच्चय करता है, और दूसरा, यह स्टैक सूचक मान को चार से बढ़ाता है (एक पॉप संक्रिया के बराबर). X86 स्थापत्य पर, jmp और पॉप निर्देशों के क्रम वापसी निर्देश के रूप में कार्य कर सकते हैं। एआरएम पर, लोड और शाखा निर्देशों के अनुक्रम वापसी निर्देश के रूप में कार्य कर सकते हैं।

चूंकि यह नया दृष्टिकोण वापसी निर्देश का उपयोग नहीं करता है, इसका रक्षा के लिए नकारात्मक प्रभाव पड़ता है। जब एक रक्षा कार्यक्रम न केवल कई रिटर्न बल्कि कई जंप निर्देशों के लिए भी जांच करता है, तो इस आक्रमण का पता लगाया जा सकता है।

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

पता स्थान लेआउट यादृच्छिकीकरण
वापसी-उन्मुख प्रोग्रामिंग के आधार पर हमलों को कम करने के लिए कई तकनीकों का प्रस्ताव दिया गया है। अधिकांश प्रोग्राम और लाइब्रेरी कोड के स्थान को रैंडमाइज़ करने पर निर्भर करते हैं, ताकि एक आक्रामक उन निर्देशों के स्थान का सटीक अनुमान न लगा सके जो गैजेट में उपयोगी हो सकते हैं और इसलिए एक सफल वापसी-उन्मुख प्रोग्रामिंग अटैक चेन को माउंट नहीं कर सकते हैं। इस तकनीक का एक काफी सामान्य कार्यान्वयन, एड्रेस स्पेस लेआउट रेंडमाइजेशन (एएसएलआर), साझा लाइब्रेरीों को प्रत्येक प्रोग्राम लोड पर एक अलग मेमोरी लोकेशन में लोड करता है। यद्यपि आधुनिक ऑपरेटिंग सिस्टम द्वारा व्यापक रूप से तैनात किया गया है, एएसएलआर स्मृति में किसी भी ज्ञात लाइब्रेरी फलन का पता निर्धारित करने के लिए सूचना रिसाव हमलों और अन्य दृष्टिकोणों के प्रति संवेदनशील है। यदि एक आक्रामक एक ज्ञात निर्देश के स्थान को सफलतापूर्वक निर्धारित कर सकता है, तो अन्य सभी की स्थिति का अनुमान लगाया जा सकता है और एक वापसी-उन्मुख प्रोग्रामिंग आक्रमण का निर्माण किया जा सकता है।

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

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

बाइनरी कोड रैंडमाइजेशन
कुछ आधुनिक प्रणालियाँ जैसे क्लाउड लैम्ब्डा (FaaS) और IoT रिमोट अपडेट सॉफ़्टवेयर परिनियोजन से पहले ऑन-द-फ्लाई संकलन करने के लिए क्लाउड इन्फ्रास्ट्रक्चर का उपयोग करते हैं। एक तकनीक जो एक निष्पादन सॉफ़्टवेयर के प्रत्येक उदाहरण में विविधता लाती है, नाटकीय रूप से ROP हमलों के लिए सॉफ़्टवेयर की प्रतिरक्षा को बढ़ा सकती है। ब्रूट फ़ोर्सिंग क्लाउड लैम्ब्डा के परिणामस्वरूप यादृच्छिक सॉफ़्टवेयर के कई उदाहरणों पर आक्रमण हो सकता है जो आक्रमण की प्रभावशीलता को कम करता है। आसफ शैली ने इस तकनीक को 2017 में प्रकाशित किया था और सॉफ्टवेयर अपडेट सिस्टम में बाइनरी रेंडमाइजेशन के उपयोग का प्रदर्शन किया। हर अपडेट किए गए डिवाइस के लिए, क्लाउड-आधारित सेवा ने कोड में विविधताएं पेश कीं, ऑनलाइन संकलन किया और बाइनरी को डिस्पैच किया। यह तकनीक बहुत प्रभावी है क्योंकि ROP आक्रमण सॉफ्टवेयर की आंतरिक संरचना के ज्ञान पर निर्भर करते हैं। तकनीक का दोष यह है कि सॉफ्टवेयर को तैनात करने से पहले कभी भी पूरी तरह से परीक्षण नहीं किया जाता है क्योंकि यादृच्छिक सॉफ्टवेयर के सभी रूपों का परीक्षण करना संभव नहीं है। इसका मतलब यह है कि कई बाइनरी रेंडमाइजेशन तकनीकें नेटवर्क इंटरफेस और सिस्टम प्रोग्रामिंग के लिए लागू होती हैं और जटिल एल्गोरिदम के लिए कम अनुशंसित होती हैं।

सेहोप
माइक्रोसॉफ्ट-विशिष्ट अपवाद हैंडलिंग तंत्र#एसईएच ओवरराइट प्रोटेक्शन विंडोज की एक विशेषता है जो सबसे आम स्टैक ओवरफ्लो हमलों से बचाता है, विशेष रूप से एक संरचित अपवाद हैंडलर पर हमलों के खिलाफ।

नियंत्रण प्रवाह हमलों के खिलाफ
जैसे-जैसे चीजों की इंटरनेट के विस्तार के कारण छोटे एम्बेडेड सिस्टम बढ़ रहे हैं, ऐसे एम्बेडेड सिस्टम की सुरक्षा की आवश्यकता भी बढ़ रही है। हार्डवेयर में कार्यान्वित इंस्ट्रक्शन बेस्ड मेमोरी एक्सेस कंट्रोल (IB-MAC) का उपयोग करके, कम लागत वाले एम्बेडेड सिस्टम को दुर्भावनापूर्ण नियंत्रण प्रवाह और स्टैक ओवरफ्लो हमलों से बचाना संभव है। डेटा स्टैक और रिटर्न स्टैक को अलग करके सुरक्षा प्रदान की जा सकती है। हालाँकि, कुछ एम्बेडेड सिस्टम में स्मृति प्रबंधन इकाई की कमी के कारण, सभी एम्बेडेड सिस्टम पर हार्डवेयर समाधान लागू नहीं किया जा सकता है।

रिटर्न-ओरिएंटेड रूटकिट्स के खिलाफ
2010 में, जिन्कू ली एट अल। प्रस्तावित कि एक उपयुक्त रूप से संशोधित संकलक प्रत्येक को बदलकर रिटर्न-उन्मुख गैजेट को पूरी तरह से समाप्त कर सकता है call f निर्देश क्रम के साथ  और प्रत्येक ret निर्देश क्रम के साथ , कहाँ table कार्यक्रम में सभी वैध वापसी पतों के एक अपरिवर्तनीय सारणीकरण का प्रतिनिधित्व करता है और index उस तालिका में एक विशिष्ट अनुक्रमणिका का प्रतिनिधित्व करता है।  यह एक रिटर्न-उन्मुख गैजेट के निर्माण को रोकता है जो किसी फलन के अंत से सीधे किसी अन्य फलन के बीच में किसी मनमाने पते पर लौटता है; इसके अतिरिक्त, गैजेट केवल वैध रिटर्न पतों पर वापस आ सकते हैं, जो उपयोगी गैजेट बनाने की कठिनाई को काफी बढ़ा देता है। ली एट अल। दावा किया कि हमारी वापसी संकेत तकनीक अनिवार्य रूप से वापसी-उन्मुख प्रोग्रामिंग को रिटर्न-इन-लिबक की पुरानी शैली में वापस सामान्य करती है। उनके प्रूफ-ऑफ-कॉन्सेप्ट कंपाइलर में कुछ यंत्र निर्देशों से निपटने के लिए एक पीपहोल अनुकूलन चरण शामिल था, जिसमें उनके ऑपकोड या तत्काल ऑपरेंड में रिटर्न ओपोड शामिल होता है, जैसे कि movl $0xC3, %eax.

सूचक प्रमाणीकरण कोड (पीएसी)
ARMv8.3-A स्थापत्य हार्डवेयर स्तर पर एक नई सुविधा पेश करता है जो विशेष रूप से डिज़ाइन किए गए ट्वीकेबल ब्लॉक सिफर का उपयोग करके पॉइंटर एड्रेस स्पेस में अप्रयुक्त बिट्स का लाभ उठाता है। जो एक स्थानीय संदर्भ मूल्य (जैसे, स्टैक पॉइंटर) के साथ संयुक्त रूप से वांछित मान (सामान्यत, एक वापसी पता) पर हस्ताक्षर करता है।

एक संवेदनशील संक्रिया करने से पहले (यानी, सहेजे गए पॉइंटर पर वापस लौटना) गलत संदर्भ में छेड़छाड़ या उपयोग का पता लगाने के लिए हस्ताक्षर की जाँच की जा सकती है (उदाहरण के लिए, एक ट्रैम्पोलिन संदर्भ से सहेजे गए वापसी पते का लाभ उठाना)।

विशेष रूप से iPhones में उपयोग किए जाने वाले Apple A12 चिप्स ARMv8.3 में अपग्रेड किए गए हैं और PAC का उपयोग करते हैं। लिनक्स को 2020 में जारी संस्करण 5.7 में कर्नेल के भीतर सूचक प्रमाणीकरण के लिए समर्थन प्राप्त हुआ; उपयोगकर्ता अंतरिक्ष अनुप्रयोगों के लिए समर्थन 2018 में जोड़ा गया था। 2022 में, MIT के शोधकर्ताओं ने PAC के खिलाफ एक साइड-चैनल आक्रमण को PACMAN करार दिया।

यह भी देखें

 * ब्लाइंड रिटर्न ओरिएंटेड प्रोग्रामिंग
 * पूर्णांक अतिप्रवाह
 * जेआईटी छिड़काव
 * सिग्रेटर्न-ओरिएंटेड प्रोग्रामिंग (SROP)
 * थ्रेडेड कोड – वापसी-उन्मुख प्रोग्रामिंग थ्रेडेड कोड की पुनर्खोज है

बाहरी संबंध

 * AntiJOP: a program that removes JOP/ROP vulnerabilities from assembly language code
 * AntiJOP: a program that removes JOP/ROP vulnerabilities from assembly language code
 * AntiJOP: a program that removes JOP/ROP vulnerabilities from assembly language code