Qualys یک آسیبپذیری (CVE-2021-4034) را در مؤلفه سیستم Polkit (که قبلا PolicyKit نامیده میشد) شناسایی کرده است که در توزیعها استفاده میشود تا به کاربران غیرمجاز اجازه دهد تا اقداماتی را انجام دهند که به حقوق دسترسی بالا نیاز دارند. این آسیبپذیری به یک کاربر محلی غیرمجاز اجازه میدهد تا امتیازات خود را برای ریشهیابی و کنترل کامل سیستم افزایش دهد. نام رمز این مشکل PwnKit بود و برای تولید یک اکسپلویت کار که در پیکربندی پیشفرض در اکثر توزیعهای لینوکس اجرا میشود، قابل توجه است.
این مشکل در ابزار pkexec PolKit وجود دارد که با پرچم ریشه SUID ارائه می شود و برای اجرای دستورات با امتیازات کاربر دیگری مطابق با قوانین مشخص شده PolKit طراحی شده است. به دلیل مدیریت نادرست آرگومانهای خط فرمان که به pkexec ارسال میشوند، یک کاربر غیرمجاز میتواند احراز هویت را دور بزند و بدون توجه به قوانین دسترسی، کد خود را بهعنوان root اجرا کند. برای حمله، مهم نیست که چه تنظیمات و محدودیت هایی در PolKit مشخص شده است، کافی است که ویژگی ریشه SUID برای فایل اجرایی با ابزار pkexec تنظیم شود.
Pkexec اعتبار تعداد آرگومان خط فرمان (argc) را که هنگام شروع یک فرآیند ارسال شده است بررسی نمی کند. توسعه دهندگان pkexec فرض کردند که اولین ورودی در آرایه argv همیشه حاوی نام فرآیند (pkexec) و دومی یک مقدار NULL یا نام دستوری است که از طریق pkexec راه اندازی شده است. از آنجایی که تعداد آرگومان در برابر محتوای واقعی آرایه بررسی نمی شد و همیشه بزرگتر از 1 فرض می شد، اگر فرآیندی از یک آرایه argv خالی عبور داده شود، همانطور که تابع execve لینوکس اجازه می دهد، pkexec NULL را به عنوان اولین آرگومان در نظر می گیرد. نام فرآیند) و نام بعدی به عنوان خارج از حافظه بافر، مانند محتویات بعدی آرایه. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "برنامه" "-option" NULL "value" "PATH=name" NULL
مشکل این است که بعد از آرایه argv یک آرایه envp در حافظه وجود دارد که حاوی متغیرهای محیطی است. بنابراین، اگر آرایه argv خالی باشد، pkexec دادههای مربوط به فرمان اجرا شده را با امتیازات بالا از اولین عنصر آرایه با متغیرهای محیطی استخراج میکند (argv[1] با envp[0] یکسان شد)، که محتویات آن قابل کنترل است. توسط مهاجم
پس از دریافت مقدار argv[1]، pkexec با در نظر گرفتن مسیرهای فایل در PATH سعی می کند مسیر کامل فایل اجرایی را تعیین کند و یک اشاره گر به رشته با مسیر کامل بازگشت به argv[1] می نویسد. منجر به بازنویسی مقدار اولین متغیر محیطی می شود، زیرا argv[1] با envp[0] یکسان است. با دستکاری نام متغیر محیطی اول، مهاجم می تواند متغیر محیطی دیگری را در pkexec جایگزین کند، برای مثال، متغیر محیطی "LD_PRELOAD" را که در برنامه های suid مجاز نیست، جایگزین کند و ترتیبی دهد که کتابخانه مشترک آنها بارگذاری شود. روند.
اکسپلویت کاری شامل جایگزینی متغیر GCONV_PATH است که برای تعیین مسیر کتابخانه رمزگذاری نماد استفاده میشود که به صورت پویا هنگام فراخوانی تابع g_printerr () بارگذاری میشود، کد آن از iconv_open() استفاده میکند. با تعریف مجدد مسیر در GCONV_PATH، مهاجم میتواند اطمینان حاصل کند که کتابخانه استاندارد iconv نیست که بارگیری میشود، بلکه کتابخانه خودش است، زمانی که یک پیام خطا در مرحلهای که pkexec هنوز با آن در حال اجرا است نمایش داده میشود، کنترلکنندههای آن اجرا میشوند. حقوق ریشه و قبل از راه اندازی مجوزها بررسی می شوند.
خاطرنشان می شود که علیرغم اینکه مشکل ناشی از خرابی حافظه است، می توان بدون توجه به معماری سخت افزاری مورد استفاده به طور قابل اعتماد و تکراری از آن سوء استفاده کرد. اکسپلویت آماده شده با موفقیت در اوبونتو، دبیان، فدورا و CentOS آزمایش شده است، اما می تواند در توزیع های دیگر نیز استفاده شود. اکسپلویت اصلی هنوز در دسترس عموم قرار نگرفته است که نشان میدهد بیاهمیت است و میتوان آن را به راحتی توسط سایر محققان بازسازی کرد، بنابراین مهم است که بهروزرسانی پچ را در اسرع وقت بر روی سیستمهای چند کاربره نصب کنید. Polkit همچنین برای سیستم های BSD و Solaris موجود است، اما برای استفاده بر روی آنها مطالعه نشده است. آنچه مشخص است این است که حمله نمی تواند بر روی OpenBSD انجام شود، زیرا هسته OpenBSD اجازه نمی دهد که مقدار argc null در هنگام فراخوانی execve() ارسال شود.
این مشکل از می 2009، از زمان اضافه شدن دستور pkexec وجود داشته است. رفع آسیبپذیری PolKit در حال حاضر بهعنوان یک وصله در دسترس است (نسخهای منتشر نشده است)، اما از آنجایی که توسعهدهندگان توزیع از قبل از این مشکل مطلع شده بودند، اکثر توزیعها بهروزرسانی را همزمان با افشای اطلاعات مربوط به آسیبپذیری منتشر کردند. این مشکل در RHEL 6/7/8، Debian، Ubuntu، openSUSE، SUSE، Fedora، ALT Linux، ROSA، Gentoo، Void Linux، Arch Linux و Manjaro برطرف شده است. به عنوان یک اقدام موقت برای مسدود کردن آسیبپذیری، میتوانید پرچم ریشه SUID را از برنامه /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec") حذف کنید.
منبع: opennet.ru