CVE-2026-28952: دور زدن MIE اپل با دو باگ و یک ایده هوشمندانه
خلاصهٔ کاملتر
Memory Integrity Enforcement یا MIE جدیدترین و پیچیدهترین لایهی امنیتی هستهی اپله. سه لایه روی هم: تگگذاری سختافزاری حافظه (EMTE)، مناطق read-only برای ساختارهای حیاتی، و یه مانیتور ممتاز که هر تغییر page-table رو نظارت میکنه. ایده اینه که حتی اگر باگ وجود داشته باشه، قابل اکسپلویت نباشه. اما یه تیم سهنفره با کمک مدل هوش مصنوعی Mythos Preview آنتروپیک، در پنج روز از کل این ساختار رد شدن و به root shell رسیدن.
باگ اصلی (CVE-2026-28952) در تابع _zalloc_ro_mut بود — تنها تابعی که مجاز به نوشتن در ناحیهی RO (read-only) هستهست. این تابع قبل از کپی، باید بررسی میکرد که target + len از محدودهی مجاز خارج نشه. مشکل اینجا بود که این جمع بدون بررسی overflow انجام میشد. اگه len آنقدر بزرگ باشه که target + len از ۲^۶۴ رد بشه، نتیجه wrap میکنه و به یه عدد کوچیک تبدیل میشه — که چک امنیتی بدون مشکل ازش رد میشه. بعدش memcpy با len واقعی اجرا میشه و بایتها به ساختارهای مجاور (مثل ucred قربانی) سرریز میکنن.
ucred ساختاریه که اطلاعات هویتی یه پروسه رو نگه میداره، از جمله cr_uid که مشخص میکنه کاربر root هست یا نه. اگه مهاجم بتونه cr_uid یه پروسه رو از ۵۰۱ به ۰ تغییر بده، اون پروسه root میشه — بدون هیچ code injection یا ROP. همین کافیه. جالبتر اینکه هیچکدوم از محافظهای MIE فعال نمیشن، چون تابع مجاز داره مینویسه، تگها درسته، و page-table هم موقتاً writable شده — دقیقاً همونطور که طراحی شده بود.
- add x10, x8, x4 ; UNCHECKED target + len ← the bug
- cmp x10, x9
- b.lo write ; wrapped end < aligned_fp → straight to writer
- adds x9, x8, x4 ; overflow detection, runs LATE
+ mrs x10, TPIDR_EL1 ; per-CPU pointer
+ adds x9, x8, x4 ; target + len, runs FIRST
+ b.hs per_cpu_check
+ ccmp x9, x11, #0x0, hs ; NEW: target+len vs per-CPU lower
+ ccmp x9, x10, #0x2, hs ; NEW: target+len vs per-CPU upperاصلاح اپل در macOS 26.5 دقیقاً دو دستورالعمل اضافه کرد: چک overflow رو به اول تابع منتقل کرد، یه محدودهی per-CPU اضافه کرد، و اون چک معیوب stack-area رو کلاً حذف کرد. این باگ روی تمام نسخههای Sonoma و iOS 17 به بعد وجود داشته — سه سال. روی M5/A19 یه MIE bypass کامله؛ روی سیلیکونهای قدیمیتر یه local privilege escalation خطرناکه.
اما نکتهی مهم اینه که این پچ فقط این باگ رو میبنده، نه کلاس مشکل رو. تابعهای مشابه دیگهای مثل _zalloc_ro_mut_atomic یا mutator های codesigning و sandbox هنوز همون بررسیهای قبلی رو دارن. بین slot های RO-zone هیچ canaryای اضافه نشده. و API هنوز بهشکلی طراحیه که caller میتونه مستقیماً پوینتر target بده. یعنی محققین امنیتی میتونن دنبال باگهای همخانواده بگردن.
نکات کلیدی:
- MIE قویترین لایه امنیتی هستهی یه OS مصرفیه، اما یه integer overflow ساده در تنها writer مجاز، کل زنجیره رو دور زد
- باگ در _zalloc_ro_mut بود: overflow detection دیر اجرا میشد و مقدار wrapped از چک رد میشد
- اکسپلویت نهایی cr_uid یه ucred همسایه رو به صفر تبدیل میکنه — بدون هیچ نیازی به code injection
- پچ دو دستور ARM64 اضافه کرد: overflow check به اول تابع منتقل شد و محدوده per-CPU اضافه شد
- کلاس مشکل باقیه: سایر writer های RO-zone هنوز بررسی نشدن
- دستگاههاتون رو آپدیت کنید؛ همهی نسخههای iOS 17+ و macOS Sonoma+ آسیبپذیر بودن




