سال گذشته برای نخستین بار در دنیای امنیت، دو آسیبپذیری سختافزاری به نامهای Meltdown و Spectre معرفی شدند که سختافزار مورد هدف آنها، پردازندههای شرکت اینتل (Intel) بود.
در تاریخ 14 مه 2019، اینتل و گروهی از محققان پس از یک سال تحقیق و کشف حفرههای امنیتی مختلف، جزییاتی را از ۴ حملهی جدید در رابطه با پردازندههای اینتل (پردازندههای نسل هشتم و نهم Intel® CoreTM و نسل دوم پردازندههای Intel® Xeon® Scalable) منتشر کردند که مهاجم بهوسیلهی آنها قادر است از فرآیند speculated execution (اجرای گمانهای) برای استخراج دادههای مهمی همچون دادههای ورود به یک وبسایت، کلیدهای ذخیره شده روی مرورگر برای اتصال به یک سایت، رمزهای عبور و… استفاده کند. این حملات تنها محدود به کامپیوترهای شخصی نشده و میتوانند دادههای ابری را نیز تحت تاثیر قرار دهند.
محققان نام این دسته از حملات را (Microarchitectural Data Sampling (MDS گذاشتند که در دستهی حملات Meltdown ،Spectre و Foreshadow قرار میگیرند، تنها با این تفاوت که در این حملات از بخشهای دیگری از پردازنده برای انجام حمله استفاده میشود.
چهار دسته از حملات MDS کشف شده توسط محققان عبارتاند از:
- MDS store buffer : حملات (Fallout (CVE-2018-12126
- (load port (CVE-2018-12127
- fill buffer: حملات RIDL و Zombieload attack (CVE-2018-12130)
- (uncacheable memory (CVE-2019-11091
از میان این چهار حمله، Zombieload attack خطرناکتر معرفی شده چراکه قادر است تا دادههای بیشتری را نسبت به سایر این حملات بازیابی کند.
تاکنون هیچ شواهدی بر انجام گستردهی این حملات ارایه نشده اما بااینحال ضرورت توجه به آسیبپذیریها و چگونگی جلوگیری از بروز چنین حملاتی امری ضروری است. در این مطلب سعی شده تا توضیحی مختصر در رابطه با چگونگی عملکرد این حملات داده شود. همچنین در انتهای آن لینکهایی به صفحات راهنمای شرکتهایی که برای جلوگیری از بروز این دسته از حملات، وصلههای امنیتی ارایه کردهاند، بیان شده است. شما میتوانید با مراجعه به این صفحات و دریافت وصلههای امنیتی، سیستم خود را از این حملات حفظ کنید.
معماری پردازندههای اینتل
برای آشنایی با این حملات ابتدا نیاز است تا آشنایی مختصری با ساختار معماری پردازندههای اینتل داشت. پردازشگرها (CPU) دارای حافظه داخلی اندکی هستند که به آن cache گفته میشود. CPU از cache برای کپی دادههای دریافتی از حافظه خارجی (RAM) و افزایش سرعت پردازش دادهها (از طریق نیاز به مراجعات کمتر به حافظه خارجی) استفاده میکند. معماری Cacheها در پردازنده معمولن به شکل سلسله مراتبی است که بسته به نوع معماری، یک پردازنده میتواند دارای چند سطح cache باشد.
نزدیکترین حافظهی cache به پردازنده، سطح 1 یا L1 (Level 1) خطاب شده که بهازای هر هسته به شکل جداگانه طراحی میشود. سایر سطوح cacheها بسته به نوع معماری و طراحی CPU میتوانند بهشکل اشتراکی میان تمام هستهها مورد استفاده قرار گیرند. هرچه سطوح cache افزایش یابد، سرعت کاهش مییابد ولی از سوی دیگر میزان حجم کلی cache پردازنده افزایش مییابد.
در پردازشگرهای مدرن، نتایج حاصل از پردازشها تا زمانی که نیازی به آزادسازی فضا نباشد، در سطوح مختلف cache باقی میمانند تا با این روش زمان دسترسی به دادهها کاهش پیدا کند.
چگونگی عملکرد فرآیند Speculated Execution
فرآیند speculated execution در پردازندههای اینتل، از دادههای ذخیره شده در سطوح مختلف cache برای حدس عمل بعدی که باید انجام شود استفاده میکند. برای نمونه تصور کنید قطعه کدی با مضمون «آیا زمین گرد است؟» اجرا میشود. پاسخ این پرسش ممکن است در RAM ذخیره شود و از سوی دیگر قبلن نیز این کد توسط CPU پردازش شده باشد. در این حالت CPU بهجای مراجعه به RAM و دریافت این داده، از همان جوابی که قبلن به این پرسش داده است و در cache خود دارد (مثلن زمین گرد است) استفاده میکند و تا زمان بارگذاری دادهها از RAM، این جواب را بهعنوان پاسخ صحیح برای این کد در نظر گرفته و به سراغ پردازش دستورات بعدی میرود. اگر بعد از load دادهها از RAM، پاسخ حدسی CPU درست باشد، آنچه دریافت شده پردازش نشده و به این ترتیب سرعت پردازش دستورات نیز بهطور چشمگیری افزایش مییابد.
اما اگر پاسخ حدسی CPU اشتباه باشد، پاسخ حدس زدهی خود را نادیده گرفته و نتایج صحیح را پردازش میکند. تمام این اعمال تحت حالت microarchitecture اتفاق میافتد. نکتهی حایز اهمیت در رابطه با این فرآیند آن است که، هرچند نتایج حدسی از جانب CPU نادیده گرفته میشود اما ممکن است منجر به ذخیرهی این اطلاعات در cache پردازشگر شود.
چگونگی عملکرد Microarchitectural Data Sampling (MDS)
در حملات MDS برخلاف حملات Meltdown بهجای نشت دادهها از cache، نشت دادهها از طریق بافرهای مختلف داخل پردازنده انجام میشود. به عبارت بهتر، مهاجم در این حملات بهجای استفاده از دادههای قدیمی موجود در cache، از دادههای قدیمی موجود در بافرهای پردازنده استفاده میکند.
پردازندههای اینتل از تعدادی بافر مخصوص برای انتقال دادهها در سطوح داخلی cache استفاده میکنند. برای نمونه از (line fill buffer (LFB برای بارگذاری دادهها در L1 cache استفاده میشود. بهطور مشابه هنگام نوشته شدن دادهای روی RAM، این داده بهطور موقت روی store buffer ذخیره میشود. یک بافر دیگر، load ports است که از آن برای کپی دادهها هنگام انتقال از حافظه به register استفاده میشود.حملات MDS بسته به نوع، یکی از این سه بافر را مورد حمله قرار میدهند.
انواع مختلف حملات MDS
- MDS Store buffer: حمله Fallout
همانطور که پیشتر شرح داده شد، از store buffer برای ذخیرهی موقت دادهها پیش از نوشته شدن در RAM استفاده میشود. گاهی از دادههای قدیمی موجود در store buffer در فرآیند load استفاده شده و مهاجم میتواند با کمک یک فایل مخرب ساختگی، این دادهها را capture کند.
در حالتی دیگر، چون store buffer میان threadهای فعال یک هستهی فیزیکی تقسیمبندی میشود، یک thread فعال میتواند به دادههای store buffer اختصاص یافته به thread دیگری در حالت sleep، دسترسی یابد و زمانی که thread در حالت sleep فعال شود، store buffer مجددن به آن اختصاص مییابد. به این ترتیب مهاجم میتواند دادههای ذخیره شده بر روی store buffer مربوط به سایر برنامهها، containerها، سیستمعامل و یا حتا سایر ماشینهای مجازی در حال اجرا بر روی threadای یکسان را مانیتور کند.
حملهی fallout از این آسیبپذیری برای bypass فرآیند Kernel Address Space Layout Randomization (KASLR) و همچنین نشت دادههای نوشته شده توسط کرنل روی حافظه استفاده میکند.
- MDS fill buffer: حملهی RIDL و Zombieload attack
از fill buffer برای ذخیرهی دادهها در سطح اول (cache (L1 استفاده میشود. هنگام خواندن دادهها از RAM، پردازنده سطح یک cache خود را بررسی میکند تا مطمین شود که آن داده در این سطح از cache، از قبل ذخیره نشده است. اگر دادهی مورد جستجو در این سطح از cache نباشد، درخواستی را برای RAM برای دریافت آن ارسال میکند. این مقدار قبل از ذخیره شدن روی cache ابتدا به LFB منتقل میشود.
در این حمله نیز مهاجم میتواند دادههای قدیمی موجود در این بافر را مانیتور کند. اما تفاوت آن با حملهی MDS store buffer در این است که برخلاف store buffer، دو thread بر روی یک هستهی فیزیکی مشترک، از fill buffer بهصورت اشتراکی و بدون تقسیمبندی استفاده میکنند. بنابراین اگر یکی از این threadها مربوط به برنامهای مخرب باشد، میتواند بهراحتی به دادههای موجود در fill buffer که مرتبط با thread دیگر است، دسترسی پیدا کند. در این حمله نمیتوان بهشکل کامل از مانیتور دادههای fill buffer توسط یک thread جلوگیری کرد.
در حملهی (Rogue In-Flight Data Load (RIDL مهاجم با استفاده از این آسیبپذیری، کد مخرب خود را توسط منابع ابری، سایتهای مخرب و یا تبلیغات اینترنتی اجرا کرده و اقدام به سرقت دادهها میکند.
در حملهی ZombieLoad، برنامهی مخرب مهاجم با استفاده از این آسیبپذیری میتواند به دادههای حساسی همچون تاریخچهی مرورگر، محتوای وبسایت، کلیدهای کاربر، رمزهای عبور و… دست پیدا کند. این حمله علاوهبر سیستمهای شخصی میتواند ماشینهای مجازی و فضاهای ابری را نیز تهدید کند.
چون نمیتوان از حملات cross-thread بهشکل کامل جلوگیری کرد، برای پیشگیری از بروز چنین حملهای در برخی موارد نیاز به غیرفعالسازی کامل تکنولوژی Hyper-Threading اینتل است.
- حمله MDS load port
پردازشگر از load port در فرآیند load دادهها میان memory یا واحد ورودی/خروجی (i/o) و register استفاده میکند. دو thread روی یک هستهی فیزیکی بهشکل داینامیک و اشتراکی میتوانند از load port استفاده کنند. مشابه حملات MDS fill buffer، در اینجا نیز اگر یکی از threadها مربوط به برنامه مخرب مهاجم باشد، بهراحتی میتواند به دادههای مربوط به thread دیگر روی load port دسترسی پیدا کند.
- حمله MDS Uncacheable Memory
دادههای Uncacheable memory توسط RAM پشتیبانی نشده و در cache پردازشگر نیز ذخیره نمیشوند. اما از آنجاییکه این دادهها از fill buffer، store buffer و load port و همچنین فرآیند load در هنگام دسترسی به حافظه عبور میکنند، میتوانند مورد سواستفاده قرار گیرند.
کاربرد محدود
علت نامگذاری این حملات با عنوان sampling attack، بهدلیل پیچیدگی آنهاست. چراکه مهاجم برای بهدست آوردن اطلاعات قابل استفاده باید بارها و بارها دادههای قدیمی موجود در بافرها را تجزیهوتحلیل و نمونهبرداری کند.
این پیچیدگی و سختی پیادهسازی و همچنین عدم کنترل کامل مهاجم بر بافرها سبب شده تا این حملات نتوانند به شکل صددرصد به دادههای حساس دست یافته و کاربردی گسترده داشته باشند. به همین دلیل اینتل این حملات را جز دسته حملات با ریسک کم تا متوسط دستهبندی کرده است.
راههای جلوگیری و وصلههای امنیتی
یکی از روشهای پیشنهادی اینتل برای جلوگیری از حملات MDS، پاکسازی ساختار microarchitectural به یکی از این دو روش زیر است:
- عملکرد MD_CLEAR
- software sequences
در روش نخست، توسعهدهندگان میتوانند با استفاده از دستور VERW یا فرمان L1D_FLUSH پردازشگر را ملزم به بازنویسی مقادیر بافر گردانند.
توصیهی دیگر اینتل، غیرفعالسازی تکنولوژی (Hyper-Threading (یا Simultaneous Multi-Threading (SMT) است. برای اطلاعات دقیقتر در رابطه با این توصیههای امنیتی میتوانید به راهنمای اینتل در این زمینه مراجعه کنید.
علاوهبر این، با معرفی این حملات، شرکتهایی همچون Apple، Microsoft، Google و Redhat و Ubuntu نیز بلافاصله patchهایی را در این زمینه ارایه کردهاند. شاید بتوان اینگونه بیان کرد که بهترین عمل در حال حاضر برای مصون نگه داشتن سیستم خود از این حملات، دریافت و نصب این وصلههای امنیتی متناسب با نوع سیستمعامل و پردازشگر است.