
CVE-2021-3679 के लिए शोषण और इसके सुधार के लिए दस्तावेज़
यह rb_per_cpu_empty में एक लॉजिक बग को सिद्ध करने के लिए एक प्रूफ-ऑफ-कॉन्सेप्ट प्रोग्राम है। बग से प्रभावित प्रोग्राम tracing_read_pipe में कर्नेल-स्पेस की व्यस्त डेडलूप में फंस जाएँगे और किसी भी UNIX सिग्नल (SIGKILL सहित) का उपयोग करके उन्हें रोकना या समाप्त करना असंभव होगा।
हालाँकि यह seq_buf_used गणना के बग के समान (डेडलूपिंग और CPU बर्निंग) व्यवहार प्रदर्शित करता है, जिसे linux 4.5 में ठीक किया गया था, यह प्रोग्राम एक अन्य बग के अस्तित्व को सिद्ध करने के लिए है जिसका कारण पूर्ण रूप से भिन्न है और जो 3.10 से 5.14-rc1 तक के कर्नेल संस्करणों में मौजूद माना जाता है (POC निष्पादन परिणाम भी देखें)।
अस्वीकरण: यह प्रूफ-ऑफ-कॉन्सेप्ट प्रोग्राम आपके linux को फंसा सकता है, बहुत अधिक बिजली की खपत कर सकता है, और हिट होने पर इसे UNIX सिग्नल द्वारा समाप्त नहीं किया जा सकता, अपने जोखिम पर उपयोग करें।
प्रूफ-ऑफ-कॉन्सेप्ट स्क्रिप्ट को निष्पादित करने से पहले इन पैकेजों या कमांड्स को स्थापित किया जाना चाहिए।
gcc
realpath
nm
Bash और स्ट्रिंग प्रोसेसिंग कमांड जैसे awk और भी आवश्यक हैं, और संभवतः आपके डिस्ट्रो के साथ आते हैं।
grepहालाँकि यह एक bash स्क्रिप्ट है, uprobe निर्दिष्ट करने वाला कोड भाग प्लेटफ़ॉर्म-निर्भर है (हम uprobe में $argN का उपयोग नहीं कर सकते), और हम i386, x86_64, arm और aarch64 का समर्थन करते हैं। बेझिझक अपना स्वयं का प्लेटफ़ॉर्म समर्थन जोड़ें।
प्रूफ-ऑफ-कॉन्सेप्ट चलाने के लिए, बस निम्नलिखित कमांड को रूट विशेषाधिकार के साथ निष्पादित करें:
./rbdetonate

यदि प्रूफ-ऑफ-कॉन्सेप्ट द्वारा बग ट्रिगर होता है, तो एक dd प्रक्रिया उत्पन्न होगी जो पूरे CPU कोर की खपत करेगी, और इसे केवल UNIX सिग्नल जैसे SIGKILL से नहीं मारा जा सकता।
rbdetonate स्क्रिप्ट की bash प्रक्रिया को मारा जा सकता है, लेकिन SIGINT सिग्नल भेजने पर यह bash कार्यान्वयन के आधार पर समाप्त हो भी सकती है और नहीं भी। और नए संस्करण की bash को केवल तभी SIGINT द्वारा मारा जा सकता है जब उत्पन्न dd प्रक्रिया चल रही हो।

rbdetonate बाहर निकल सकता है और Nothing buggy has been detected प्रिंट कर सकता है यदि यह कई पुनः प्रयासों के बाद dd प्रक्रिया नहीं बना पाता। हालाँकि, हमारे 8192 बार पुनः प्रयास करने के कारण इसमें कुछ समय लग सकता है।
| संस्करण | पुनरुत्पादित | स्क्रीनशॉट |
|---|---|---|
| 5.14.0-rc2-00479-g86020194bc7e (फिक्स संस्करण) | N | 5.14.0-rc2-00479-g86020194bc7e.png |
| 5.14.0-rc2-00478-g2734d6c1b1a0 (5.14.0-rc2) | Y | 5.14.0-rc2-00478-g2734d6c1b1a0.png |
| 5.4.0-77-generic | Y | 5.4.0-77-generic.png |
| 4.4.0-142-generic | Y | 4.4.0-142-generic.png |
टिप्पणी: यह बग सैद्धांतिक रूप से उन सभी संस्करणों में मौजूद है जिनमें यूज़रस्पेस ट्रेसिंग सुविधा है (>=3.10), लेकिन पुराने कर्नेल संस्करणों में uprobe कई तरीकों से ठीक से काम नहीं करता। यदि आप इसके व्यवहार को सुधारने में हमारी सहायता करें तो हम आभारी होंगे।
उत्तर: बस रूट विशेषाधिकार के साथ कमांड
echo > /sys/kernel/debug/tracing/instances/rbdetonate/trace
निष्पादित करें, यह प्रोग्राम को डेडलूप से बाहर निकाल देगा।
उत्तर: नहीं। यहाँ उपयोग किए गए बिल्ड टूल्स केवल rbwrite प्रोग्राम बनाने के लिए हैं, जो हमारे डिज़ाइन किए गए चरणों में CPU#0 पर रिंग बफर पेजों पर लिखकर निर्धारित (deterministic) परिणाम उत्पन्न करता है।
सामान्य रूप से इस प्रूफ-ऑफ-कॉन्सेप्ट के लिए, rbwrite प्रोग्राम का एक संकलित संस्करण भी उपयोग किया जा सकता है, और उसके बाद tracepoint का पता प्राप्त किया जा सकता है।
linux ट्रेसिंग का उपयोग करने के लिए, यदि आपको अनुप्रयोगों द्वारा उत्पन्न शोर से कोई आपत्ति नहीं है, तो syscalls और कर्नेल फ़ंक्शनों में kprobe tracepoints जोड़ना भी इवेंट उत्पन्न करेगा। लेकिन प्रूफ-ऑफ-कॉन्सेप्ट के लिए, यह अनिर्धारितता (undeterminism) ला सकता है और इसे पसंद नहीं किया जाता।