محققان امنیتی Qualys جزئیات دو آسیبپذیری را که بر هسته لینوکس و مدیر سیستم سیستمد تأثیر میگذارد، فاش کردهاند. یک آسیب پذیری در هسته (CVE-2021-33909) به کاربر محلی اجازه می دهد تا از طریق دستکاری دایرکتوری های بسیار تو در تو، به اجرای کد با حقوق ریشه دست یابد.
خطر آسیبپذیری با این واقعیت تشدید میشود که محققان توانستند اکسپلویتهای کاری را آماده کنند که روی Ubuntu 20.04/20.10/21.04، Debian 11 و Fedora 34 در پیکربندی پیشفرض کار میکنند. خاطرنشان می شود که توزیع های دیگر آزمایش نشده اند، اما از نظر تئوری نیز مستعد این مشکل هستند و می توانند مورد حمله قرار گیرند. کد کامل اکسپلویتها پس از رفع مشکل در همه جا منتشر میشود، اما در حال حاضر فقط یک نمونه اولیه از عملکرد محدود موجود است که باعث از کار افتادن سیستم میشود. این مشکل از ژوئیه 2014 وجود داشته است و از نسخه 3.16 بر انتشار هسته تأثیر می گذارد. رفع آسیب پذیری با انجمن هماهنگ شد و در 19 جولای در هسته پذیرفته شد. توزیعهای اصلی قبلاً بهروزرسانیهایی را برای بستههای هسته خود ایجاد کردهاند (Debian، Ubuntu، Fedora، RHEL، SUSE، Arch).
این آسیبپذیری ناشی از عدم بررسی نتیجه تبدیل size_t به int قبل از انجام عملیات در کد seq_file است که فایلها را از دنبالهای از رکوردها ایجاد میکند. عدم بررسی ممکن است منجر به نوشتن خارج از محدوده در بافر هنگام ایجاد، نصب و حذف یک ساختار دایرکتوری بسیار تو در تو (اندازه مسیر بیشتر از 1 گیگابایت) شود. در نتیجه، یک مهاجم میتواند به یک رشته 10 بایتی "//حذف شده" که با افست "-2 گیگابایت - 10 بایت" نوشته شده است، به ناحیه ای که بلافاصله قبل از بافر اختصاص داده شده اشاره می کند، دست یابد.
اکسپلویت آماده شده برای کار به 5 گیگابایت حافظه و 1 میلیون inode رایگان نیاز دارد. این اکسپلویت با فراخوانی mkdir() برای ایجاد سلسله مراتبی از حدود یک میلیون زیرشاخه برای دستیابی به اندازه مسیر فایل بیش از 1 گیگابایت کار می کند. این دایرکتوری از طریق bind-mount در یک فضای نام کاربری جداگانه نصب می شود، پس از آن تابع rmdir() برای حذف آن اجرا می شود. به طور موازی، یک رشته ایجاد می شود که یک برنامه کوچک eBPF را بارگذاری می کند، که در مرحله پس از بررسی شبه کد eBPF، اما قبل از کامپایل JIT آن مسدود می شود.
در فضای نام کاربری غیرمجاز، فایل /proc/self/mountinfo باز میشود و نام مسیر طولانی دایرکتوری bind-mounted خوانده میشود و در نتیجه قبل از شروع بافر، رشته "//deleted" در ناحیه نوشته میشود. موقعیت برای نوشتن خط به گونه ای انتخاب می شود که دستور را در برنامه eBPF که قبلاً آزمایش شده اما هنوز کامپایل نشده است، بازنویسی کند.
در مرحله بعد، در سطح برنامه eBPF، نوشتن خارج از بافر کنترل نشده از طریق دستکاری ساختارهای btf و map_push_elem به توانایی کنترل شده برای خواندن و نوشتن در ساختارهای هسته دیگر تبدیل می شود. در نتیجه، اکسپلویت مکان بافر modprobe_path[] را در حافظه هسته تعیین میکند و مسیر «/sbin/modprobe» را در آن بازنویسی میکند، که به شما امکان میدهد در صورت بروز مشکل، هر فایل اجرایی با حقوق ریشه را شروع کنید. درخواست_module() که برای مثال هنگام ایجاد سوکت نت لینک اجرا می شود.
محققان راهحلهای متعددی را ارائه میکنند که فقط برای یک سوءاستفاده خاص مؤثر هستند، اما خود مشکل را برطرف نمیکنند. توصیه میشود «/proc/sys/kernel/unprivileged_userns_clone» را روی 0 برای غیرفعال کردن دایرکتوریهای نصب در یک فضای نام کاربری جداگانه، و «/proc/sys/kernel/unprivileged_bpf_disabled» را روی 1 برای غیرفعال کردن بارگیری برنامههای eBPF در هسته تنظیم کنید.
قابل توجه است که در حین تجزیه و تحلیل یک حمله جایگزین شامل استفاده از مکانیزم FUSE به جای bind-mound برای نصب دایرکتوری بزرگ، محققان با آسیبپذیری دیگری (CVE-2021-33910) مواجه شدند که بر مدیر سیستم سیستم تأثیر میگذاشت. مشخص شد که هنگام تلاش برای نصب دایرکتوری با اندازه مسیر بیش از 8 مگابایت از طریق FUSE، فرآیند تنظیم اولیه کنترل (PID1) از حافظه پشته تمام میشود و از کار میافتد، که سیستم را در حالت وحشت قرار میدهد.
مشکل این است که systemd محتویات /proc/self/mountinfo را ردیابی و تجزیه میکند، و هر نقطه اتصال را در تابع unit_name_path_escape() پردازش میکند، که عملیات strdupa() را انجام میدهد که دادهها را به جای حافظه تخصیص یافته به صورت پویا روی پشته قرار میدهد. . از آنجایی که حداکثر اندازه پشته از طریق RLIMIT_STACK محدود شده است، پردازش یک مسیر بسیار بزرگ به نقطه اتصال باعث از کار افتادن فرآیند PID1 و توقف سیستم می شود. برای حمله، می توانید از ساده ترین ماژول FUSE در ترکیب با استفاده از یک دایرکتوری بسیار تو در تو به عنوان نقطه اتصال استفاده کنید که اندازه مسیر آن بیش از 8 مگابایت است.
این مشکل از زمان systemd 220 (آوریل 2015) ظاهر شده است، قبلاً در مخزن اصلی systemd رفع شده و در توزیعها (Debian، Ubuntu، Fedora، RHEL، SUSE، Arch) رفع شده است. قابل ذکر است، در نسخه systemd 248 به دلیل وجود اشکال در کد systemd که باعث می شود پردازش /proc/self/mountinfo با شکست مواجه شود، این اکسپلویت کار نمی کند. همچنین جالب است که در سال 2018، وضعیت مشابهی به وجود آمد و هنگام تلاش برای نوشتن یک اکسپلویت برای آسیبپذیری CVE-2018-14634 در هسته لینوکس، محققان Qualys با سه آسیبپذیری حیاتی در systemd مواجه شدند.
منبع: opennet.ru