
CVE-2017-1000367 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Linux पर Sudo के get_process_ttyname() में एक स्थानीय विशेषाधिकार वृद्धि भेद्यता है, जो tty डिवाइस नंबर हेरफेर के माध्यम से किसी भी फ़ाइल को अधिलेखित करने की अनुमति देता है।
हमने Sudo के get_process_ttyname() फ़ंक्शन में Linux के लिए एक कमज़ोरी खोजी: यह फ़ंक्शन "/proc/[pid]/stat" (man proc) खोलता है और tty का डिवाइस नंबर फ़ील्ड 7 (tty_nr) से पढ़ता है। दुर्भाग्य से, ये फ़ील्ड स्पेस से अलग किए गए हैं और फ़ील्ड 2 (comm, कमांड का फ़ाइलनाम) में स्पेस हो सकते हैं (CVE-2017-1000367)।
उदाहरण के लिए, यदि हम सिमलिंक "./ 1 " के माध्यम से Sudo निष्पादित करते हैं, तो get_process_ttyname() sudo_ttyname_dev() को कॉल करता है ताकि बिल्ट-इन search_devs[] में गैर-मौजूद tty डिवाइस नंबर "1" की खोज की जा सके।
इसके बाद, sudo_ttyname_dev() फ़ंक्शन sudo_ttyname_scan() को कॉल करता है ताकि "/dev" की breadth-first ट्रैवर्सल में इस गैर-मौजूद tty डिवाइस नंबर "1" की खोज की जा सके।
अंत में, हम "/dev/shm" (जो दुनिया-लिखने योग्य है) के ट्रैवर्सल के दौरान इस फ़ंक्शन का शोषण करते हैं: इस कमज़ोरी के माध्यम से, एक स्थानीय उपयोगकर्ता यह दिखावा कर सकता है कि उसका tty फ़ाइलसिस्टम पर कोई भी कैरेक्टर डिवाइस है, और दो रेस कंडीशन के बाद, वह दिखावा कर सकता है कि उसका tty फ़ाइलसिस्टम पर कोई भी फ़ाइल है।
SELinux-सक्षम सिस्टम पर, यदि कोई उपयोगकर्ता किसी कमांड के लिए Sudoer है जो उसे पूर्ण रूट विशेषाधिकार नहीं देता है, तो वह फ़ाइलसिस्टम पर किसी भी फ़ाइल (रूट-स्वामित्व वाली फ़ाइलों सहित) को अपने कमांड के आउटपुट से ओवरराइट कर सकता है, क्योंकि relabel_tty() (src/selinux.c में) अपने tty पर open(O_RDWR|O_NONBLOCK) कॉल करता है और इसे कमांड के stdin, stdout और stderr पर dup2() करता है। यह किसी भी Sudoer उपयोगकर्ता को पूर्ण रूट विशेषाधिकार प्राप्त करने की अनुमति देता है।