انهيار/شبح

نظرة عامة

في 3 كانون الثاني (يناير)، كشف Project Zero عن ثغرات أمنية في وحدات المعالجة المركزية الحديثة التي يمكن لأي عملية استخدامها لقراءة (في أسوأ حالاته) الذاكرة العشوائية - بما في ذلك الذاكرة التي لا تنتمي إلى تلك العملية. وقد أطلقا على هذه الثغرات الأمنية اسم Spectre وMeltdown. ما الذي يفعله Chrome للمساعدة في الحفاظ على أمان الويب، وما الذي يجب أن يفعله مطورو الويب لمواقعهم الخاصة؟

النص المختصر (TL؛ DR)

بصفتك مستخدمًا يتصفّح الويب، عليك التأكّد من تحديث نظام التشغيل والمتصفح. بالإضافة إلى ذلك، يمكن لمستخدمي Chrome تفعيل ميزة عزل الموقع الإلكتروني.

إذا كنت مطوّر برامج على الويب، نصائح فريق Chrome:

  • إذا أمكن، منع ملفات تعريف الارتباط من الدخول إلى ذاكرة عملية العارض من خلال استخدام سمتَي ملف تعريف الارتباط SameSite وHTTPOnly ومن خلال تجنُّب القراءة من document.cookie
  • تأكَّد من صحة أنواع MIME وحدِّد عنوان X-Content-Type-Options: nosniff لأي عناوين URL تشتمل على محتوى خاص بالمستخدم أو حسّاس، وذلك للاستفادة إلى أقصى حدّ من ميزة حظر القراءة المتعدّدة المصادر للمستخدمين الذين فعّلوا ميزة "عزل المواقع الإلكترونية".
  • فعِّل عزل الموقع وأخبر فريق Chrome إذا كان ذلك يسبب مشاكل لموقعك الإلكتروني.

إذا كنت تتساءل عن سبب فائدة هذه الخطوات، يُرجى مواصلة القراءة.

المخاطر

هناك مجموعة كبيرة من التفسيرات لهذه الثغرات، لذلك لن أضيف سببًا آخر. إذا كنت مهتمًا بكيفية استغلال هذه الثغرات الأمنية، أنصحك بالاطّلاع على مشاركة المدونة التي نشرها زملائي من فريق Google Cloud.

من المحتمل أن يتيح كل من Meltdown وSpectre لعملية قراءة بيانات من المفترض ألا تكون قادرة على فهمها. في بعض الأحيان، يمكن لمستندات متعددة من مواقع مختلفة أن تشارك عملية في Chrome في نهاية المطاف. يمكن أن يحدث هذا عندما يفتح أحدهما الآخر باستخدام window.open أو <a href="..." target="_blank"> أو إطارات iframe. إذا كان هناك موقع إلكتروني يحتوي على بيانات خاصة بمستخدم محدّد، هناك احتمال أن يستخدم موقع إلكتروني آخر هذه الثغرات الأمنية الجديدة لقراءة بيانات هذا المستخدم.

إجراءات الحدّ

هناك جهود متعددة يبذلها فريق الدعم في Chrome وفريق V8 الهندسي للحدّ من مخاطر هذا التهديد.

عزل الموقع

يمكن تقليل تأثير استغلال Spectre بنجاح إلى حد كبير من خلال منع البيانات الحساسة من مشاركة أي عملية باستخدام رمز يتحكّم فيه المهاجم. يعمل فريق Chrome على ميزة لتحقيق ما يُعرف باسم "عزل الموقع":

لم يتم تفعيل "عزل الموقع" تلقائيًا حتى الآن نظرًا لوجود مشكلتين معروفتين ويرغب فريق Chrome في الحصول على أكبر قدر ممكن من الاختبارات الميدانية. إذا كنت مطوّر برامج على الويب، عليك تفعيل ميزة "عزل المواقع الإلكترونية" والتحقّق مما إذا كان موقعك الإلكتروني لا يزال يعمل. إذا كنت تريد تفعيل الميزة الآن، يجب تفعيل "chrome://flags#enable-site-per-process". إذا وجدت موقعًا لا يعمل، يُرجى مساعدتنا عن طريق الإبلاغ عن خطأ، وذكر أنه تم تفعيل عزل الموقع.

حظر المستندات على مواقع إلكترونية متعددة

حتى عندما يتم وضع جميع الصفحات من مواقع إلكترونية متعددة في عمليات منفصلة، يظل بإمكان الصفحات طلب بعض الموارد الفرعية من مواقع إلكترونية متعددة بشكل شرعي، مثل الصور وJavaScript. وللمساعدة في منع المعلومات الحساسة من تسريب هذه المعلومات، يتضمّن عزل الموقع ميزة "حظر المستندات عبر المواقع الإلكترونية" التي تحد من استجابات الشبكة التي يتم تسليمها إلى عملية العارض.

يمكن للموقع الإلكتروني طلب نوعَين من البيانات من خادم: "المستندات" و"الموارد". وتكون المستندات هنا بتنسيق HTML وXML وJSON والملفات النصية. ويمكن لموقع الويب استلام المستندات من نطاقه الخاص أو من نطاقات أخرى ذات عناوين CORS مقبولة. تتضمن الموارد أشياء مثل الصور وJavaScript وCSS والخطوط. يمكن تضمين الموارد من أي موقع.

تمنع "سياسة حظر المستندات على مواقع إلكترونية متعددة" العملية من تلقّي "مستندات" من مصادر أخرى في الحالات التالية:

  1. وهي تستخدم نوع MIME أو نص/عادي بتنسيق HTML أو XML أو JSON أو
  2. تتضمن إما عنوان استجابة HTTP X-Content-Type-Options: nosniff، أو تحليل سريع للمحتوى ("sniffing") يؤكد أن النوع صحيح
  3. لا تسمح سياسة مشاركة الموارد المتعددة المصادر (CORS) بالوصول بشكل صريح إلى المستند.

تتم معالجة المستندات التي تم حظرها بموجب هذه السياسة على أنّها فارغة، مع أنّ الطلب لا يزال يحدث في الخلفية.

على سبيل المثال: تخيل أنّ مهاجمًا ينشئ علامة <img> تتضمّن ملف JSON يحتوي على بيانات حسّاسة، مثل <img src="https://yourbank.com/balance.json">. وبدون ميزة "عزل الموقع"، تصل محتويات ملف JSON إلى ذاكرة عملية العارض، وعندها يلاحظ العارض أنّها ليست تنسيق صورة صالحًا ولا يعرض أي صورة. ومع ذلك، مع Spectre، توجد الآن طريقة محتملة لقراءة هذا الجزء من الذاكرة. قد يؤدي حظر المستندات على مواقع إلكترونية مختلفة إلى منع محتوى هذا الملف من الدخول إلى ذاكرة العملية التي يعمل بها العارض لأنّ نوع MIME محظور من خلال حظر المستندات على مواقع إلكترونية متعددة.

وفقًا لمقاييس سلوك المستخدمين، هناك الكثير من ملفات JavaScript و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 58 والإصدارات الأحدث فقط.

HTTPOnly وdocument.cookie

إذا كانت ملفات تعريف الارتباط لموقعك الإلكتروني تُستخدم من جهة الخادم فقط، وليس من خلال JavaScript للعميل، هناك طرق يمكنك من خلالها منع بيانات ملف تعريف الارتباط من الدخول إلى عملية العارض. يمكنك ضبط سمة ملف تعريف الارتباط HTTPOnly، التي تمنع صراحةً الوصول إلى ملف تعريف الارتباط من خلال النص البرمجي من جهة العميل على المتصفّحات المتوافقة، مثل Chrome. في حال لم يكن من الممكن ضبط HTTPOnly، يمكنك المساعدة في الحدّ من تعرّض تحميل بيانات ملفات تعريف الارتباط للعملية المعروضة من خلال عدم قراءة document.cookie ما لم يكن هناك ضرورة مُلحّة.

عند الربط بصفحة أخرى باستخدام target="_blank"، يمكن للصفحة المفتوحة الوصول إلى كائن window، ويمكنها الانتقال من صفحتك إلى عنوان URL مختلف، وبدون ميزة "عزل الموقع"، ستكون العملية نفسها مثل صفحتك. لحماية صفحتك بشكل أفضل، يجب دائمًا تحديد rel="noopener" للروابط المؤدية إلى صفحات خارجية تفتح في نافذة جديدة.

موقّتات عالية الدقة

لاستغلال Meltdown أو Spectre، يحتاج المهاجم إلى قياس المدة التي يستغرقها قراءة قيمة معينة من الذاكرة. لهذا، هناك حاجة إلى مؤقت موثوق ودقيق.

إحدى واجهات برمجة التطبيقات التي توفّرها منصّة الويب هي performance.now() التي تبلغ دقتها 5 ميكرو ثانية. كإجراء للتخفيف من حدة التوتر، خفّضت جميع المتصفحات الرئيسية درجة دقة performance.now() بهدف زيادة صعوبة تحمُّل الهجمات.

ويمكنك أيضًا استخدام SharedArrayBuffer أيضًا للحصول على موقّت عالي الدقة. ويتم استخدام المورد الاحتياطي بواسطة عامل مخصّص لزيادة العدّاد. تقرأ سلسلة التعليمات الرئيسية هذا العدّاد وتستخدم ذلك كموقت. في الوقت الحالي، قررت المتصفّحات إيقاف SharedArrayBuffer إلى أن يتم تنفيذ إجراءات الحدّ الأخرى.

V8

لاستغلال Spectre، يجب أن يكون هناك تسلسل معد خصيصًا لتعليمات وحدة المعالجة المركزية (CPU). أجرى فريق V8 إجراءات لتخفيف آثار الهجمات المعروفة، وهو يعمل على إجراء تغييرات في TurboFan، المركب البرمجي المحسّن، والتي تجعل الرموز التي تم إنشاؤها آمنة حتى عند بدء هذه الهجمات. ومع ذلك، قد تؤثر تغييرات إنشاء التعليمات البرمجية هذه على الأداء.

الحفاظ على أمان الويب

كان هناك قدر كبير من الشك حول اكتشاف سلسلتَي Spectre وMeltdown وتداعياتهما. أتمنى أن تسلّط هذه المقالة الضوء على الجهود التي يبذلها فريقا Chrome وفريق V8 للحفاظ على أمان النظام الأساسي للويب، وكيفية استفادة مطوّري الويب من ميزات الأمان الحالية. إذا كانت لديك أي أسئلة، يُرجى التواصل معي على Twitter.