
إثبات المفهوم لاستغلال CVE-2017-1000367، وهو ثغرة تصعيد امتيازات محلية في دالة get_process_ttyname() في Sudo على Linux، تسمح بالكتابة فوق أي ملف عبر التلاعب برقم جهاز tty.
اكتشفنا ثغرة أمنية في دالة get_process_ttyname() الخاصة بـ Sudo على نظام لينكس:
هذه الدالة تفتح الملف “/proc/[pid]/stat” (man proc) وتقرأ رقم جهاز tty من الحقل 7 (tty_nr). لسوء الحظ، هذه الحقول مفصولة بمسافات والحقل 2 (comm، اسم ملف الأمر) يمكن أن يحتوي على مسافات (CVE-2017-1000367).
على سبيل المثال، إذا قمنا بتنفيذ Sudo عبر الرابط الرمزي “./ 1 “، فإن get_process_ttyname() تستدعي sudo_ttyname_dev() للبحث عن رقم جهاز tty غير موجود “1” في المصفوفة المدمجة search_devs[].
بعد ذلك، تستدعي sudo_ttyname_dev() الدالة sudo_ttyname_scan() للبحث عن رقم جهاز tty غير الموجود “1” في اجتياز عرضي (breadth-first) عبر “/dev”.
أخيراً، نستغل هذه الدالة أثناء اجتيازها للمسار القابل للكتابة عالمياً “/dev/shm”: من خلال هذه الثغرة، يمكن لمستخدم محلي التظاهر بأن tty الخاص به هو أي جهاز حرفي (character device) على نظام الملفات، وبعد شرطين سباق (race conditions)، يمكنه التظاهر بأن tty الخاص به هو أي ملف على نظام الملفات.
على نظام مزوّد بـ SELinux، إذا كان المستخدم لديه صلاحية Sudoer لأمر لا يمنحه صلاحيات جذر كاملة، فيمكنه الكتابة فوق أي ملف على نظام الملفات (بما في ذلك الملفات المملوكة لـ root) بمخرجات الأمر الخاص به، لأن relabel_tty() (في src/selinux.c) تستدعي open(O_RDWR|O_NONBLOCK) على tty الخاص به وتقوم بـ dup2() له على stdin، stdout، وstderr للأمر. وهذا يسمح لأي مستخدم Sudoer بالحصول على صلاحيات جذر كاملة.