
إثبات المفهوم لـ CVE-2021-4034 (مع استغلال تجريبي بدون أثر)
pkwned: إثبات المفهوم لـ CVE-2021-4034
سيقوم هذا الإثبات بتشغيل PAYLOAD_PATH (كما هو معرّف في constants.h) بصلاحيات الجذر من إصدار ضعيف من pkexec يعمل على glibc. يجب أن يحتوي الدليل "GCONV_PATH=." على ملف قابل للتنفيذ مسمّى على اسم الدليل الذي يحتوي على وحدة gconv.
كما هو موضح في نشرة Qualys [1]، سينتج عن ذلك رسالة syslog. وجدت نهجين حتى الآن لمنع ذلك:
641 if (access (path, F_OK) != 0) 642 { 643 g_printerr ("Error accessing %s: %s\n", path, g_strerror (errno)); 644 goto out; 645 }
يحتوي هذا المستودع على أداة gconv-fuse التي تقوم بتركيب نظام ملفات FUSE فوق "GCONV_PATH=."، والذي يظهر فارغًا بعد استدعاء واحد من access("gconv", X_OK). يعمل هذا فقط إذا كان خيار الإعداد user_allow_other في FUSE مفعّلاً.
356 if (!g_file_get_contents ("/etc/shells", 357 &contents, 358 NULL, /* gsize *length */ 359 &error)) 360 { 361 g_printerr ("Error getting contents of /etc/shells: %s\n", error->message); 362 g_error_free (error); 363 goto out; 364 }
يمكن استخدام مساحات الأسماء (mount namespaces) لتركيب ملف غير قابل للقراءة فوقه، ولكن يتطلب ذلك مساحة اسم مستخدم أيضًا، لتعيين مستخدم غير مميز إلى الجذر و جعل بت setuid الخاص بـ pkexec غير فعّال (مثل "unshare -r -u -m").
لاحظ أن GLib قد دمج إصلاحًا لـ g_find_program_in_path (ربما للإصدارات المستقرة التالية بعد v2.70.3 و v2.71.0) مما سيجعل هذا الاستغلال غير ممكن من خلال إرجاع مسارات كاملة فعلية دائمًا. [2]
[1] https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt [2] https://gitlab.gnome.org/GNOME/glib/-/commit/13ee46538f901a8eca8e7a4c167a8838ed0858d4