۱. مقدمه
آسیبپذیری CVE-2024-53141 در هسته لینوکس (Linux Kernel)، زیرسامانه Netfilter و ماژول ipset، ناشی از فقدان بررسی محدوده (Missing Range Check) در تابع bitmap_ip_uadt میباشد. این نقص زمانی رخ میدهد که ویژگی IPSET_ATTR_IP_TO وجود نداشته باشد، اما IPSET_ATTR_CIDR تعریف شده باشد؛ در این شرایط، مقادیر ip و ip_to جابهجا شده و بررسی محدوده ورودی بهدرستی انجام نمیشود. در نتیجه، مهاجم محلی دارای سطح دسترسی لازم میتواند با ارسال ورودیهای دستکاریشده، دسترسی خارج از محدوده حافظه (Out-of-Bounds Access) را ایجاد کرده و بهطور بالقوه محرمانگی، یکپارچگی و دسترسپذیری سیستم را تحت تأثیر قرار دهد. این آسیبپذیری دارای شدت بالا (High) و امتیاز CVSS 3.1 برابر با 7.8 است.
۱.۱ خلاصه ای از مشخصات CVE
بر اساس آخرین قوانینkernelCTF، مؤلفه nftables در زیرسیستم Netfilter غیرفعال است. با این حال، برخی مؤلفه های Netfilter مانند ipset همچنان به صورت پیش فرض فعال هستند. آسیب پذیری CVE-2024-53141 یک آسیب پذیری دسترسی خارج از محدوده (Out-of-Bounds Access) است که در جریان kernelCTF مورد بهره برداری قرار گرفته است. اصلاح این آسیب پذیری در این commit انجام شده است. در این نوشته، علت ریشه ای (Root Cause) آسیب پذیری و نحوه بهره برداری از آن را تحلیل خواهم کرد.
ابزار ipset در Netfilter برای مدیریت مجموعه هایی (Sets) از آدرس های IP، شبکه ها و پورت ها استفاده می شود. این ابزار امکان گروه بندی چندین آدرس IP، محدوده (Range) یا شبکه را در قالب یک مجموعه واحد فراهم می کند تا مدیریت آن ها با کارایی بیشتری انجام شود. یا به عبارتی دیگر زیرسیستم ipset در Linux Kernel چارچوبی برای مدیریت کارآمد مجموعه هایی از آدرس های IP، شبکه ها و شماره پورت ها است که برای Packet Filtering با کارایی بالا مورد استفاده قرار می گیرد و معمولا در کنار iptables یا nftables به کار می رود.
این زیرسیستم از انواع مختلف Set پشتیبانی می کند که هر یک برای موارد استفاده متفاوت بهینه سازی شده اند؛ از جمله bitmap:ip. این نوع Set برای ذخیره سازی و جستجوی کارآمد یک محدوده پیوسته از آدرس های IPv4 با استفاده از یک ساختار داده Bitmap طراحی شده است. بر اساس اطلاعات منتشرشده در NVD، آسیبپذیری CVE-2024-53141 در هسته لینوکس با اعمال اصلاحیهای در زیرسامانه Netfilter و ماژول ipset برطرف شده است. این اصلاحیه با هدف افزودن بررسی محدوده (Range Check) ازدسترفته در تابع bitmap_ip_uadt و حذف بررسیهای غیرضروری انجام شده است.
هنگامی که ویژگی tb[IPSET_ATTR_IP_TO] وجود ندارد، اما ویژگی tb[IPSET_ATTR_CIDR] موجود است، مقادیر ip و ip_to تا حدودی جابهجا میشوند. بنابراین، بررسی محدوده (Range Check) برای ip باید در مرحله بعد انجام شود، اما این بخش از کد پیادهسازی نشده است و به نظر میرسد آسیبپذیری ناشی از همین موضوع باشد. در نتیجه، باید بررسیهای محدوده ازدسترفته اضافه شوند و بررسیهای محدوده غیرضروری حذف شوند.
۱.۱.۱ معیارها (Metricx) – CVSS V3.x
۱.۱.۲ شمارش نقاط ضعف (Weakness Enumeration)
Source | CWE Name | CWE-ID |
NIST | Insufficient Information | NVD-CWE-noinfo |
۱.۱.۳ پیکربندیهای نرمافزاری شناختهشده تحت تأثیر (Known Affected Software Configurations)
Up to (excluding) | From (including) | cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* |
Up to (excluding) | From (including) | cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* |
Up to (excluding) | From (including) | cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* |
Up to (excluding) | From (including) | cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* |
نسخههای تست شده از پلتفرم که توسط این آسیبپذیری پشتیبانی می شود:
نسخه کرنل تست شده در آزمایشگاه 6.6.62 است و روی x64 ubuntu 24.04 نصب شده است. اما بر اساس سایت nist نسخه های آسیب پذیر بیشتر است و در جدول مربوطه ذکر شده است.
سناریوی اجرا و ملزومات اجرای آسیبپذیری:
سناریو اجرا به شرح زیر است:
- پیش از هرچیز باید نسخه کرنل آسیب پذیر و سرویس های پیش نیاز نصب و راه اندازی شده باشد.
- پس از آن باید kaslr غیر فعال شود و کرنل پیش فرض در grub به نسخه آسیب پذیر تغییر داده شود.
- سپس اقدام به اجرای سرویس های مورد نظر میکنیم.
- پس از آن باید آدرس کرنل base را دستی در سورس کد تنظیم کنیم و سورس را کامپایل کنیم.
- پس از آن اکسپولیت را اجرا کرده و به ما دسترسی شل با سطح دسترسی کاربر ریشه یا روت میدهد.(در poc ها kaslr هم دارد اما در تست های انجام شده کار نکرد که برای کشف علت در نسخه سیستم عامل فوق نیازمند تحلیل جهت کشف مشکل بود که در این سند انجام نشده است.)
۱.۲ سناریوی اجرای آسیب پذیری
ما در این بخش به نحوه اجرای آسیب پذیری در محیط اجرا و شرح فایلهای ارائه شده، میپردازیم. محیطی که در بخش قبل به آن اشاره شد، کاملا آماده است. کافیست ماشین را روشن کرده و مراحل را مطابق زیر انجام دهید:
توجه: نام کاربری test و با رمز عبور 1 مشترک برای این کاربر و کاربر root است.
توجه: نسخه راهنما در دسکتاپ وجود دارد، آن را اجرا کنید و مراحل را مطابق آن انجام دهید.
- باز کردن دو ترمینال
- در ترمینال اول دستورات زیر را وارد میکنیم:
cd /home/test/CVE-2024-53141_cos_mitigation/exploit/cos-109-17800.372.31
sudo cat /proc/kallsyms | grep core_pattern
gnome-text-editor exploit.c
- پس از باز شدن سورس باید مقدار ثابت core_pattern را با بخش های hard-coded در متن عوض کنید. مطابق تصویر زیر آدرس ffffffffb786d580 را جایگزین مقادیر پیش فرض کرده و تغییرات را ذخیره میکنیم:
- سپس اقدام به کامپایل سورس میکنیم:
make exploit_org
- پس از آن دستورات و سرویسهای مورد نظر را اجرا میکنیم (اکثر دستورات آن جهت تحلیل استفاده شده است):
- حال ترمینال جدیدی باز کنید (چون این ترمینال دستورات با روت اجرا شده است، ترمینال دیگری باز میکنیم تا سطح دسترسی آن پایین باشد)
cd /home/test/CVE-2024-53141_cos_mitigation/exploit/cos-109-17800.372.31
whoami
id
- با اجرای دستورات بالا مشاهده میکنیم که کاربر عادی است و سپس اقدام به اجرای دستورات زیر جهت اجرای PoC و تست آن خواهیم کرد:
./exploit_org
whoami
id
۱.۳ تحلیل آسیب پذیری
۱.۳.۱ تحلیل آسیب پذیری و علت وقوع آن
در ادامه ما ترجمه دو سند تحلیلی از دو محقق را ارائه خواهیم کرد:
مقاله اول:
۱.۳.۱.۱ مرور کلی
ابزار ipset در Netfilter برای مدیریت مجموعه هایی (Sets) از آدرس های IP، شبکه ها و پورت ها استفاده می شود. این ابزار امکان گروه بندی چندین آدرس IP، محدوده (Range) یا شبکه را در قالب یک مجموعه واحد فراهم می کند تا مدیریت آن ها با کارایی بیشتری انجام شود.
پردازه ها می توانند از طریق NETLINK با ipset تعامل داشته باشند. دستورات پشتیبانی شده و Handlerهای مربوط به آن ها در متغیر ip_set_netlink_subsys_cb[] تعریف شده اند. برای استفاده از ipset، ابتدا باید با استفاده از دستور IPSET_CMD_CREATE یک مجموعه ایجاد کنید. پس از ایجاد مجموعه، می توانید با استفاده از دستور IPSET_CMD_ADD آدرس های IP جدیدی را به آن اضافه کنید.
static const struct nfnl_callback ip_set_netlink_subsys_cb[IPSET_MSG_MAX] = {
// [...]
[IPSET_CMD_CREATE] = { // [1]
.call = ip_set_create,
.type = NFNL_CB_MUTEX,
.attr_count = IPSET_ATTR_CMD_MAX,
.policy = ip_set_create_policy,
},
// [...]
[IPSET_CMD_ADD] = { // [2]
.call = ip_set_uadd,
.type = NFNL_CB_MUTEX,
.attr_count = IPSET_ATTR_CMD_MAX,
.policy = ip_set_adt_policy,
},
// [...]
};


