انهيار/شبح

نظرة عامة

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

النص المختصر

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

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

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

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

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

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

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

  1. أن يكون لها نوع MIME من النوع HTML أو XML أو JSON أو text/plain
  2. أن يتضمّن عنوان استجابة HTTP‏ X-Content-Type-Options: nosniff أو أن يؤكد تحليل سريع للمحتوى (يُعرف باسم الاستكشاف) أنّ النوع صحيح
  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 إلا من خلال تسلسل مصمّم خصيصًا من تعليمات وحدة المعالجة المركزية. نفَّذ فريق V8 إجراءات وقائية ضد أمثلة مفاهيم الهجمات المعروفة، ويعمل على إجراء تغييرات في TurboFan، وهو compilador مختص بتحسين الأداء، لجعل الرمز الذي يتم إنشاؤه آمنًا حتى عند بدء هذه الهجمات. ومع ذلك، قد تؤدي تغييرات إنشاء الرموز هذه إلى هبوط في الأداء.

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

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