
gem5 में Retbleed (CVE-2022-29900/29901) माइक्रो-आर्किटेक्चरल हमले का पुनरुत्पादन। RSB अंडरफ्लो, Flush+Reload साइड-चैनल लीक, और एक सत्यापित lfence शमन।
Retbleed (CVE-2022-29900 / CVE-2022-29901) का व्यावहारिक पुनरुत्पादन — 2022 का माइक्रो-आर्किटेक्चरल हमला जिसने "Retpoline" रक्षा को तोड़ दिया, यह सिद्ध करते हुए कि ret निर्देश, जिन्हें लंबे समय से सुरक्षित माना जाता था, तब अपहृत किए जा सकते हैं जब CPU का Return Stack Buffer (RSB) अंडरफ़्लो हो जाता है।
यह प्रोजेक्ट gem5 में एक x86 Out-of-Order CPU मॉडल पर पूर्ण हमला जीवनचक्र का अनुकरण करता है: RSB अंडरफ़्लो को ट्रिगर करना, Flush+Reload कैश साइड-चैनल के माध्यम से एक बार में एक बाइट गुप्त डेटा लीक करना, और फिर एक सॉफ़्टवेयर शमन (lfence) को सत्यापित करना जो लीक को बंद कर देता है।
पाठ्यक्रम प्रोजेक्ट — Advanced Computer Architecture, Fall 2025, CUNY City College लेखक: Abdul Kalam Mansoor और Rebiha Selmani
Spectre-शैली के हमलों ने दिखाया कि सट्टा निष्पादन कैश-स्तर के दुष्प्रभाव छोड़ता है, भले ही CPU एक गलत अनुमान को "पूर्ववत" कर दे। उद्योग का समाधान — Retpoline — ने खतरनाक अप्रत्यक्ष जंप को ret निर्देशों से बदल दिया, इस धारणा पर कि रिटर्न एक छोटे हार्डवेयर स्टैक (RSB) से सुरक्षित रूप से अनुमानित होते हैं। Retbleed ने दिखाया कि यह धारणा गलत है: गहरी रिकर्सन से RSB को समाप्त करें, और CPU चुपचाप उसी असुरक्षित प्रेडिक्टर पर वापस आ जाता है जिससे बचने के लिए Retpoline डिज़ाइन किया गया था।
| चरण | क्या होता है |
|---|---|
| 1. ट्रिगर | rsb_deep_call() 32 स्तरों तक गहराई से रिकर्स करता है, 16-प्रविष्टि वाले RSB को ओवरफ़्लो करता है। जब रिकर्सन अनवाइंड होता है, तो RSB खाली होता है। |
| 2. फ़ॉलबैक | RSB खाली होने पर, CPU ret लक्ष्य का अनुमान लगाने के लिए Branch Target Buffer (BTB) पर वापस आ जाता है — जिसे एक हमलावर ज़हर दे सकता है। |
| 3. गैजेट | अपहृत सट्टा पथ gadget() को निष्पादित करता है, जो गुप्त पासवर्ड का एक बाइट पढ़ता है और उसका उपयोग probe_array में इंडेक्स करने के लिए करता है, उस सरणी के एक पेज को कैश में खींचता है। |
| 4. Flush+Reload जासूस | हमले से पहले, probe_array के प्रत्येक पेज को कैश से फ़्लश किया जाता है (_mm_clflush)। सट्टा विंडो बंद होने के बाद, प्रोग्राम प्रत्येक संभावित बाइट मान तक पहुँच का समय मापता है (__rdtscp) — जो तेज़ी से वापस आता है (कैश हिट) वह गुप्त बाइट को प्रकट करता है। |
ROOT_PASSWORD के प्रत्येक बाइट के लिए इसे दोहराना पूरे रहस्य का पुनर्निर्माण करता है, बिना कभी आर्किटेक्चरल रूप से gadget() को कॉल किए।
| मोड | एक्सेस लेटेंसी | परिणाम |
|---|---|---|
असुरक्षित (SECURE_MODE अपरिभाषित) | ~49 चक्र (कैश हिट) | रहस्य बाइट-दर-बाइट लीक, लाल HIT! संकेतकों द्वारा पुष्टि |
पैच किया गया (SECURE_MODE परिभाषित, _mm_lfence() इंजेक्ट किया गया) | >150 चक्र (कैश मिस / शोर) | हमला विफल — आउटपुट SAFE / Found: ??? दिखाता है |
lfence CPU को किसी भी बाद के निर्देश के निष्पादन से पहले रिटर्न पता को हल करने के लिए मजबूर करता है, गैजेट के गुप्त-निर्भर मेमोरी को छूने से पहले सट्टा विंडो को समाप्त कर देता है।
src/
retbleed.c # Full PoC: trigger, gadget, Flush+Reload spy, and lfence mitigation (toggle via SECURE_MODE)
docs/
Retbleed_Report.pdf # Full written report: methodology, related work, gem5 setup, results
Retbleed_Attack_Demonstration.pptx # Slide deck used to present the project
PoC को gem5 (DerivO3CPU, एक out-of-order मॉडल — आवश्यक क्योंकि in-order मॉडल सट्टा निष्पादन को लागू नहीं करते) के तहत बनाया और मापा गया था:
gcc -O0 -static -o retbleed src/retbleed.c
./build/X86/gem5.opt configs/deprecated/example/se.py \
--cpu-type=DerivO3CPU --caches --l2cache \
--l1d_size=64kB --l1i_size=64kB --cmd=retbleed
असुरक्षित और पैच किए गए व्यवहार के बीच स्विच करने के लिए, retbleed.c के शीर्ष पर इस पंक्ति को कमेंट/अनकमेंट करें:
#define SECURE_MODE
कोड वास्तविक x86 इंट्रिंसिक्स (
_mm_clflush,__rdtscp,_mm_lfence) का उपयोग करता है और इसे x86 हार्डवेयर पर मूल रूप से संकलित और चलाया जा सकता है (gcc -O0 -o retbleed src/retbleed.c) त्वरित डेमो के लिए — परिणाम होस्ट CPU के अपने शमन (eIBRS, माइक्रोकोड पैच, आदि) के साथ भिन्न होंगे, जो स्वयं इस बात का एक उपयोगी उदाहरण है कि 2022 से इस श्रेणी के बग को कितनी अच्छी तरह पैच किया गया है।
lfences) ने प्रभावित हार्डवेयर पर 14–39% प्रदर्शन ओवरहेड मापा।