روابط عمومی شرکت ایدکو (توزیعکنندهی محصولات کسپرسکی در ایران)؛ محققین مؤسسه فناوری فدرال سوئیس در زوریخ اواسط ماه جولای پژوهشی را منتشر کردند که در آن حملهای جدید شرح داده شده بود؛ حملهای که کارش اکسپلویت آسیبپذیریهای (یا شاید بهتر باشد بگوییم قابلیتهای) پردازندههای مدرن بود. این حمله Retbleed نامیده میشود و این نام هم گویی از متود دفاعی برابر نوع خاصی از حمله Spectre به نام Retpoline میآید. نویسندگان این پژوهش در اصل نشان دادند تکنیک کامپایل برنامههای آن–چیزی که پیشتر لایه محافظتی مؤثری در برابر حمله سویه دوم Spectre پنداشته میشد- یا فقط گاهی کار میکند یا اصلاً کار نمیکند. این پژوهش مانند همه کارهایی که پیشتر روی آسیبپذیریهای سطح سختافزاری در پردازندهها شده کمی پیچیده است اما در این مقاله ما طبق عادت همیشه سعی داشتهایم چندان هم وارد هزار توی مقالههای علمی نشویم و به زبان ساده ساز و کار این حمله را مورد بررسی قرار دهیم. با ما همراه باشید.
Spectre v2 چیست؟ بگذارید کمی از پیشبینی پرش[1] صحبت کنیم
بیش از چهار سال پیش –اوایل 2018- دو مقاله پژوهشی بیرون آمد که در مورد آسیبپذیریهای Spectre و Meltdown بودند. اینها آسیبپذیریهای سختافزاری بودند: بنا بر عملکرد پردازندهها این امکان وجود داشت که یک حمله احتمالی سرقت داده رخ دهد. از آن زمان به بعد چندین سویه از Spectre نیز کشف شد. محققین روشهای بیشتری نیز یافتند از حمله به رده رایجی از آسیبپذیریها: استفاده از عملکرد پیشفرض پردازنده به نام «پیشبینی پرش» برای حمله. پیشبینی پرش و اجرای فرضیِ دستورالعملها به طور قابلملاحظهای عملکرد پردازنده را ارتقا میدهد. در هر برنامهای اجرای گامهای بیشتر اغلب به نتیجهی محاسبات قبلی بستگی دارد. سادهترین نمونهاش وقتی است که کاربر پسوردی را برای دسترسی به برخی دادههای محرمانه وارد میکند. اگر پسورد درست باشد داده به کاربر نمایش داده میشود. اگر پسورد اشتباه باشد کاربر مجبور میشود دوباره تلاش کند. در سطح دستورالعملهای ساده برای سیپییو، تعبیرش میشود بررسی حقوق دسترسی برخی دادهها در RAM: اگر حقوق لازم تأیید شدند دسترسی به داده اعطا خواهد شد؛ در غیر این صورت دسترسی رد میشود.
این پردازنده میتواند میلیاردها عملکرد این چنینی را در هر ثانیه اجرا کند و گرچه وضعیتی خاص بررسی میشود اما اغلب هم بیهوده است (انتظار برای کاربر که پسورد را وارد کند یا انتظار برای بررسی حقوق دسترسی فایدهای ندارد). اما اگر از همین زمان بیهوده زودتر برای اجرای محاسباتی که بعد از محتملترین نتیجهی بررسی اتفاق میافتد استفاده کنیم چه؟ تا قبل از اینکه کاربر فرضی پسورد فرضی خود را وارد کند نتیجه محاسبه آماده شده و کاربر داده محرمانهاش را کمی سریعتر خواهد دید. اما چطور میدانید کدام بخش از کد احتمال بیشتری برای اجرا شدن دارد؟ البته که از آمار مربوط به اجراهای قبلی دستورالعملهای مشابه. اگر کاربر ما (لطفاً توجه داشته یاشید این بسیار نظری است و به شدت نمونهایست سادهشده) پسوردی را از هر ده بار نُه بار درست وارد کند میتوانیم زودتر داده محرمانهاش را آماده سازیم. اگر پسورد اشتباه باشد فقط نتایج را دور میاندازیم و کمی بیشتر زمان میخریم برای نمایش پیام خطا. نویسندگان مقاله 2018 دو سویه از حمله Spectre را شرح دادند. Variant 2 (که به "تزریق هدف پرش[2]" نیز شناخته میشود) پیشبینیکنندهی پرش را آموزش میدهد تا دستورالعملهایی را که نیاز است اجرا کند؛ مثل خواندن دادههایی که مهاجم نباید بدانها دسترسی داشته باشد.
بله، این محاسات سپس دور انداخته میشود اما نتیجهشان (دادههای بسیار حساس) موقتاً در کش یا همان حافظه نهان ذخیره میشود که از آنجا میتوان بدانها دستبرد زد. این حملهای است به شدت پیچیده. اول اینکه مهاجم باید بتواند کد را روی سیستم مورد حمله اجرا کند البته بدون مزایای مطلوب (یعنی بدون دسترسی به دادههای حساس). برای مثال کاربر میتواند متقاعد شود وبپیجی را باز کند حاوی اسکریپت آلوده در مرورگر.
دوم اینکه مهاجم روی سیستم هدف به نرمافزاری نیاز دارد که شامل کدی باشد مناسب حمله. در دایرهالمعارف محققین بدان «گجت» میگویند. این کد حمله به سیستم پیشبینی پرش آموزش میدهد تا به طور فرضی این گجت را اجرا کنند. این در نهایت دسترسی به محدودهای از مموری را که مهاجم نمیتواند بدان دسترسی داشته باشد ممکن میسازد. داده محرمانه در کش CPU قرار میگیرد؛ جایی که میتواند به روش خوانش کانال جانبی[3] بسیار کند استخراج شود –نه بیشتر از ده بیت در ثانیه.
بگذارید سادهترش کنیم: سیستم درونسازهای پیشبینی پرش پردازنده دستورالعملها را از برنامههای مختلف جدا نمیکند، و میتوان از یک برنامه استفاده کرد تا پردازنده را به صورت فرضی دستوری را که قرار نیست اجرا کند، اجرا کند. قبلاً، به نظر نمیرسید که این مشکلی ایجاد کند زیرا نرم افزار در هر صورت نمیتواند مستقیماً به دادههای موجود در حافظه پنهان پردازنده دسترسی داشته باشد. اما، همانطور که مشخص است، با خواندن کانالهای جانبی (که یک مکانیسم بسیار پیچیده است: بازسازی داده ها فقط بر اساس اطلاعات مربوط به سرعت پاسخ به درخواست های خواندن)، میتوان داده ها را استخراج کرد.
صبر کنید. Spectre سال 2018 کشف شد. یعنی تا الان باید پچ شده باشد، نه؟!
آسیبپذیریهای سختافزاری چندان هم آسان نیستند. اول از همه، حتی از این توصیف ساده واضح میتوان متوجه شد این آسیبپذیری، اگرچه قطعاً مبتنی بر سختافزار است، نیاز به شرایط خاصی در نرمافزار دارد تا بتوان آن را اکسپلویت کرد. اگر اینطور است، چرا فقط نرم افزار را پچ نمیکنید؟ انجام این کار بسیار سادهتر از ارتقاء سخت افزار است. همچنین میتوان تا حدی آسیبپذیری در پردازندهها را از طریق آپدیت میکروکد برطرف کرد. اما راه حل قطعی این مشکل را تنها در عرضه پردازندههای جدید با سخت افزار اصلاح شده میتوان یافت. در این میان، قدیمیها به طور کامل یا تا حدی آسیبپذیر هستند.
سوال دیگری وجود دارد که در زمینه تحقیقات Retbleed بسیار مهم است: هزینه پچ نرمافزاری یا سخت افزاری چقدر خواهد بود؟ هر روش "بستن" Spectre به مثابهی کاهش عملکرد است. به عنوان مثال، سیستم نسبتاً آشکار غیرمستقیم حدس و گمان محدود شاخه غیرمستقیم (IBRS) بررسیهای مجوز اضافی را در طول اجرای کدهای حدسآمیز معرفی و از دسترسی برنامههای با امتیاز پایین به دادههای بسیار حساس جلوگیری و حمله Spectre را غیرممکن میکند. اما با صدها هزار یا میلیونها بررسی از این قبیل، عملکرد CPU به طور قطع کاهش مییابد. تا کجا؟ تحقیقاتی وجود دارد که نشان میدهد مجموعه متنوعی از پچها برای Spectre در یک سیستم منجر به کاهش عملکرد تا 25٪ شده است.
و حالا نوبت به Retpoline میرسد، یک روش حفاظتی نسبتاً ساده در برابر Spectre که توسط مهندسین Google پیشنهاد شده و در طول کامپایل نرم افزار استفاده میشود. همانطور که توسط نویسندگان روش پیشنهاد شده است، جایگزینی برخی دستورالعملها در موقعیتهای پرش معمولی با سایر دستورالعملها بر عملکرد نرمافزار تأثیر نمیگذارد، این درحالیست که حمله Spectre را غیرممکن میکند. مزیت مهم Retpoline نسبت به IBRS و سایر روشهای حفاظتی، فقط کاهش جزئی و حداکثر 5% عملکرد است.
از پژوهش روی Retbleed چه چیزی دستگیرمان میشود؟
اساساً این پژوهش تازهانجامشده نشان میدهد Retpoline کار نمیکند! دستورالعملهای بازگشتی که روش Retpoline بر آنها تکیه دارد نیز میتوانند در طرحی کمی تغییر یافته برای فریب (یا آموزش مخرب) پیشبینیکننده پرش مورد سوء استفاده قرار گیرند.
پردازندههای AMD Zen 1 و Zen 2 (2017-2019) شاید جدید نباشند اما به روز هستند و پردازندههای Kaby Lake و Coffee Lake اینتل (2016-2017) مستعد حمله Retbleed میباشند. در پردازندههای مدرنتر AMD Zen 3، و همچنین Intel Alder Lake و پردازندههای نسل نهم قبلی، حمله Retbleed کار نمیکند. این نیز به دلیل اجرای حفاظت سخت افزاری پیشرفته IBRS در پردازنده های اینتل است.
هزینه محافظت
اگر حمله Spectre اجرایش انقدر سخت است چرا در مقابلش باید بایستیم و به فکر تمهیدات دفاعی باشیم؟ برای انطباق Spectre به یک مورد واقعی (با آسیب واقعی به قربانی) بسیاری از شرایط باید مهیا شود: توانایی در اجرای کد روی سیستم مورد حمله، داشتن نرمافزاری در معرض حمله به صورت نصبشده و نیز کشیدن داده از کش به صورت قابلاطمینان (با احتمال مشخصی برای خواندن خطاها). قبلاً نوشتیم که واقعیترین حمله در مرورگر کروم شبیهسازی شده است، جایی که یک مهاجم بالقوه میتواند، برای مثال، رمزهای عبور ذخیرهشده را از RAM استخراج کند. اما این مشکل با یک بهبود حفاظتی ساده در خود مرورگر حل شد، درست مانند هر اشکال بیاهمیت دیگری. این احتمال وجود دارد که پیشرفت تدریجی در تحقیق درباره آسیبپذیریهای شبه Spectre روزی به طور غیرمنتظره به احتمال حمله انبوه به رایانهها و سرورهای کاربران منجر شود. اما وقتی صحبت از داده های واقعاً حساس میشود، Spectre باید هماکنون در نظر گرفته شود.
بدیهیترین سناریو حمله از طریق میزبانی و ارائه دهندگان محاسبات توزیع شده است. یک سرور مجازی معمولی که میتوانید با مبلغ معقولی از یک ارائهدهنده تصادفی اجاره کنید، اساساً برنامهای است که در کنار سیستمعاملهای مجازی دیگر مشتریان روی همان سرور پرقدرت اجرا میشود. یک مشترک سرور مجازی، بنا به تعریف، میتواند برنامههایی را روی آن اجرا کند، اما هیچ امتیازی برای دسترسی به همسایگان یا میزبان، یعنی سیستم عامل کنترلکننده، ندارد. جداسازی محیطهای مجازی و ناتوانی در فرار از فضای مجازی یک الزام امنیتی کلیدی برای ارائه دهندگان خدمات به حساب میآید. در عین حال، ارائهدهندگان خدمات علاقهمند هستند که تا حد امکان سیستمهای مجازی روی یک سرور اجرا شوند بدون اینکه برای یکدیگر مشکل ایجاد کنند.
این کلید، اولین بهای سخت افزار گران قیمت است. از این رو، همه پچها (که در واقع کار میکنند) عملکرد را کاهش میدهند و در نتیجه درآمد ISP پایین میآید. اما ارائهدهندگان نیز نمیتوانند مشکل را نادیده بگیرند، زیرا سرقت موفقیتآمیز دادههای حساس حتی ردی از خود باقی نمیگذارد! بنابراین وقتی Retpoline پیشنهاد شد، بسیاری آن را مانند یک طناب نجات برای مبارزه با بلای جدید دیدند و آن را سفت چسبیدند. اما، تا ژانویه 2018، تردیدهایی در مورد قابل اعتماد بودن این روش دفاعی وجود داشت. بحثی در مورد لیستِ میلینگِ توسعهدهندگان هسته لینوکس تعدادی از شکایات را در مورد Retpoline نشان میدهد. در همان زمان، لینوس توروالدز، خالق و بنیانگذار اصلی لینوکس، به وضوح (به روش معمولی خود) اعلام کرد که Retpoline به طور کلی کافی است.
نویسندگان رتبلد همچنین «هزینه» حفاظت در دنیای واقعی را برای پردازندههای آسیبپذیر محاسبه کردند که در سطح سختافزار قابل رفع نیستند. پچهای موجود در هسته لینوکس منجر به کاهش عملکرد تا 39 درصد برای پردازندههای اینتل و 14 درصد برای پردازندههای AMD شده است. پردازندههای AMD در نوع خود آسیبپذیر بودند و محققان پدیدهای را کشف کردند که آنها را Phantom JMPs نامیدند. مشخص شد که تحت شرایط خاص، میتوان یک سیستم پیشبینی پرش را وادار به اجرای یک دستورالعمل دلخواه کرد، حتی اگر در کد مورد حمله وجود نداشته باشد. به همین دلیل، نویسندگان مجبور شدند یک ضمیمه مختصرِ یک صفحهای برای تحقیق خود منتشر کنند. با این حال، آنها تصریح میکنند که استفاده از این آسیبپذیری برای ایجاد آسیب واقعی حتی دشوارتر از Spectre V2 سنتی است.
حالا چه؟
برای کاربران معمولی، تهدید حمله Spectre تماماً مجازی باقی میماند. پچهای پیشگیرانه از سوی توسعهدهندگان سیستمعامل نیز کفایت خواهد کرد. در ویندوز نیز محافظت IBRS به طور پیشفرض فعالسازی خواهد شد. پچهای جدید لینوکس کرنل هم احتمالاً به کاهش عملکرد منجر خواهند شد و همین شاید فاحشترین بخش در مورد راهکارهای تجاری باشد؛ جایی که سختافزاری کامپیوتری بسیار با محدودیت مواجهاند.
مشکل با این واقعیت تشدید می شود که انواع Spectre بسیاری وجود دارد. Retbleed همچنین میتواند یک نوع جداگانه در نظر گرفته شود که بر روی پردازندههای سازندههای مختلف متفاوت عمل میکند. AMD و اینتل Retbleed را به عنوان یک آسیبپذیری جداگانه پذیرفتهاند و احتمالاً راهکار سختافزاری برای آن ارائه خواهند کرد. شرکتها به سمت سختافزار جدید حرکت میکنند که در آن اقدامات حفاظتی اجرا میشود و تعادلی بین عملکرد و امنیت پیدا میکند. متأسفانه پچهای نرمافزاری بیشترین تأثیر را بر عملکرد پردازندههای نسبتا قدیمی دارند. نه تنها نرم افزار با گذشت زمان سختتر میشود، بلکه این "تاوان" در اجرای حدس و گمان نیز دیده میشود.
اگر از زاویه بالا به مسئله نگاه کنیم شاید چیز جدیدی نباشد. توسعهدهندگان بدون اینکه به بخش امنیتی فکر کنند دست به ارائه راهکارهای با عملکرد بالا میزنند. دیر یا زود (در این سناریو دیر: اجرای فرضی اواسط دهه 90 میلادی شروع شد) این مسئله گریبان همه را خواهد گرفت و اقدامات امنیتی نیز چارهساز نخواهند بود. اما در نهایت و از پس همه این مصائب بالاخره راهکارهایی جدیدی یافت خواهد شد و صنعت هایتک به مسیر خود ادامه خواهد داد. غافلگیری، کشف مشکل در بخش سختافزار بود: نمیشود این مشکل را براحتی مشکل نرمافزاری حل کرد. و این مثل یک باگ ساده نیست بلکه رویکردی ضعیف است (البته از دید امنیتی) که چند سال پیش صنعت فناوری اتخاذش کرده. امیدواریم توسعهدهندگان پردازشگر با متودهای جدید ما را از این نگرانی دربیاورند؛ متودهایی برای رایانش قوی و امن پیش از اینکه قوهای سیاه حملههای خطرناک سختافزاری از هر طرف روی سر ما پرواز کنند. اگر چنین حملاتی سراسری شوند دیگر راه فراری نیست و مشکل فقط با جایگزینی کاملِ سختافزارها حل خواهد شد.
[1]Branch Prediction در معماری کامپیوتر، پیشبینی پرش یک مدار دیجیتال است که تلاش میکند حدس بزند که یک پرش چه راهی (برای مثال ساختار if-then-else) میرود قبل از اینکه بهطور قطعی شناخته شود. مقصود از پیشبینی پرش بهبود جریان در دستورات خط لوله است. پیش بینیهای پرش نقش اساسی در دست یابی به کارایی مؤثر بالا در خیلی از معماریهای ریزپردازندههای جدید مثل x86 ایفا میکند.
[2] Branch Target Injection
[3] side-channel reading
منبع: کسپرسکی آنلاین (ایدکو)
کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز میشناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکی نام دارد.