انهيار/شبح

نظرة عامة

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

الملخّص

بصفتك مستخدمًا يتصفّح الويب، عليك التأكّد من تحديث نظام التشغيل والمتصفّح. بالإضافة إلى ذلك، يمكن لمستخدمي 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. أن تكون تستخدم HTML أو XML أو JSON أو نص/عادي من نوع MIME
  2. يتضمّن المنتج إما عنوان استجابة HTTP X-Content-Type-Options: nosniff أو تحليل سريع للمحتوى ("الاستقصاء") يؤكّد أنّ النوع صحيح.
  3. لا تسمح سياسة مشاركة الموارد المتعددة المصادر (CORS) صراحةً بالوصول إلى المستند.

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

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

وفقًا لمقاييس سلوك المستخدمين، يتوفّر الكثير من ملفات JavaScript وCSS التي يتم إرسالها باستخدام أنواع text/html أو text/plain MIME. ولتجنّب حظر الموارد التي يتم وضع علامة عليها عن طريق الخطأ كمستندات، يحاول 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، المجمِّع المحسّن، الذي يجعل الرمز الذي يتم إنشاؤه آمنًا حتى عند بدء هذه الهجمات. ومع ذلك، قد تؤدي هذه التغييرات في إنشاء التعليمات البرمجية إلى فرض عقوبة على الأداء.

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

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