Meltdown/Spectre

نمای کلی

در ۳ ژانویه، Project Zero آسیب‌پذیری‌هایی را در واحدهای پردازش مرکزی مدرن آشکار کرد که یک فرایند می‌تواند از آن‌ها برای خواندن (در بدترین حالت) حافظه دلخواه استفاده کند — ازجمله حافظه‌ای که به آن فرایند تعلق ندارد. این آسیب‌پذیری‌ها Spectre و Meltdown نام‌گذاری شده‌اند. ‫Chrome برای کمک به حفظ امنیت وب چه می‌کند و توسعه‌دهندگان وب باید برای سایت‌های خود چه کنند؟

خیلی طولانی است؛ خوانده نشد

به‌عنوان کاربری که در وب مرور می‌کند، باید مطمئن شوید که سیستم‌عامل و مرورگرتان را به‌روز نگه می‌دارید. علاوه‌براین، کاربران Chrome می‌توانند فعال کردن جداسازی سایت را درنظر بگیرند.

اگر توسعه‌دهنده وب هستید، تیم Chrome توصیه می‌کند:

  • درصورت امکان، بااستفاده از مشخصه‌های کوکی SameSite و HTTPOnly و با اجتناب از خواندن از document.cookie، از ورود کوکی‌ها به حافظه فرایند پردازشگر جلوگیری کنید.
  • مطمئن شوید انواع MIME شما درست است و برای هر نشانی وبی که محتوای حساس یا مختص کاربر دارد، سرصفحه X-Content-Type-Options: nosniff را مشخص کنید تا برای کاربرانی که «جداسازی سایت» را فعال کرده‌اند، بیشترین بهره را از مسدود کردن خواندن میان‌مبدئی ببرید.
  • جداسازی سایت را فعال کنید و اگر مشکلی برای سایتتان ایجاد کرد، به تیم Chrome اطلاع دهید.

اگر می‌خواهید بدانید چرا این مراحل کمک می‌کنند، ادامه مطلب را بخوانید!

خطر

توضیحات بسیار متنوعی درباره این آسیب‌پذیری‌ها وجود دارد، بنابراین من توضیح دیگری اضافه نمی‌کنم. اگر می‌خواهید بدانید چگونه می‌توان از این آسیب‌پذیری‌ها سوءاستفاده کرد، توصیه می‌کنم به پست وبلاگ همکارانم در تیم Google Cloud نگاهی بیندازید.

هر دو آسیب‌پذیری Meltdown و Spectre به‌طور بالقوه به یک فرایند اجازه می‌دهند حافظه‌ای را بخواند که نباید بتواند بخواند. گاهی اوقات، چند سند از سایت‌های مختلف می‌توانند درنهایت فرایندی را در Chrome هم‌رسانی کنند. این اتفاق زمانی می‌افتد که یکی دیگری را بااستفاده از window.open، یا <a href="..." target="_blank">، یا iframe باز کرده باشد. اگر وب‌سایتی حاوی داده‌های مختص کاربر باشد، این احتمال وجود دارد که سایت دیگری بتواند از این آسیب‌پذیری‌های جدید برای خواندن داده‌های آن کاربر استفاده کند.

کاهش آسیب‌ها

تیم مهندسی Chrome و V8 اقدامات متعددی را برای کاهش این تهدید انجام می‌دهند.

جداسازی سایت

با جلوگیری از هم‌رسانی داده‌های حساس با کد تحت کنترل مهاجم، می‌توان تأثیر بهره‌برداری موفقیت‌آمیز از Spectre را به‌طور قابل‌توجهی کاهش داد. تیم Chrome روی ویژگی‌ای کار می‌کند که به این هدف دست یابد، این ویژگی «جداسازی سایت» نام دارد:

«جداسازی سایت» هنوز به‌طور پیش‌فرض فعال نشده است زیرا چند مشکل شناخته‌شده وجود دارد و تیم Chrome مایل است تا حد امکان آزمایش‌های میدانی انجام دهد. اگر توسعه‌دهنده وب هستید، باید «جداسازی سایت» را فعال کنید و بررسی کنید که آیا سایتتان همچنان کار می‌کند یا نه. اگر می‌خواهید اکنون موافقت کنید، chrome://flags#enable-site-per-process را فعال کنید. اگر سایتی پیدا کردید که کار نمی‌کند، لطفاً با ثبت اشکال به ما کمک کنید و ذکر کنید که «جداسازی سایت» را فعال کرده‌اید.

مسدود کردن سند بین‌سایتی

حتی وقتی همه صفحه‌های بین‌سایتی در فرایندهای جداگانه قرار می‌گیرند، صفحه‌ها همچنان می‌توانند به‌طور قانونی برخی‌از زیرمنابع بین‌سایتی را درخواست کنند، مثل تصاویر و جاوا اسکریپت. برای کمک به جلوگیری از نشت اطلاعات حساس، «جداسازی سایت» شامل ویژگی «مسدود کردن سند بین‌سایتی» است که پاسخ‌های شبکه‌ای را که به فرایند پردازشگر ارسال می‌شود محدود می‌کند.

وب‌سایت می‌تواند دو نوع داده از سرور درخواست کند: «اسناد» و «منابع». در اینجا، اسناد فایل‌های HTML،‏ XML،‏ JSON، و نوشتاری هستند. وب‌سایت می‌تواند اسناد را از دامنه خودش یا از دامنه‌های دیگر با سرایندهای CORS مجاز دریافت کند. منابع شامل مواردی مانند تصاویر، جاوا اسکریپت، CSS و قلم‌ها است. منابع را می‌توان از هر سایتی اضافه کرد.

خط‌مشی مسدود کردن سند بین‌سایتی مانع از دریافت «اسناد» از مبدأهای دیگر توسط فرایند می‌شود اگر:

  1. نوع MIME آن‌ها HTML،‏ XML،‏ JSON، یا text/plain باشد، و
  2. یا سرایند پاسخ HTTP X-Content-Type-Options: nosniff دارند، یا تحلیل سریع محتوا («sniffing») تأیید می‌کند که نوع آن درست است
  3. CORS صریحاً اجازه دسترسی به سند را نمی‌دهد

اسنادی که توسط این خط‌مشی مسدود شده‌اند به‌صورت خالی به فرایند ارائه می‌شوند، هرچند درخواست همچنان در پس‌زمینه اتفاق می‌افتد.

برای مثال: تصور کنید مهاجمی برچسب <img> ایجاد می‌کند که حاوی فایل JSON با داده‌های حساس، مثل <img src="https://yourbank.com/balance.json">، است. بدون «جداسازی سایت»، محتوای فایل JSON به حافظه فرایند پردازشگر می‌رسد و در این مرحله پردازشگر متوجه می‌شود که قالب تصویر معتبر نیست و تصویر را پردازش نمی‌کند. اما با Spectre، اکنون راهی برای خواندن احتمالی آن بخش از حافظه وجود دارد. مسدود کردن سند بین‌سایتی مانع از ورود محتوای این فایل به حافظه فرایندی می‌شود که پردازنده گرافیکی در آن اجرا می‌شود زیرا نوع MIME توسط مسدود کردن سند بین‌سایتی مسدود شده است.

طبق سنجه‌های کاربر، فایل‌های جاوا اسکریپت و CSS زیادی وجود دارد که با نوع رسانه : نوع MIME text/html یا text/plain ارائه می‌شوند. برای جلوگیری از مسدود کردن منابعی که به‌طور تصادفی به‌عنوان سند علامت‌گذاری شده‌اند، Chrome تلاش می‌کند پاسخ را بو بکشد تا مطمئن شود نوع MIME درست است. این بوکشیدن ناقص است، بنابراین اگر مطمئن هستید که سرصفحه‌های Content-Type صحیح را در وب‌سایتتان تنظیم می‌کنید، تیم Chrome توصیه می‌کند سرصفحه X-Content-Type-Options: nosniff را به همه پاسخ‌هایتان اضافه کنید.

اگر می‌خواهید مسدود کردن سند بین‌سایتی را امتحان کنید، همان‌طور که در بالا توضیح داده شد، با «جداسازی سایت» موافقت کنید.

SameSite کوکی

بیایید به مثال بالا برگردیم: <img src="https://yourbank.com/balance.json">. این فقط درصورتی کار می‌کند که yourbank.com کوکی‌ای را ذخیره کرده باشد که به‌طور خودکار کاربر را به سیستم وارد کند. کوکی‌ها معمولاً برای همه درخواست‌ها به وب‌سایتی که کوکی را تنظیم می‌کند ارسال می‌شوند — حتی اگر درخواست توسط طرف سومی بااستفاده از برچسب <img> انجام شده باشد. کوکی‌های SameSite مشخصه جدیدی هستند که مشخص می‌کنند کوکی فقط باید به درخواستی پیوست شود که از همان سایت منشأ گرفته است، به همین دلیل این نام را دارد. متأسفانه در زمان نوشتن این مطلب، فقط Chrome و Firefox نسخه ۵۸ و بالاتر از این مشخصه پشتیبانی می‌کنند.

‫HTTPOnly و document.cookie

اگر کوکی‌های سایتتان فقط در سمت سرور استفاده می‌شود و نه توسط JavaScript کارخواه، روش‌هایی وجود دارد که می‌توانید از ورود داده‌های کوکی به فرایند پردازشگر جلوگیری کنید. می‌توانید مشخصه کوکی HTTPOnly را تنظیم کنید که صریحاً از دسترسی به کوکی ازطریق اسکریپت سمت کارخواه در مرورگرهای پشتیبانی‌شده، مثل Chrome، جلوگیری می‌کند. اگر تنظیم HTTPOnly امکان‌پذیر نیست، می‌توانید با نخواندن document.cookie، مگر در موارد کاملاً ضروری، به محدود کردن قرار گرفتن داده‌های کوکی بارگیری در معرض فرایند پردازشگر کمک کنید.

وقتی بااستفاده از target="_blank" به صفحه دیگری پیوند می‌دهید، صفحه بازشده به شیء window شما دسترسی دارد، می‌تواند صفحه شما را به نشانی وب دیگری هدایت کند، و بدون «جداسازی سایت» در همان فرایند صفحه شما خواهد بود. برای محافظت بهتر از صفحه‌تان، پیوندهای صفحات خارجی که در پنجره جدیدی باز می‌شوند باید همیشه مشخص کنندrel="noopener".

زمان‌سنج‌های با وضوح بالا

برای سوءاستفاده از Meltdown یا Spectre، مهاجم باید مدت زمان لازم برای خواندن مقدار خاصی از حافظه را اندازه‌گیری کند. برای این کار، به زمان‌سنجی دقیق و قابل‌اعتماد نیاز است.

یکی از میاناهای برنامه‌سازی کاربردی که پلاتفرم وب ارائه می‌دهد performance.now() است که تا ۵ میکروثانیه دقیق است. برای کاهش این خطر، همه مرورگرهای اصلی وضوح performance.now() را کاهش داده‌اند تا انجام این حملات دشوارتر شود.

روش دیگر برای دریافت زمان‌سنج با وضوح بالا استفاده از SharedArrayBuffer است. میان‌گیر توسط یک کارگر اختصاصی برای افزایش شمارنده استفاده می‌شود. رشته اصلی این شمارنده را می‌خواند و از آن به‌عنوان زمان‌سنج استفاده می‌کند. درحال‌حاضر مرورگرها تصمیم گرفته‌اند SharedArrayBuffer را غیرفعال کنند تا زمانی که اقدامات کاهشی دیگری انجام شود.

V8

برای سوءاستفاده از Spectre، به توالی خاصی از دستورالعمل‌های CPU نیاز است. تیم V8 اقدامات کاهشی را برای اثبات مفهوم حملات شناخته‌شده اجرا کرده است و درحال کار روی تغییراتی در TurboFan (کامپایلر بهینه‌سازی آن‌ها) است که باعث می‌شود کد تولیدشده آن حتی درصورت راه‌اندازی این حملات ایمن باشد. بااین‌حال، این تغییرات تولید کد ممکن است با جریمه عملکردی همراه باشد.

حفظ ایمنی وب

ابهامات زیادی درباره کشف Spectre و Meltdown و پیامدهای آن‌ها وجود داشته است. امیدوارم این مقاله تا حدودی روشن کرده باشد که تیم‌های Chrome و V8 چه اقداماتی برای حفظ امنیت پلاتفرم وب انجام می‌دهند و توسعه‌دهندگان وب چگونه می‌توانند بااستفاده از ویژگی‌های امنیتی موجود کمک کنند. اگر سؤالی دارید، هر زمان بخواهید می‌توانید در Twitter با من تماس بگیرید.