
लिनक्स कर्नेल ptrace डीबग रजिस्टर भ्रष्टाचार (CVE-2018-1000199) के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो ब्रेकपॉइंट वर्चुअलाइजेशन में गलत त्रुटि हैंडलिंग को प्रदर्शित करता है।
Linux ptrace कोड डीबग रजिस्टरों तक पहुंच को वर्चुअलाइज़ करता है, और वर्चुअलाइज़ेशन कोड में गलत त्रुटि प्रबंधन है। इसका मतलब है कि यदि आप DR0 में कोई अवैध मान लिखते हैं, तो कर्नेल के ब्रेकपॉइंट ट्रैकिंग की आंतरिक स्थिति दूषित हो सकती है, इस तथ्य के बावजूद कि ptrace() कॉल -EINVAL लौटाएगा।
उदाहरण के तौर पर, आप x86 कर्नेल पर /proc/kallsyms में do_debug का पता पा सकते हैं और उस पते को संलग्न PoC को दे सकते हैं। मुझे संदेह है कि x86 के अलावा अन्य आर्किटेक्चर भी प्रभावित हैं, लेकिन मैंने इसका शोषण करने का प्रयास नहीं किया है। यह बग स्वयं कर्नेल में सामान्य और आर्क कोड में हर जगह फैला हुआ है।
मुझे इस बग का उपयोग करके विशेषाधिकार वृद्धि (privilege escalation) पाने का कोई स्पष्ट तरीका नहीं दिखता, लेकिन यह मौजूद हो सकता है। उदाहरण के लिए, यह संभव है कि इस बग का उपयोग perf NMI हैंडलर को लक्षित करने से NMI स्टैक ओवरफ्लो हो सकता है, जिससे विभिन्न प्रकार की भ्रष्टाचार (corruption) हो सकती है। मैंने गैर-x86 आर्किटेक्चर पर प्रभाव का विश्लेषण करने का प्रयास नहीं किया है क्योंकि मैं केवल x86 ब्रेकपॉइंट कैसे काम करते हैं यह जानता हूं, लेकिन बग के प्रभाव बहुत भिन्न हो सकते हैं।
Linus ने अधिकतर इसे अपस्ट्रीम में कमिट f67b15037a7a50c57f72e69a6d59941ad90a0f0f में ठीक कर दिया है। उस कमिट को लागू करने पर, त्रुटि प्रबंधन अभी भी गलत है, लेकिन दोष के परिणामस्वरूप गलत ब्रेकपॉइंट के बजाय एक अक्षम (disabled) ब्रेकपॉइंट होता है।
http://man7.org/linux/man-pages/man2/ptrace.2.html
Use Ex: $ ./PoC.exe ffffffff81b44400