
प्रकट "Spectre" एक्सप्लॉइट (CVE-2017-5753 और CVE-2017-5715) के उपयोग का उदाहरण
2 जनवरी 2018 को सामने आए "स्पेक्टर" शोषण (CVE-2017-5753 और CVE-2017-5715) का उपयोग करने का उदाहरण
स्पेक्टर विभिन्न अनुप्रयोगों के बीच अलगाव को तोड़ता है। यह एक हमलावर को सर्वोत्तम प्रथाओं का पालन करने वाले त्रुटि-मुक्त प्रोग्रामों को धोखा देकर उनके रहस्य लीक कराने की अनुमति देता है। वास्तव में, उक्त सर्वोत्तम प्रथाओं की सुरक्षा जाँचें हमले की सतह को और बढ़ा देती हैं और अनुप्रयोगों को स्पेक्टर के प्रति अधिक संवेदनशील बना सकती हैं।
C, निम्नलिखित लाइब्रेरी का उपयोग करता है:
हम मेमोरी में "The Magic Words are Squeamish Ossifrage." टेक्स्ट डाल रहे हैं और फिर शोषण का उपयोग करके उसे पढ़ने का प्रयास कर रहे हैं। यदि सिस्टम संवेदनशील (vulnerable) है, तो आपको आउटपुट में मेमोरी से पढ़ा गया वही टेक्स्ट दिखाई देगा।
इस कोड में, यदि victim_function() में संकलित निर्देशों को सख्त प्रोग्राम क्रम में निष्पादित किया जाए, तो फ़ंक्शन केवल array1[0..15] से पढ़ेगा, क्योंकि array1 का आकार 16 है। हालाँकि, जब सट्टा (speculative) तरीके से निष्पादित किया जाता है, तो सीमा से बाहर (out-of-bounds) पढ़ना संभव है। readMemoryByte() फ़ंक्शन victim_function() को कई प्रशिक्षण कॉल करता है ताकि शाखा भविष्यवक्ता x के लिए मान्य मानों की अपेक्षा करे, और फिर सीमा से बाहर के x के साथ कॉल करता है। सशर्त शाखा गलत भविष्यवाणी करती है, और उसके बाद का सट्टा निष्पादन सीमा से बाहर के x का उपयोग करके एक गुप्त बाइट पढ़ता है। सट्टा कोड तब array2[array1[x] * 512] से पढ़ता है, जिससे array1[x] का मान कैश स्थिति में लीक हो जाता है। हमले को पूरा करने के लिए, यह पहचानने हेतु एक सरल flush+probe का उपयोग किया जाता है कि array2 में कौन सी कैश लाइन लोड की गई थी, जिससे मेमोरी की सामग्री का पता चलता है। हमले को कई बार दोहराया जाता है, इसलिए भले ही लक्ष्य बाइट शुरू में कैश्ड न हो, पहली पुनरावृत्ति उसे कैश में ला देगी।
गैर-अनुकूलित कोड i7 सर्फेस प्रो 3 पर लगभग 10KB/सेकंड पढ़ता है।
gcc -std=c99 Source.c -o spectre.out
या
make
नया खाली प्रोजेक्ट बनाएं और Source.c जोड़ें, फिर Build पर क्लिक करें।
बिना किसी पैरामीटर के .\spectre.out।
.\spectre.out {address} {length} पैरामीटर के साथ: