एक रेटपोलिन क्या है और यह कैसे काम करता है?


244

कर्नेल या क्रॉस-प्रोसेस मेमोरी प्रकटीकरण ( स्पेक्टर अटैक) के खिलाफ कम करने के लिए , लिनक्स कर्नेल 1 को एक नए विकल्प के साथ संकलित किया जाएगा , जो कि तथाकथित रेटपॉलिन के माध्यम से अप्रत्यक्ष कॉल -mindirect-branch=thunk-externकरने के gccलिए शुरू किया गया है ।

यह एक नया आविष्कार किया गया शब्द प्रतीत होता है क्योंकि Google खोज केवल हाल के उपयोग (आमतौर पर 2018 में सभी) को बदल देती है।

एक रेटपोलिन क्या है और यह हाल के कर्नेल सूचना प्रकटीकरण हमलों को कैसे रोकता है?


1 यह लिनक्स विशिष्ट नहीं है, हालांकि - समान या समान निर्माण का उपयोग अन्य ओएस पर शमन रणनीतियों के हिस्से के रूप में किया जाता है ।


6
Google का एक दिलचस्प समर्थन लेख
sgbj

2
ओह, तो यह उच्चारित है / ætræmp /lin / (अमेरिकी) या / it'stræmpəˌli Britishn / (ब्रिटिश)
वाल्टर ट्रॉस

2
आप उल्लेख कर सकते हैं कि यह लिनक्स कर्नेल है, हालांकि gccइस तरह से इंगित करता है! मैंने लिनक्स कर्नेल मेलिंग सूची साइट के रूप में lkml.org/lkml/2018/1/3/780 को नहीं पहचाना , एक बार भी मैंने वहां देखा नहीं था (और ऑफ़लाइन होने के कारण स्नैपशॉट दिया गया था)।
PJTraill

@PJTraill - ने
रिचवेल

@PJTraill - अच्छी बात है, मैंने प्रश्न पाठ को अद्यतन किया। ध्यान दें कि मैंने इसे सबसे पहले लिनक्स कर्नेल में देखा क्योंकि यह अपेक्षाकृत खुली विकास प्रक्रिया है, लेकिन इसमें कोई संदेह नहीं है कि समान या समान तकनीकों का उपयोग खुले और बंद स्रोत OSes के स्पेक्ट्रम के रूप में उपयोग किया जा रहा है। इसलिए मैं इसे लिनक्स-विशिष्ट के रूप में नहीं देखता, लेकिन लिंक निश्चित रूप से है।
BeeOnRope

जवाबों:


158

Google के पॉल टर्नर द्वारा लिखित टिप्पणियों में sgbj द्वारा उल्लिखित लेख बहुत अधिक विस्तार से बताता है, लेकिन मैं इसे एक शॉट दूंगा:

जहां तक ​​मैं इस समय सीमित जानकारी से एक साथ मिल सकता है, एक रेटपोलिन एक वापसी ट्रम्पोलिन है जो एक अनंत लूप का उपयोग करता है जिसे सीपीयू को अप्रत्यक्ष कूद के लक्ष्य पर सट्टा लगाने से रोकने के लिए कभी भी निष्पादित नहीं किया जाता है।

मूल दृष्टिकोण एंडी क्लेन की कर्नेल शाखा में इस मुद्दे को संबोधित करते हुए देखा जा सकता है :

यह __x86.indirect_thunkकॉल लक्ष्य को लोड करने वाली नई कॉल का परिचय देता है जिसका मेमोरी एड्रेस (जिसे मैं कॉल करूंगा ADDR) स्टैक के शीर्ष पर संग्रहीत होता है और एक RETनिर्देश का उपयोग करके जंप को निष्पादित करता है । इसके बाद खुद को ठग NOSPEC_JMP / CALL मैक्रो का उपयोग करने के लिए कहा जाता है , जिसका उपयोग कई (यदि सभी नहीं) अप्रत्यक्ष कॉल और जंपर्स को बदलने के लिए किया गया था। मैक्रो बस कॉल लक्ष्य को स्टैक पर रखता है और यदि आवश्यक हो तो रिटर्न पता सही तरीके से सेट करता है (गैर-रैखिक नियंत्रण प्रवाह पर ध्यान दें):

.macro NOSPEC_CALL target
    jmp     1221f            /* jumps to the end of the macro */
1222:
    push    \target          /* pushes ADDR to the stack */
    jmp __x86.indirect_thunk /* executes the indirect jump */
1221:
    call    1222b            /* pushes the return address to the stack */
.endm

callअंत में प्लेसमेंट आवश्यक है ताकि जब अप्रत्यक्ष कॉल समाप्त हो NOSPEC_CALLजाए, तो मैक्रो के उपयोग के पीछे नियंत्रण प्रवाह जारी रहे , इसलिए इसे नियमित रूप से इस्तेमाल किया जा सकता हैcall

ठग खुद को इस प्रकार देखता है:

    call retpoline_call_target
2:
    lfence /* stop speculation */
    jmp 2b
retpoline_call_target:
    lea 8(%rsp), %rsp 
    ret

नियंत्रण प्रवाह यहां थोड़ा भ्रमित कर सकता है, इसलिए मुझे स्पष्ट करें:

  • call स्टैक के लिए वर्तमान निर्देश सूचक (लेबल 2) को धक्का देता है।
  • leaस्टैक पॉइंटर में 8 जोड़ता है , प्रभावी रूप से सबसे हाल ही में धकेल दिया गया क्वाडवर्ड, जो कि अंतिम रिटर्न एड्रेस है (लेबल 2 में)। इसके बाद, वास्तविक रिटर्न एड्रेस ADDR पर स्टैक पॉइंट्स का शीर्ष फिर से।
  • retकूदता है *ADDRऔर कॉल स्टैक की शुरुआत में स्टैक पॉइंटर को रीसेट करता है।

अंत में, यह पूरा व्यवहार व्यावहारिक रूप से सीधे कूदने के बराबर है *ADDR। हमें जो लाभ मिलता है, वह यह है कि शाखा भविष्यवक्ता का उपयोग रिटर्न स्टेटमेंट्स (रिटर्न स्टैक बफर, आरएसबी) के लिए किया जाता है, जब callनिर्देश निष्पादित करते हैं , तो यह मान लेता है कि संबंधित retस्टेटमेंट लेबल 2 पर कूद जाएगा।

लेबल 2 के बाद का हिस्सा वास्तव में कभी निष्पादित नहीं होता है, यह केवल एक अनंत लूप है जो सिद्धांत में निर्देश पाइपलाइन को JMPनिर्देश के साथ भर देगा । का उपयोग करके LFENCE, PAUSEया आम तौर पर एक निर्देश के कारण अनुदेश पाइपलाइन स्टाल होने से सीपीयू को इस सट्टा निष्पादन पर किसी भी शक्ति और समय को बर्बाद करने से रोकता है। इसका कारण यह है कि यदि कॉल retpoline_call_target सामान्य रूप से वापस आ जाएगी, तो LFENCEनिष्पादित होने वाला अगला निर्देश होगा। यह भी वही है जो शाखा प्रीडेटर मूल रिटर्न एड्रेस (लेबल 2) के आधार पर भविष्यवाणी करेगा

इंटेल के आर्किटेक्चर मैनुअल से उद्धरण के लिए:

LFENCE से पहले निर्देश LFENCE से पहले मेमोरी से प्राप्त किए जा सकते हैं, लेकिन LFENCE पूरा होने तक वे निष्पादित नहीं करेंगे।

हालांकि ध्यान दें कि विनिर्देश का उल्लेख नहीं है कि LFENCE और PAUSE पाइपलाइन को स्टाल करने का कारण है, इसलिए मैं यहां लाइनों के बीच थोड़ा पढ़ रहा हूं।

अब आपके मूल प्रश्न पर वापस आते हैं: कर्नेल मेमोरी जानकारी प्रकटीकरण दो विचारों के संयोजन के कारण संभव है:

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

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

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

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


मुझे नहीं लगता कि LFENCE निर्देश महत्वपूर्ण है, Google का कार्यान्वयन इसके बजाय PAUSE निर्देश का उपयोग करता है। support.google.com/faqs/answer/7625886 ध्यान दें कि आपके द्वारा कहे गए दस्तावेज़ कहते हैं कि "निष्पादित नहीं होगा" "जानबूझकर निष्पादित नहीं किया जाएगा"।
रॉस रिज

1
उस Google FAQ पृष्ठ से: "उपरोक्त सट्टा लूप में दिए गए निर्देश सही होने के लिए आवश्यक नहीं हैं। लेकिन इसका मतलब यह है कि गैर-उत्पादक सट्टा निष्पादन प्रोसेसर पर कम कार्यात्मक इकाइयों को रखता है।" तो यह आपके निष्कर्ष का समर्थन नहीं करता है कि LFENCE वे यहाँ कुंजी है।
रॉस रिज

@RossRidge मैं आंशिक रूप से सहमत हूं, यह मुझे एक अनंत लूप के दो संभावित कार्यान्वयन की तरह दिखता है जो सीपीयू को संकेत देता है कि कोड / एलएफईएनसीई के बाद कोड को अंजाम नहीं दिया जाए। हालाँकि अगर LFENCE को सट्टा चलाया गया था और वापस नहीं लुढ़का क्योंकि अटकलें सही थीं, तो यह इस दावे का खंडन करेगा कि यह केवल मेमोरी लोड के समाप्त होने के बाद निष्पादित किया जाएगा। (अन्यथा, निर्देशों का पूरा सेट जो कि सट्टा निष्पादित किया गया है, उन्हें वापस रोल करना होगा और विनिर्देशों को पूरा करने के लिए फिर से निष्पादित करना होगा)
टोबीस रिबिजेल

1
इस का लाभ दिया है push/ retकि यह नहीं है असंतुलित वापसी-पता भविष्यवक्ता ढेर। एक गलतफहमी है ( lfenceवास्तविक रिटर्न पते से पहले उपयोग किया जाता है), लेकिन एक call+ संशोधित rspसंतुलित का उपयोग करके ret
पीटर कॉर्डेस

1
उफ़, लाभ से अधिक push / ret(मेरा आखिरी टिप्पणी में)। पुन: आपका संपादन: RSB अंडरफ्लो असंभव होना चाहिए क्योंकि रेटपोलिन में ए शामिल है call। यदि कर्नेल पूर्व-उत्सर्जन ने वहां एक संदर्भ स्विच किया, तो हम callशेड्यूलर में आरएसबी के साथ निष्पादन को फिर से शुरू करेंगे । लेकिन शायद एक रुकावट हैंडलर retआरएसबी को खाली करने के लिए पर्याप्त एस के साथ समाप्त हो सकता है ।
पीटर कॉर्डेस

46

एक रिटपोलिन को शाखा लक्ष्य इंजेक्शन ( CVE-2017-5715 ) के शोषण से बचाने के लिए डिज़ाइन किया गया है । यह एक हमला है जहां कर्नेल में एक अप्रत्यक्ष शाखा निर्देश का उपयोग कोड के एक मनमाने तरीके से सट्टा निष्पादन को मजबूर करने के लिए किया जाता है। चुना गया कोड एक "गैजेट" है जो किसी तरह से हमलावर के लिए उपयोगी है। उदाहरण के लिए कोड चुना जा सकता है ताकि कर्नेल डेटा को लीक किया जा सके कि यह कैश को कैसे प्रभावित करता है। रेटपॉलिन केवल रिटर्न निर्देश के साथ सभी अप्रत्यक्ष शाखा निर्देशों को प्रतिस्थापित करके इस शोषण को रोकता है।

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

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

ध्यान दें कि रेटपॉलिन सीधे कर्नेल जानकारी के प्रकटीकरण को नहीं रोकता है, यह केवल अप्रत्यक्ष शाखा निर्देशों को एक गैजेट को निष्पादित करने से रोकता है जो जानकारी का खुलासा करेगा। यदि हमलावर गैजेट को सट्टा चलाने के लिए कुछ अन्य साधन पा सकता है, तो रेटपॉलिन हमले को नहीं रोकता है।

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

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

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

Google पर प्रोजेक्ट ज़ीरो टीम द्वारा एक साइड-चैनल के साथ रीडिंग विशेषाधिकार प्राप्त मेमोरी नामक एक ब्लॉग प्रविष्टि एक अन्य उदाहरण प्रदान करती है कि कैसे काम करने वाले शोषण को बनाने के लिए शाखा लक्ष्य इंजेक्शन का उपयोग किया जा सकता है।


9

यह सवाल कुछ समय पहले पूछा गया था, और एक नए उत्तर के हकदार हैं।

कार्यकारी सारांश :

"रेटपॉलिन" क्रम एक सॉफ्टवेयर निर्माण है जो अप्रत्यक्ष शाखाओं को सट्टा निष्पादन से अलग करने की अनुमति देता है। यह उनकी अप्रत्यक्ष शाखाओं के खिलाफ शाखा लक्ष्य इंजेक्शन हमलों से संवेदनशील बायनेरिज़ (जैसे ऑपरेटिंग सिस्टम या हाइपरवाइज़र कार्यान्वयन) की रक्षा के लिए लागू किया जा सकता है।

शब्द " रेट पॉलिन " "वापसी" और "ट्रैम्पोलिन" शब्दों का एक चित्रण है, बहुत हद तक सुधार " rel poline " "रिश्तेदार कॉल" और "trampoline" से गढ़ा गया था। यह एक ट्रैम्पोलिन कंस्ट्रक्शन है जो रिटर्न ऑपरेशंस का उपयोग करके बनाया गया है, जो कि यह भी सुनिश्चित करता है कि कोई भी सट्टा अंजाम अमल में न लाए।

कर्नेल या क्रॉस-प्रोसेस मेमोरी प्रकटीकरण (स्पेक्टर अटैक) के खिलाफ कम करने के लिए, लिनक्स कर्नेल [1] को एक नए विकल्प के साथ संकलित किया जाएगा, -mindirect-branch=thunk-externजो कि तथाकथित रेटपॉलिन के माध्यम से अप्रत्यक्ष कॉल करने के लिए gcc में पेश किया जाएगा।

[१] यह लिनक्स विशिष्ट नहीं है, हालांकि - समान या समान निर्माण अन्य OSes पर शमन रणनीतियों के हिस्से के रूप में उपयोग किया जाता है।

इस संकलक विकल्प का उपयोग केवल प्रभावित प्रोसेसर में स्पेक्टर V2 से बचाता है जिसमें CVE-2017-5715 के लिए आवश्यक माइक्रोकोड अपडेट है। यह किसी भी कोड पर (केवल कर्नेल नहीं) काम करेगा , लेकिन केवल "रहस्य" वाले कोड पर हमला करने के लायक है।

यह एक नया आविष्कार किया गया शब्द प्रतीत होता है क्योंकि Google खोज केवल हाल के उपयोग (आमतौर पर 2018 में सभी) को बदल देती है।

LLVM संकलक एक पड़ा है -mretpolineके बाद से स्विच जनवरी 4 2018 से पहले । वह तारीख है जब भेद्यता को पहली बार बताया गया था । GCC ने अपने पैच 7 जनवरी, 2018 को उपलब्ध कराए

सीवीई तिथि बताती है कि 2017 में भेद्यता की E खोज ’की गई थी , लेकिन यह पिछले दो दशकों में निर्मित कुछ प्रोसेसर को प्रभावित करता है (इस प्रकार संभवतः इसकी खोज बहुत पहले हो गई थी)।

एक रेटपोलिन क्या है और यह हाल के कर्नेल सूचना प्रकटीकरण हमलों को कैसे रोकता है?

सबसे पहले, कुछ परिभाषाएँ:

  • Trampoline - कभी-कभी अप्रत्यक्ष कूद वैक्टर के रूप में संदर्भित किया जाता है trampolines स्मृति स्थान हैं जो पते को पकड़े हुए हैं जो सर्विस रूट, I / O रूटीन आदि को बाधित करने के संकेत देते हैं। निष्पादन trampoline में कूदता है और फिर तुरंत कूदता है, या उछलता है, इसलिए शब्द trampoline। GCC ने परंपरागत रूप से नेस्टेड फंक्शन का पता चलने पर रन टाइम में एक निष्पादन योग्य ट्रैम्पोलिन बनाकर नेस्टेड फंक्शंस का समर्थन किया है। यह कोड का एक छोटा सा टुकड़ा है जो आम तौर पर स्टैक पर रहता है, जिसमें फ़ंक्शन के स्टैक फ्रेम में होता है। ट्रम्पोलिन स्थिर श्रृंखला रजिस्टर को लोड करता है और फिर नेस्टेड फ़ंक्शन के वास्तविक पते पर कूदता है।

  • थंक - एक थन एक सबरूटीन है जो एक अतिरिक्त गणना को दूसरे सबरूटीन में इंजेक्ट करने के लिए उपयोग किया जाता है। मुख्य रूप से गणना में देरी करने के लिए थ्रो का उपयोग किया जाता है, जब तक कि उसके परिणाम की आवश्यकता न हो, या अन्य सबरूटीन की शुरुआत या अंत में ऑपरेशन सम्मिलित करने के लिए

  • Memoization - एक memoized समारोह "याद" विशिष्ट जानकारी के कुछ सेट करने के लिए इसी का परिणाम है। स्मरण किए गए इनपुट के साथ आने वाली कॉलें इसे याद करने के बजाय याद किए गए परिणाम को वापस करती हैं, इस प्रकार दिए गए मापदंडों के साथ कॉल की प्राथमिक लागत को समाप्त कर देती है लेकिन उन मापदंडों के साथ फ़ंक्शन के लिए किया गया पहला कॉल है।

बहुत मोटे तौर पर, एक retpoline एक है ट्रैम्पोलिन एक साथ वापसी एक के रूप में thunk , 'करने के लिए खराब ' Memoization अप्रत्यक्ष शाखा भविष्यवक्ता में।

स्रोत : रेटपॉलिन में इंटेल के लिए PAUSE निर्देश शामिल है, लेकिन एएमडी के लिए एक LFENCE निर्देश आवश्यक है क्योंकि उस प्रोसेसर पर PAUSE निर्देश क्रमबद्ध निर्देश नहीं है, इसलिए ठहराव / जेएमपी लूप अतिरिक्त शक्ति का उपयोग करेगा क्योंकि यह वापसी के लिए इंतजार कर रहा है। सही लक्ष्य के लिए गलत करने के लिए।

Arstechnica समस्या का एक सरल विवरण है:

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

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

इंटेल के कागज से: " रेटपॉलिन: एक शाखा लक्ष्य इंजेक्शन शमन " ( .PDF ):

"एक रेटपॉलिन अनुक्रम प्रोसेसर के सट्टा निष्पादन को" अप्रत्यक्ष शाखा भविष्यवक्ता "(प्रोग्राम फ्लो की भविष्यवाणी का एक तरीका) का उपयोग करने से रोकता है, एक शोषित द्वारा नियंत्रित पते के लिए अटकल लगाने के लिए (शाखा लक्ष्य इंजेक्शन के पांच तत्वों के संतोषजनक तत्व 4) (भूतल संस्करण 2) ) शोषण रचना ऊपर सूचीबद्ध है) "।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.