یک آسیبپذیری در هسته لینوکس (CVE-2022-0847) شناسایی شده است که امکان بازنویسی محتویات کش صفحه را برای هر فایلی، از جمله آنهایی که در حالت فقط خواندنی هستند، با پرچم O_RDONLY باز میشوند، یا در سیستمهای فایل نصب شده در آن قرار دارند، میدهد. حالت فقط خواندنی از جنبه عملی، این آسیبپذیری میتواند برای تزریق کد به فرآیندهای دلخواه یا دادههای خراب در فایلهای باز شده استفاده شود. به عنوان مثال، می توانید محتویات فایل authorized_keys را برای فرآیند sshd تغییر دهید. یک نمونه اولیه برای آزمایش در دسترس است.
این مشکل با نام رمز Dirty Pipe، به قیاس با آسیبپذیری بحرانی Dirty COW که در سال 2016 شناسایی شد، داده شد. خاطرنشان می شود که Dirty Pipe از نظر خطر در سطح Dirty COW قرار دارد، اما کارکرد آن بسیار آسان تر است. این آسیبپذیری در تجزیه و تحلیل شکایات مربوط به آسیبهای دورهای به فایلهای دانلود شده از طریق شبکه در سیستمی شناسایی شد که بایگانیهای فشردهشده را از یک سرور گزارش دانلود میکند (۳۷ آسیب در ۳ ماه در یک سیستم بارگذاری شده)، که با استفاده از عملیات splice() تهیه شده بود. و لوله های بی نام
این آسیب پذیری از زمانی که هسته لینوکس 5.8 که در آگوست 2020 منتشر شد، آشکار شده است. در دبیان 11 وجود دارد اما بر هسته پایه در اوبونتو 20.04 LTS تأثیر نمی گذارد. هستههای RHEL 8.x و openSUSE/SUSE 15 در اصل بر اساس شاخههای قدیمی هستند، اما ممکن است تغییری که باعث ایجاد مشکل شده است به آنها گزارش شده باشد (هنوز اطلاعات دقیقی وجود ندارد). میتوانید انتشار بهروزرسانیهای بسته در توزیعها را در این صفحات دنبال کنید: Debian، SUSE، Ubuntu، RHEL، Fedora، Gentoo، Arch Linux. اصلاحی برای این آسیبپذیری در نسخههای 5.16.11، 5.15.25 و 5.10.102 پیشنهاد شده است. این اصلاح همچنین در هسته مورد استفاده در پلتفرم اندروید گنجانده شده است.
این آسیبپذیری به دلیل عدم مقداردهی اولیه buf->flags در کد توابع copy_page_to_iter_pipe() و push_pipe() ایجاد میشود، علیرغم این واقعیت که هنگام تخصیص ساختار، حافظه پاک نمیشود. دستکاری با لوله های بدون نام، "buf-> flags" ممکن است حاوی مقداری از عملیات دیگر باشد. با استفاده از این ویژگی، یک کاربر محلی غیرمجاز میتواند به ظاهر مقدار PIPE_BUF_FLAG_CAN_MERGE در پرچم دست یابد، که به شما امکان میدهد دادهها را در حافظه پنهان صفحه بازنویسی کنید و به سادگی با نوشتن دادههای جدید در یک لوله (لوله) بینام مخصوص آمادهشده، دادهها را بازنویسی کنید.
برای حمله، فایل هدف باید قابل خواندن باشد، و از آنجایی که هنگام نوشتن در یک لوله، حقوق دسترسی بررسی نمیشود، میتوان حافظه پنهان صفحه را جایگزین کرد، از جمله برای فایلهایی که در پارتیشنهای نصب شده فقط خواندنی قرار دارند (مثلاً برای فایلهای c سی دی رام). پس از جایگزینی اطلاعات در کش صفحه، هنگام خواندن داده ها از فایل، نه داده های واقعی، بلکه داده های جایگزین شده را دریافت می کند.
عملیات به ایجاد یک لوله بدون نام و پر کردن آن با داده های دلخواه برای رسیدن به تنظیم پرچم PIPE_BUF_FLAG_CAN_MERGE در تمام ساختارهای حلقه مرتبط با آن خلاصه می شود. سپس، دادهها از لوله خوانده میشوند، اما پرچم در تمام نمونههای ساختار pipe_buffer در ساختارهای حلقه pipe_inode_info تنظیم میشود. سپس یک فراخوانی splice() برای خواندن دادهها از فایل مورد نظر در یک لوله بینام، با شروع افست مورد نیاز، انجام میشود. هنگامی که داده ها در این لوله بی نام نوشته می شود، پرچم PIPE_BUF_FLAG_CAN_MERGE به جای ایجاد یک نمونه جدید از ساختار pipe_buffer، داده ها را در حافظه پنهان صفحه بازنویسی می کند.
منبع: opennet.ru