از دانلود ناموفق یک ISO تا اکسپلویت کرنل: کشف باگ پنهان DMA در سختافزار رهاشده — Wanted to download an ISO, ended up writing a kernel exploit
خلاصه
تلاشی ساده برای دانلود یک فایل حجیم، به کشف خطای مرگبار همگامسازی حافظه کش با DMA در چیپستهای ARM منجر شد. یک توسعهدهنده پس از مواجهه با خطای اعتبارسنجی در TLS، برای خاموشکردن قابلیت معیوب شتابدهنده شبکه، کرنل اکسسپوینت رهاشده خود را اکسپلویت کرد.
همه چیز از یک ماجرای روزمره شروع شد: دانلود فایلهای چند گیگابایتی و سینک کردن اطلاعات با rsync از طریق Wi-Fi مدام با خطاهای عجیب یکپارچگی داده (MAC errors در SSH و TLS) متوقف میشد. تحلیل اولیه با tcpdump نشان میداد بستههای TCP با چکسام کاملاً معتبر به سیستم میرسند، اما به شکل عجیبی حاوی ۶۴ بایت دادهٔ خراب هستند؛ خطایی که لایه TCP آن را نادیده میگرفت ولی لایههای امنیتی بالاتر مثل TLS و SSH اتصال را به دلیل دستخوردگی داده قطع میکردند.
معمای ۶۴ بایت خراب: وقتی سختافزار دروغ میگوید
بررسی دقیقتر روی ترافیک شبکه نشان داد اندازه بخش خرابشده دقیقاً ۶۴ بایت است؛ یعنی دقیقاً اندازه یک خط کش (Cache line) در پردازندههای معماری ARM. این نشانه، فرضیه خطاهای معمول شبکه را رد میکرد و انگشت اتهام را مستقیماً به سمت سختافزار اکسسپوینت و مدیریت حافظه میبرد.
در معماریهای x86، همگامسازی میان حافظه کش پردازنده و DMA سختافزاری بهصورت خودکار (Coherent) توسط پردازنده مدیریت میشود، اما در پردازندههای ARM معمولاً سختافزار Non-coherent است؛ یعنی وظیفه سیستمعامل و درایور است که پیش از ارسال یا پس از دریافت داده توسط کارت شبکه، کش پردازنده را Invalidate یا Clean کنند.
بررسی کد درایور qca-nss-dp کوالکام روی چیپ IPQ9574 اکسسپوینت EAP770 نشان داد که درایور برای بهبود پرفورمنس، بافرهای بسته (skb) را پس از ارسال بازیافت میکند و بدون باطل کردن (Invalidation) خطوط کش، آنها را برای دریافت بستههای جدید به کار میگیرد. در نتیجه، خط کش کثیف مانده از عملیات قبلی، در DRAM بازنویسی میشد و دیتای تازهرسیده از کارت شبکه را مخدوش میکرد. بدتر از همه این که موتور شتابدهنده سختافزاری شبکه کوالکام (SFE/PPE) چکسام TCP را بعد از این تخریب بازتولید میکرد، در نتیجه بستههای ناقص با چکسام ریاضی کاملاً درست به کلاینت تحویل داده میشدند.
محصولی که پیش از استاندارد نهایی به پایان عمر رسید
اکسسپوینت TP-Link EAP770 v1 جزو اولین موج تجهیزات پیش از استاندارد نهایی Wi-Fi 7 بود. پشتیبانی تیپیلینک در پاسخ به پیگیریهای نویسنده اعلام کرد نسخه ۱ این دستگاه عملاً به وضعیت پایان عمر (EOL) رسیده و هیچ بهروزرسانی فرموری برای آن منتشر نخواهد شد.
تنها راه نجات این اکسسپوینت گرانقیمت، غیرفعالکردن شتابدهنده سختافزاری کوالکام از طریق دستکاری دو متغیر در sysfs بود:
echo 0 > /sys/sfe/l2_feature
echo 0 > /sys/sfe/ppe_rfs_feature
مشکل اینجا بود که شل SSH دستگاه با سطح دسترسی محدود (uid 1) قفل شده بود و امکان تغییر این تنظیمات فقط برای حساب root فراهم بود.
باز کردن قفل با اکسپلویت هسته لینوکس
برای کسب دسترسی روت بدون دسترسی به فریمور جدید، نویسنده به سراغ اکسپلویت آسیبپذیری معروف CVE-2022-0185 (یک باگ سرریز زیرین عدد صحیح در legacy_parse_param) در کرنل ۵.۴ دستگاه رفت. او با تلفیق این باگ با تکنیکهای دستکاری pipe-buffer زنجیره حملهای ساخت که:
- حافظه ۴ کیلوبایتی Slab را بهدقت چیدمان (Grooming) کرد.
- متادیتاهای ساختارهای پایپ را دستکاری نمود تا به نوشتن دلخواه در حافظه فیزیکی برسد.
- مسیر باینری کمکی کرنل یعنی
modprobe_pathرا در حافظه پیدا و بازنویسی کرد.
با اجرای یک فایل ناشناخته، کرنل لینوکس باینری دلخواه نویسنده را با سطح دسترسی کاربر ریشه فراخوانی کرد و توانست ویژگی معیوب سختافزار را خاموش کند؛ بدون اینکه سیستمعامل دچار Kernel Panic شود.
چرا این گزارش برای مهندسان اهمیت دارد؟
این بررسی دو درس کلیدی به همراه دارد: اول، خطر کلاس باگهای مربوط به عدم همگامسازی کش در درایورهای لینوکس هنگام جابهجایی از x86 به معماریهای ARM (نویسنده متوجه شد دستکم ۱۳ درایور دیگر در کرنل چنین رفتاری دارند). دوم، بحث کیفی و اخلاقی صنعت پیرامون رها کردن سریع سختافزارهای تجاری توسط فروشندگان. در بحثهای Hacker News، کاربران با انتقاد از چرخه پشتیبانی کوتاهمدت تولیدکنندگانی مثل TP-Link، مجدداً به اهمیت استفاده از فریمورهای متنباز مانند OpenWrt برای تضمین طول عمر تجهیزات شبکه اشاره کردند.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل