چرا به «منشا متقاطع ایزوله شده نیاز دارید» برای ویژگی های قدرتمند

بیاموزید که چرا برای استفاده از ویژگی‌های قدرتمندی مانند SharedArrayBuffer ، performance.measureUserAgentSpecificMemory() و تایمر با وضوح بالا با دقت بهتر، به جداسازی متقاطع نیاز است.

در ساختن وب‌سایت خود با استفاده از COOP و COEP "مبدع متقاطع ایزوله" توضیح دادیم که چگونه با استفاده از COOP و COEP به حالت "منشأ متقاطع جدا شده" برسیم. این مقاله همراهی است که توضیح می‌دهد چرا برای فعال کردن ویژگی‌های قدرتمند در مرورگر به جداسازی منبع متقابل نیاز است.

پس زمینه

وب بر اساس خط مشی مبدا یکسان ساخته شده است: یک ویژگی امنیتی که نحوه تعامل اسناد و اسکریپت ها با منابع منبع دیگر را محدود می کند. این اصل راه‌هایی را که وب‌سایت‌ها می‌توانند به منابع متقاطع دسترسی داشته باشند، محدود می‌کند. به عنوان مثال، سندی از https://a.example از دسترسی به داده های میزبانی شده در https://b.example جلوگیری می کند.

با این حال، سیاست همان مبدأ دارای برخی استثناهای تاریخی بوده است. هر وب سایتی می تواند:

  • iframe های متقاطع را جاسازی کنید
  • منابع متقاطع مانند تصاویر یا اسکریپت ها را شامل شود
  • پنجره های بازشوی متقاطع را با یک مرجع DOM باز کنید

اگر وب می توانست از ابتدا طراحی شود، این استثناها وجود نداشتند. متأسفانه، زمانی که جامعه وب به مزایای کلیدی یک خط مشی دقیق همان مبدأ پی برد، وب قبلاً بر این استثناها تکیه کرده بود.

عوارض جانبی امنیتی چنین سیاست سهل انگاری از دو طریق اصلاح شد. یک راه از طریق معرفی پروتکل جدیدی به نام Cross Origin Resource Sharing (CORS) بود که هدف آن اطمینان از اینکه سرور اجازه به اشتراک گذاری منبعی با مبدأ مشخص را می دهد. راه دیگر حذف ضمنی دسترسی مستقیم اسکریپت به منابع متقاطع با حفظ سازگاری با عقب است. چنین منابعی با منشاء متقاطع، منابع "مات" نامیده می شوند. به عنوان مثال، به همین دلیل است که دستکاری پیکسل های یک تصویر متقاطع از طریق CanvasRenderingContext2D ناموفق است مگر اینکه CORS روی تصویر اعمال شود.

همه این تصمیمات خط مشی در یک گروه زمینه مرور اتفاق می افتد.

گروه زمینه مرور

برای مدت طولانی، ترکیب CORS و منابع غیر شفاف برای ایمن کردن مرورگرها کافی بود. گاهی اوقات موارد لبه (مانند آسیب‌پذیری‌های JSON ) کشف می‌شد و نیاز به اصلاح داشت، اما در کل اصل اجازه ندادن دسترسی خواندن مستقیم به بایت‌های خام منابع متقاطع موفقیت‌آمیز بود.

همه اینها با Spectre تغییر کرد، که باعث می شود هر داده ای که در همان گروه زمینه مرور بارگذاری می شود به عنوان کد شما قابل خواندن باشد. با اندازه‌گیری زمان انجام عملیات خاص، مهاجمان می‌توانند محتویات حافظه پنهان CPU و از طریق آن، محتویات حافظه پردازش را حدس بزنند. چنین حملات زمان‌بندی با تایمرهایی با دانه‌بندی پایین که در پلتفرم وجود دارد امکان‌پذیر است، اما می‌توان با تایمرهایی با دانه‌بندی بالا، هم صریح (مانند performance.now() ) و هم غیرمستقیم (مانند SharedArrayBuffer ) سرعت را افزایش داد. اگر evil.com یک تصویر متقاطع را تعبیه کند، می‌تواند از حمله Spectre برای خواندن داده‌های پیکسلی آن استفاده کند، که باعث می‌شود حفاظت‌های مبتنی بر «مشت‌بودن» بی‌اثر شود.

طیف

در حالت ایده‌آل، تمام درخواست‌های متقاطع باید به صراحت توسط سروری که صاحب منبع است بررسی شود. اگر بررسی توسط سرور صاحب منبع ارائه نشود، داده‌ها هرگز وارد گروه زمینه مرور یک بازیگر شرور نمی‌شوند و بنابراین از هرگونه حمله Spectre که یک صفحه وب می‌تواند انجام دهد دور می‌ماند. ما آن را حالت ایزوله با منشا متقاطع می نامیم. این دقیقاً همان چیزی است که COOP+COEP در مورد آن است.

تحت یک حالت جدا شده از مبدأ متقاطع، سایت درخواست کننده کمتر خطرناک تلقی می شود و این ویژگی های قدرتمندی مانند SharedArrayBuffer ، performance.measureUserAgentSpecificMemory() و تایمرهای با وضوح بالا را با دقت بهتری باز می کند که در غیر این صورت می تواند برای حملات Spectre مانند استفاده شود. همچنین از تغییر document.domain جلوگیری می کند.

خط‌مشی Cross Origin Embedder

خط‌مشی جاسازی مبدأ متقاطع (COEP) مانع از بارگیری یک سند از منابع متقاطع می‌شود که به صراحت به سند اجازه نمی‌دهند (با استفاده از CORP یا CORS). با این ویژگی می توانید اعلام کنید که یک سند نمی تواند چنین منابعی را بارگیری کند.

COEP چگونه کار می کند

برای فعال کردن این خط مشی، هدر HTTP زیر را به سند اضافه کنید:

Cross-Origin-Embedder-Policy: require-corp

کلمه کلیدی require-corp تنها مقدار پذیرفته شده برای COEP است. این خط مشی را اعمال می کند که سند فقط می تواند منابع را از همان مبدأ بارگیری کند، یا منابعی که صریحاً به عنوان قابل بارگیری از مبدا دیگری علامت گذاری شده اند.

برای اینکه منابع از مبدأ دیگری قابل بارگیری باشند، باید از اشتراک‌گذاری منابع متقاطع (CORS) یا خط‌مشی منابع متقاطع (CORP) پشتیبانی کنند.

به اشتراک گذاری منابع متقاطع

اگر منبع متقاطع از اشتراک‌گذاری منبع متقاطع (CORS) پشتیبانی می‌کند، می‌توانید از ویژگی crossorigin برای بارگیری آن در صفحه وب خود بدون مسدود شدن توسط COEP استفاده کنید.

<img src="https://third-party.example.com/image.jpg" crossorigin>

برای مثال، اگر این منبع تصویر با سرصفحه های CORS ارائه می شود، از ویژگی crossorigin استفاده کنید تا درخواست واکشی منبع از حالت CORS استفاده کند. این همچنین از بارگذاری تصویر جلوگیری می کند مگر اینکه سرصفحه های CORS را تنظیم کند.

به طور مشابه، می‌توانید داده‌های مبدا متقاطع را از طریق متد fetch() واکشی کنید، که تا زمانی که سرور با هدرهای HTTP مناسب پاسخ می‌دهد، نیازی به رسیدگی خاصی ندارد.

خط مشی منابع متقابل

خط مشی منابع متقاطع (CORP) در ابتدا به عنوان یک انتخاب برای محافظت از منابع شما در برابر بارگیری توسط منبع دیگری معرفی شد. در زمینه COEP، CORP می تواند خط مشی مالک منبع را برای اینکه چه کسی می تواند یک منبع را بارگذاری کند، مشخص کند.

هدر Cross-Origin-Resource-Policy سه مقدار ممکن را می گیرد:

Cross-Origin-Resource-Policy: same-site

منابعی که same-site علامت گذاری شده اند فقط از همان سایت قابل بارگیری هستند.

Cross-Origin-Resource-Policy: same-origin

منابعی که با same-origin فقط می توانند از همان مبدا بارگیری شوند.

Cross-Origin-Resource-Policy: cross-origin

منابعی که cross-origin علامت گذاری شده اند می توانند توسط هر وب سایتی بارگیری شوند. ( این مقدار به همراه COEP به مشخصات CORP اضافه شد.)

خط مشی بازکننده Cross Origin

خط مشی بازکننده Cross Origin (COOP) به شما امکان می دهد با قرار دادن آنها در یک گروه زمینه مرور دیگر، از جدا شدن یک پنجره سطح بالا از سایر اسناد مطمئن شوید، به طوری که آنها نمی توانند مستقیماً با پنجره سطح بالا تعامل داشته باشند. برای مثال، اگر سندی با COOP یک پنجره بازشو باز کند، ویژگی window.opener آن null خواهد بود. همچنین، ویژگی .closed ارجاع بازکننده به آن true برمی گردد.

COOP

هدر Cross-Origin-Opener-Policy سه مقدار ممکن را می گیرد:

Cross-Origin-Opener-Policy: same-origin

اسنادی که به‌عنوان same-origin می‌توانند گروه زمینه مرور یکسانی را با اسنادی با مبدا یکسان که به صراحت نیز same-origin علامت‌گذاری شده‌اند، به اشتراک بگذارند.

COOP

Cross-Origin-Opener-Policy: same-origin-allow-popups

یک سند سطح بالا با same-origin-allow-popups ، ارجاع به هر یک از پنجره‌های بازشوی خود را حفظ می‌کند که یا COOP را تنظیم نمی‌کنند یا با تنظیم COOP unsafe-none از جداسازی خارج می‌شوند.

COOP

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none پیش‌فرض است و اجازه می‌دهد سند به گروه زمینه مرور بازکننده‌اش اضافه شود، مگر اینکه خود بازکننده دارای یک COOP با same-origin باشد.

خلاصه

اگر می‌خواهید دسترسی تضمینی به ویژگی‌های قدرتمندی مانند SharedArrayBuffer ، performance.measureUserAgentSpecificMemory() یا تایمرهای با وضوح بالا با دقت بهتری داشته باشید، فقط به یاد داشته باشید که سند شما باید از COEP با مقدار require-corp و COOP با مقدار same-origin استفاده کند. . در صورت عدم وجود هر کدام، مرورگر انزوا کافی برای فعال کردن ایمن آن ویژگی های قدرتمند را تضمین نمی کند. با بررسی اینکه self.crossOriginIsolated true را برمی گرداند، می توانید وضعیت صفحه خود را تعیین کنید.

با استفاده از COOP و COEP، مراحل پیاده‌سازی آن را بیاموزید.

منابع