2010-10-03 15 views
6

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

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

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

क्या एएसएलआर काम करता है जिस तरह से मुझे समझ में नहीं आता है? जैसा कि वर्णन किया गया है, मैं नहीं देखता कि यह एक गति टक्कर से अधिक कुछ कैसे है, सुरक्षा की छवि प्रदान करता है लेकिन कोई वास्तविक पदार्थ नहीं है। क्या मैं कुछ भूल रहा हूँ?

उत्तर

2

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

यह एक प्रभावी हमले के लिए बार बढ़ाता है क्योंकि यह एक साधारण बफर ओवररन बनाता है (जहां स्टैक पर वापसी का पता सेट किया जा सकता है) जहां ओवररन में सही स्थान निर्धारित करने के लिए कोड होना चाहिए और फिर उसे jmp । संभवतः यह सिर्फ कठिन बनाता है।

विंडोज़ में लगभग सभी डीएलएल को मूल पते के लिए संकलित किया गया है कि वे शायद नहीं चलेंगे और वैसे भी स्थानांतरित हो जाएंगे, लेकिन मूल विंडोज़ के पास अपना मूल पता अनुकूलित किया जाता है ताकि स्थानांतरण की आवश्यकता न हो।

+1

क्या आपने कभी एएसएम स्तर पर विंडोज एक्सई डीबग किया है? वहां एक असली आयात तालिका है। लोडर कोड को पैच नहीं करता है, (सभी जगह जहां आपका कोड कुछ बाहरी दिनचर्या कह सकता है), यह आयात तालिका को पैच करता है, जो मूल रूप से जेएमपी निर्देशों का एक लंबा अनुक्रम है, जिसे संकलक कॉल करता है। –

+0

इसकी न केवल साझा की गई मेमोरी ... – rook

+0

@ मेसन व्हीलर - लंबे समय तक नहीं, लेकिन यह जानना अच्छा है। हालांकि इससे किसी विशेष पते को निर्धारित करना आसान हो जाता है, शुद्ध प्रभाव समान नहीं है? यह अज्ञात को ज्ञात करता है, जो हमले को और अधिक कठिन बनाता है। –

1

मुझे नहीं पता कि क्या आपको सही तरीके से सवाल है या नहीं, लेकिन जब मैं एएसएलआर प्रभावी हूं और कब नहीं समझाऊंगा।

मान लें कि हमारे पास app.exe और TargetLib.dll है। app.exe TargetLib.dll का उपयोग कर रहा है (लिंक किया गया है)। स्पष्टीकरण सरल बनाने के लिए, आइए मान लें कि आभासी पता स्थान में केवल इन 2 मॉड्यूल हैं।

यदि दोनों एएलएसआर सक्षम हैं, तो app.exe का मूल पता अज्ञात है। यह लोड होने पर कुछ फ़ंक्शन कॉल पतों को हल कर सकता है लेकिन हमलावर जानता है कि न तो जहां कार्य है और न ही हल किए गए चर हैं। वही बात तब होती है जब TargetLib.dll लोड होता है। हालांकि ऐप.एक्सई में लुकअप टेबल है, फिर भी हमलावर नहीं जानता कि तालिका कहां है।

चूंकि हमलावर यह नहीं बता सकता कि विशिष्ट पते की सामग्री क्या है, उसे किसी भी निश्चित पता जानकारी के बिना आवेदन पर हमला करना चाहिए। आमतौर पर यह कठिन होता है यदि वह स्टैक ओवरफ्लो, हीप ओवरफ्लो, उपयोग-बाद-मुक्त ...

दूसरी ओर, यदि app.exe एएसएलआर सक्षम नहीं है, तो हमलावर के लिए यह बहुत आसान है आवेदन का फायदा उठाने के लिए। क्योंकि ऐप में विशिष्ट पते पर एक दिलचस्प एपीआई के लिए फ़ंक्शन कॉल हो सकती है।exe और हमलावर कूदने के लिए पते का एक लक्ष्य पता के रूप में उपयोग कर सकते हैं। (एक आवेदन पर हमला आमतौर पर मनमाने ढंग से पते पर कूदने से शुरू होता है।)।

पूरक: आप इसे पहले से ही समझ सकते हैं लेकिन मैं एक चीज़ स्पष्ट करना चाहता हूं। जब कोई हमलावर स्मृति भ्रष्टाचार की तरह भेद्यता द्वारा किसी एप्लिकेशन का शोषण करता है तो उसे आमतौर पर fixed address jump instruction का उपयोग करने के लिए मजबूर किया जाता है। वे शोषण के लिए relative address jump निर्देश का उपयोग नहीं कर सकते हैं। यही कारण है कि एएलएसआर इस तरह के शोषण के लिए वास्तव में प्रभावी है।

+0

ठीक है। यह आखिरी बात है कि मुझे काफी कुछ नहीं मिलता है। हमलावर क्यों 'फिक्स्ड एड्रेस जंप' (जो एक एएसएम ऑपोड है) का उपयोग कर सकता है लेकिन 'सापेक्ष पता कूद' नहीं (जो सिर्फ एक और एएसएम ऑपोड है)? क्या वहां कुछ जादुई अंतर है कि मुझे पता नहीं है? –

+1

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

+1

दूसरे शब्दों में, हमलावर क्या कर सकता है केवल 'डेटा' को दूषित नहीं कर रहा है 'निर्देश'। ऐप का शोषण करने के लिए वे 'निश्चित पता कूद' निर्देश द्वारा उपयोग किए जाने वाले भ्रष्ट 'डेटा' का उपयोग करते हैं। क्या हमलावर करता है शेलकोड निकालने (कोड जिसे वे निष्पादित करना चाहते हैं) और शेलकोड पर कूदते हैं। शेलकोड में वे सापेक्ष कूद का उपयोग कर सकते हैं लेकिन एएसएलआर परिस्थिति के तहत शेलकोड में कूदना मुश्किल समस्या है। –

संबंधित मुद्दे