بررسی اجمالی
در 3 ژانویه، Project Zero آسیبپذیریهایی را در CPUهای مدرن آشکار کرد که یک فرآیند میتواند از آنها برای خواندن (در بدترین حالت) حافظه دلخواه استفاده کند - از جمله حافظهای که به آن فرآیند تعلق ندارد. این آسیبپذیریها Spectre و Meltdown نامگذاری شدهاند. Chrome برای کمک به حفظ امنیت وب چه می کند و توسعه دهندگان وب برای سایت های خود چه کاری باید انجام دهند؟
TL; دکتر
به عنوان کاربر در حال مرور وب ، باید مطمئن شوید که سیستم عامل و مرورگر خود را به روز نگه دارید. علاوه بر این، کاربران Chrome میتوانند Site Isolation را فعال کنند.
اگر یک توسعه دهنده وب هستید، تیم Chrome توصیه می کند :
- در صورت امکان، با استفاده از ویژگیهای کوکی
SameSite
وHTTPOnly
و با اجتناب از خواندن ازdocument.cookie
از ورود کوکیها به حافظه پردازش رندر جلوگیری کنید. - اطمینان حاصل کنید که انواع MIME شما صحیح هستند و یک سرصفحه
X-Content-Type-Options: nosniff
برای هر نشانی اینترنتی با محتوای خاص یا حساس تعیین کنید تا بیشترین بهره را از انسداد خواندن Cross-Origin برای کاربرانی که Site Isolation را فعال کردهاند، ببرید. - Site Isolation را فعال کنید و اگر مشکلی برای سایت شما ایجاد کرد به تیم Chrome اطلاع دهید .
اگر تعجب می کنید که چرا این مراحل کمک می کند، ادامه مطلب را بخوانید!
ریسک
توضیحات متنوعی در مورد این آسیبپذیریها وجود دارد، بنابراین من قصد ندارم مورد دیگری اضافه کنم. اگر علاقه مند هستید که چگونه می توان از این آسیب پذیری ها سوء استفاده کرد، توصیه می کنم به پست وبلاگ همکاران من از تیم Google Cloud نگاهی بیندازید.
هم Meltdown و هم Spectre به طور بالقوه به یک فرآیند اجازه خواندن حافظه را می دهند که قرار نیست قادر به خواندن آن باشد. گاهی اوقات، چندین سند از سایتهای مختلف میتوانند فرآیندی را در Chrome به اشتراک بگذارند. این ممکن است زمانی اتفاق بیفتد که یکی دیگر را با استفاده از window.open
یا <a href="..." target="_blank">
یا iframes باز کرده باشد. اگر یک وب سایت حاوی داده های خاص کاربر باشد، این احتمال وجود دارد که سایت دیگری بتواند از این آسیب پذیری های جدید برای خواندن داده های کاربر استفاده کند.
اقدامات کاهشی
تیم مهندسی کروم و V8 تلاش های متعددی برای کاهش این تهدید انجام می دهند.
جداسازی سایت
تاثیر بهره برداری موفقیت آمیز از Spectre را می توان با جلوگیری از به اشتراک گذاشتن داده های حساس فرآیندی با کد کنترل شده توسط مهاجم، تا حد زیادی کاهش داد. تیم Chrome روی یک ویژگی برای دستیابی به این کار کار کرده است به نام " Isolation Site ":
Site Isolation هنوز بهطور پیشفرض فعال نشده است، زیرا چند مشکل شناخته شده وجود دارد و تیم Chrome مایل است تا آنجا که ممکن است آزمایش میدانی انجام دهد. اگر شما یک توسعه دهنده وب هستید، باید Site Isolation را فعال کنید و بررسی کنید که آیا سایت شما فعال است یا خیر. اگر میخواهید اکنون شرکت کنید، chrome://flags#enable-site-per-process
فعال کنید. اگر سایتی پیدا کردید که کار نمی کند، لطفاً با پر کردن یک باگ به ما کمک کنید و ذکر کنید که Site Isolation را فعال کرده اید.
مسدود کردن اسناد بین سایتی
حتی زمانی که همه صفحات بین سایتی در فرآیندهای جداگانه قرار می گیرند، صفحات همچنان می توانند به طور قانونی برخی منابع فرعی بین سایتی مانند تصاویر و جاوا اسکریپت را درخواست کنند. برای کمک به جلوگیری از افشای اطلاعات حساس این اطلاعات، Site Isolation شامل ویژگی « مسدود کردن اسناد بین سایتی » است که پاسخهای شبکه را به فرآیند ارائهدهنده محدود میکند.
یک وب سایت می تواند دو نوع داده از یک سرور درخواست کند: «اسناد» و «منابع». در اینجا اسناد HTML، XML، JSON و فایل های متنی هستند. یک وب سایت می تواند اسناد را از دامنه خود یا از دامنه های دیگر با هدرهای مجاز CORS دریافت کند. منابع شامل مواردی مانند تصاویر، جاوا اسکریپت، CSS و فونت ها هستند. منابع را می توان از هر سایتی گنجاند.
خط مشی مسدود کردن اسناد بین سایتی مانع از دریافت "اسناد" از مبداهای دیگر توسط یک فرآیند می شود اگر:
- آنها دارای یک نوع HTML، XML، JSON، یا متن / MIME ساده و
- آنها یا یک
X-Content-Type-Options: nosniff
، یا یک تجزیه و تحلیل محتوای سریع (" sniffing ") تایید می کند که نوع درست است. - CORS به صراحت اجازه دسترسی به سند را نمی دهد
اسنادی که توسط این خطمشی مسدود شدهاند بهعنوان خالی به فرآیند ارائه میشوند، اگرچه درخواست همچنان در پسزمینه انجام میشود.
به عنوان مثال: تصور کنید یک مهاجم یک تگ <img>
ایجاد می کند که شامل یک فایل JSON با داده های حساس است، مانند <img src="https://yourbank.com/balance.json">
. بدون Site Isolation، محتویات فایل JSON به حافظه پردازش رندر میرسد، در این مرحله رندر متوجه میشود که فرمت تصویر معتبر نیست و تصویری را ارائه نمیکند. با این حال، با Spectre، اکنون راهی برای خواندن بالقوه آن تکه حافظه وجود دارد. مسدود کردن سند بین سایتی مانع از ورود محتویات این فایل به حافظه فرآیندی می شود که رندر در آن اجرا می شود زیرا نوع MIME با مسدود کردن سند بین سایتی مسدود می شود.
با توجه به معیارهای کاربر، تعداد زیادی فایل جاوا اسکریپت و CSS وجود دارد که با انواع text/html
یا text/plain
ارائه میشوند. برای جلوگیری از مسدود کردن منابعی که بهطور تصادفی بهعنوان اسناد علامتگذاری شدهاند، Chrome سعی میکند پاسخ را بشنود تا مطمئن شود نوع MIME درست است. این sniffing ناقص است، بنابراین اگر مطمئن هستید که سرصفحههای Content-Type
در وبسایت خود تنظیم میکنید، تیم Chrome توصیه میکند هدر X-Content-Type-Options: nosniff
به همه پاسخهای خود اضافه کنید.
اگر میخواهید مسدود کردن اسناد بین سایتی را امتحان کنید، همانطور که در بالا توضیح داده شد، از Site Isolation استفاده کنید.
کوکی های SameSite
بیایید به مثال بالا برگردیم: <img src="https://yourbank.com/balance.json">
. این تنها در صورتی کار میکند که yourbank.com کوکیای ذخیره کرده باشد که کاربر را بهطور خودکار وارد کند. معمولاً کوکیها برای همه درخواستها به وبسایتی که کوکی را تنظیم میکند ارسال میشود - حتی اگر درخواست توسط شخص ثالثی با استفاده از برچسب <img>
انجام شود. کوکیهای SameSite یک ویژگی جدید هستند که مشخص میکنند یک کوکی فقط باید به درخواستی که از همان سایت منشأ میگیرد وصل شود، از این رو نام آن است. متأسفانه، در زمان نگارش این مقاله، فقط Chrome و Firefox 58+ از این ویژگی پشتیبانی میکنند .
HTTPOnly
و document.cookie
اگر کوکیهای سایت شما فقط در سمت سرور استفاده میشوند، نه توسط جاوا اسکریپت مشتری، راههایی وجود دارد که میتوانید از ورود دادههای کوکی به فرآیند رندر جلوگیری کنید. میتوانید ویژگی کوکی HTTPOnly
را تنظیم کنید، که به صراحت از دسترسی به کوکی از طریق اسکریپت سمت مشتری در مرورگرهای پشتیبانیشده مانند Chrome جلوگیری میکند. اگر تنظیم HTTPOnly
امکانپذیر نیست، میتوانید با نخواندن document.cookie
، مگر اینکه کاملاً ضروری باشد، به محدود کردن بارگیری دادههای کوکی به فرآیند ارائهشده کمک کنید.
باز کردن پیوندهای خارجی با استفاده از rel="noopener"
وقتی با استفاده از target="_blank"
به صفحه دیگری پیوند میدهید، صفحه باز شده به شی window
شما دسترسی دارد ، میتواند صفحه شما را به URL دیگری هدایت کند و بدون Site Isolation همانند صفحه شما خواهد بود. برای محافظت بهتر از صفحه خود، پیوندهایی به صفحات خارجی که در یک پنجره جدید باز می شوند همیشه باید rel="noopener"
مشخص کنند .
تایمر با وضوح بالا
برای سوء استفاده از Meltdown یا Spectre، مهاجم باید اندازه گیری کند که چقدر طول می کشد تا یک مقدار معین را از حافظه بخواند. برای این کار به یک تایمر قابل اعتماد و دقیق نیاز است.
یکی از API هایی که پلتفرم وب ارائه می دهد performance.now()
است که دقت آن تا 5 میکروثانیه است. به عنوان یک کاهش، همه مرورگرهای اصلی وضوح performance.now()
را کاهش داده اند تا نصب حملات را دشوارتر کنند.
راه دیگر برای دریافت تایمر با وضوح بالا استفاده از SharedArrayBuffer است. بافر توسط یک کارگر اختصاصی برای افزایش شمارنده استفاده می شود. موضوع اصلی این شمارنده را می خواند و از آن به عنوان تایمر استفاده می کند. در حال حاضر مرورگرها تصمیم گرفته اند تا زمانی که دیگر اقدامات کاهشی انجام نشود SharedArrayBuffer را غیرفعال کنند.
V8
برای بهره برداری از Spectre، به دنباله ای خاص از دستورالعمل های CPU نیاز است. تیم V8 کاهشهایی را برای اثباتهای مفهومی حمله شناخته شده پیادهسازی کرده است ، و در حال کار بر روی تغییراتی در TurboFan، کامپایلر بهینهسازی آنها است که کد تولید شده آن را حتی زمانی که این حملات آغاز میشوند، ایمن میسازد. با این حال، این تغییرات ایجاد کد ممکن است با جریمه عملکرد همراه باشد.
ایمن نگه داشتن وب
ابهامات زیادی در مورد کشف Spectre و Meltdown و پیامدهای آنها وجود داشته است. امیدوارم این مقاله به آنچه که تیمهای کروم و V8 برای ایمن نگه داشتن پلتفرم وب انجام میدهند و اینکه چگونه توسعهدهندگان وب میتوانند با استفاده از ویژگیهای امنیتی موجود کمک کنند، روشن کند. اگر سوالی دارید، در توییتر با من تماس بگیرید.