LoongLeak: نشت داده از کش پردازندههای Loongson
خلاصهٔ کاملتر
تیمی از محققهای CISPA حملهای به اسم LoongLeak رو معرفی کردن که پردازندههای Loongson 3A5000 و 3A6000 رو هدف میگیره. این پردازندهها روی معماری اختصاصی LoongArch کار میکنن و بیشتر توی بازار داخلی چین، از جمله بخشهای دولتی و اداری، استفاده میشن. به گفتهٔ محققها یه برنامهٔ کاملاً بدون دسترسی ویژه میتونه محتوای کش L1 داده رو بخونه، از جمله چیزی که مال پروسههای دیگه یا خود سیستمعامله.
ریشهٔ ماجرا دستور FLD.S هست که ۳۲ بیت از حافظه میخونه و توی یه رجیستر شناور میذاره. توی خود مستندات LoongArch نوشته شده ۳۲ بیت بالای رجیستر بعد از این دستور «نامعین» میمونه. افزونهٔ برداری LASX همین رجیسترها رو تا ۲۵۶ بیت بزرگ میکنه، پس ۲۲۴ بیت یا همون ۲۸ بایت دادهٔ نامعین میمونه. بررسی تیم نشون داده اون دادهٔ نامعین از کش L1 میاد و مهاجم میتونه با آماده کردن وضعیت داخلی پردازنده، نشت رو روی یه cache set مشخص هدف بگیره.
برای نشون دادن خطر دو نمونهٔ عملی ساختن. توی اولی روی 3A5000، وسط انکود ویدیو با ffmpeg مقدار stack canary (یعنی همون عدد نگهبان که سرریز بافر رو لو میده) رو از حافظه بیرون کشیدن. توی دومی روی 3A6000 که هایپرثریدینگ داره و دو ترد یه کش L1 مشترک دارن، ۳۲ بایت اول ردیف root از فایل shadow سیستم شامل کل salt و ۹ بایت از هش پسورد لو رفته، که برای حملهٔ دیکشنری کافیه. به گفتهٔ خودشون توانایی مهاجم شبیه Meltdown روی سیستم پچنشدهست.
یه نکتهٔ فنی مهم اینه که LoongLeak جزو حملههای اجرای گذرا مثل Meltdown و Spectre نیست و کانال جانبی هم لازم نداره؛ داده مستقیم توی رجیسترهای برداری ظاهر میشه، پس یه باگ معماری تمامعیاره. سرعتش هم بالاست: چون فقط به بارگذاریهایی نیاز داره که به کش L1 بخورن و هر بار ۲۸ بایت بیرون میده، از ۳۰۰ مگابایت بر ثانیه رد میشه.
چون باگ سختافزاریه، آپدیت نرمافزاری خودش رو درست نمیکنه. پیشنهاد تیم اینه موقع برگشت از کرنل به فضای کاربر، کش L1 با دادهٔ بیخطر پر بشه تا چیزی حساسی توش نمونه؛ هزینهش کمه و حداکثر ۱.۴ درصد کندی اندازه گرفتن، توی بیشتر بنچمارکها زیر ۰.۱ درصد. روی 3A6000 باید یکی از دو ترد هر هسته هم خاموش بشه که جریمهٔ سنگینی داره. Loongson باگ رو تأیید و بازتولید کرده و توی ریویژن جدید 3A6000 سختافزاری درستش کرده.
نکات کلیدی:
- LoongLeak روی Loongson 3A5000 و 3A6000 اجازه میده کد بدون دسترسی ویژه محتوای کش L1 رو بخونه
- منشأ باگ بیتهای «نامعین» بالای رجیستره که بعد از FLD.S میمونه و با LASX تا ۲۸ بایت میرسه
- نرخ نشت از ۳۰۰ مگابایت بر ثانیه بیشتره؛ روی 3A5000 کل خط کش و روی 3A6000 نیمهٔ دومش در دسترسه
- یه باگ معماریه، نه حملهٔ اجرای گذرا یا کانال جانبی؛ پس پچ نرمافزاری خودش رو حذف نمیکنه
- راهکار پیشنهادی خالی کردن کش L1 موقع گذر کرنل به کاربره، با حداکثر ۱.۴ درصد افت




