الخلاصة

  • استطاع محول HTML أن يقرأ بعد نهاية مخزنه المؤقت وأن يضع في الاستجابة أجزاء من طلبات أخرى، فانكسر العزل المتوقع بين عملاء العملية المشتركة في الحافة.
  • أوقفت مفاتيح التعطيل وتصحيح المحلل إفشاءات جديدة، لكن الصفحات التي خرجت إلى مخابئ خارجية وبيانات الاعتماد المحتمل تعرضها احتاجت إلى استرداد مستقل لا يثبته التصحيح وحده.

الموقع الذي فعّل الخلل ليس بالضرورة صاحب البيانات

في 17 فبراير/شباط 2017 أبلغ Project Zero شركة Cloudflare بأن صفحات تمر عبر شبكتها تضم مواد غريبة عنها: ملفات تعريف ارتباط، ورموز مصادقة، ومحتوى طلبات POST، وأجزاء أخرى من ذاكرة العملية. وكانت محركات بحث قد خزنت بعض تلك الاستجابات.

يوحي اسم Cloudbleed بمقارنة مع Heartbleed، لكن البنية متعددة العملاء هي الفارق الحاسم هنا. كانت عملية مشتركة تحوّل صفحات عملاء كثيرين. قد يفتح HTML مشوه من موقع واحد المسار المعيب، بينما تأتي البايتات المجاورة التي تدخل استجابته من طلب عميل آخر.

لذلك لا تمثل قائمة النطاقات المحفزة قائمة ضحايا. لم يكن على العميل تشغيل الميزة المتأثرة؛ كان يكفي أن يشارك العملية الخطأ في اللحظة الخطأ. لم ينكسر شرط «حلّل هذه الصفحة بصورة صحيحة» فقط، بل شرط أشد: لا يقرأ عمل مستأجر ذاكرة مستأجر آخر ولا يرسلها.

أسلوب تخزين جديد أيقظ خطأ مؤشّر قديماً

عزت Cloudflare الخلل إلى شيفرة قديمة مولدة بواسطة Ragel وتستخدمها ثلاث تحويلات: إخفاء عناوين البريد، وServer-Side Excludes، وإعادة كتابة HTTPS تلقائياً. غياب تعليمة fhold كان يترك مؤشراً عند نهاية المخزن، ثم يتعامل المستدعي مع الناتج كأنه مجال صالح وينسخ بعد الحد.

ارتفع التكرار بعد نشر المحلل cf-html الذي غيّر سلوك التخزين المؤقت. وفصلت Cloudflare بين المكان والظرف: لم يكن الخلل في Ragel نفسه ولا في cf-html نفسه. غيّر المكوّن الجديد شروط الشيفرة القديمة فجعل العيب الكامن يتكرر.

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

تسلسل إيقاف بأوقات مطلقة

امتلك مشغل الحافة أول سلطة استجابة. يسجل الجدول الزمني التفصيلي بتوقيت UTC تلقي تفاصيل الخلل عند 00:32 في 18 فبراير/شباط، وتعطيل إخفاء البريد عالمياً عند 01:19، وتعطيل إعادة كتابة HTTPS عند 04:24، ونشر التصحيح الذي يحمل مفتاح cf-html عالمياً عند 07:22. لم يكن لدى Server-Side Excludes مفتاح عالمي مستقل، فاضطر المهندسون إلى بنائه ونشره.

مفتاح التعطيل ليس رفاهية تشغيلية، بل جزء من أمان الميزة. بدونه تُكتب شيفرة أثناء الأزمة. وبه يمكن التضحية بتحويل اختياري مع إبقاء عمل الوكيل غير المرتبط به.

قالت Cloudflare إن مفاتيح SSL الخاصة بالعملاء لم تكن متاحة عبر هذا المسار لأن إنهاء TLS كان يجري في نسخة NGINX منفصلة. لكن ذاكرة عملية HTTP احتوت مفتاحاً خاصاً لتشفير الاتصالات بين أجهزة Cloudflare وعدداً قليلاً من أسرار المصادقة الداخلية. حمى العزل فئة شديدة الأثر، لكنه لم يجعل مجموعة الأسرار القابلة للوصول فارغة.

أما إعادة الكتابة اللاحقة بلغة Rust فرفعت الحد المحلي: تمنع الشيفرة الآمنة الوصول العادي خارج الذاكرة المخصصة. وهذا يزيل فئة من الأخطاء بدلاً من انتظار المراجعين لاكتشاف كل مؤشّر. لكنه لا يثبت صحة الصلاحيات ولا يؤمن المكتبات غير الآمنة تلقائياً.

المعدل تقدير لا إحصاء كامل

حدد التقرير الأول الفترة الأشد بين 13 و18 فبراير، وقدّر طلباً محتملاً للتسريب بين كل 3.3 ملايين طلب، أي نحو 0.00003 في المئة. وقدّر التحليل اللاحق 1,242,071 حالة تحفيز من 22 سبتمبر/أيلول 2016 حتى 18 فبراير/شباط 2017: منها 605,037 قبل 13 فبراير من أقل من 180 موقعاً، و637,034 في الأيام الخمسة الأخيرة من 6,457 موقعاً.

تحمل الأرقام حدود أدلتها. كانت السجلات التفصيلية عينة بنسبة واحد في المئة ومتاحة من 8 إلى 18 فبراير فقط. حذفت التفاصيل الأقدم، فاعتمد تقدير الفترة السابقة على تحليلات مجمعة وبيانات الأعطال. لم تجد Cloudflare دليلاً على استغلال خبيث في السجلات التي راجعتها؛ وهذا لا يثبت أن الاستغلال لم يحدث قط.

عدد الحالات ليس عدد الضحايا. ولا يبين المتوسط العالمي حساسية رمز بعينه. كما أن غياب الأثر في عينة لا يغلق التاريخ.

التصحيح لا يستدعي البايتات المرسلة

أوقف تعطيل الميزات استجابات ملوثة جديدة، ولم يسحب النسخ التي خرجت. قدّرت Cloudflare أن عناكب البحث أنتجت أكثر من نصف حالات التحفيز، وأزالت أكثر من 80 ألف صفحة فريدة من المخابئ، وعثرت في مخابئ خارجية على بيانات مرتبطة بـ150 عميلاً.

لا يحدد أي رقم سقف المتضررين. ليست كل صفحة أزيلت حاملة لسر، و150 عميلاً معروفاً لا تعني أن العدد الكلي 150، وتنظيف المخبأ لا يثبت غياب النسخ الخاصة. للاحتواء وللاسترداد معيارا نهاية مختلفان.

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

حد مشترك أدنى وقرارات محلية قابلة للرجوع

تفرض أولوية الشيفرة العاملة لدى Heng Lu نتيجة قابلة للملاحظة: لا ترسل الحافة ذاكرة عابرة للعملاء، ويمكن التحقق من حالة الميزات، وتفشل البيانات القديمة، ويعالج أصحاب المخابئ الحقيقيون البقايا. عبارة «تم الحل» لا تصنع تلك الحقائق.

يمكن أن تكون المواصفة الأولية الدنيا قصيرة ومطلقة: لا تحتوي الاستجابة إلا بيانات مخولة لتلك الاستجابة. تبقى التحويلات الاختيارية واختيار المحلل ووتيرة النشر والتعطيل قرارات محلية. يمكن تغييرها أو رفضها من دون إضعاف العزل المشترك أو فرض الخطر نفسه على كل عميل.

لم يثبت Cloudbleed استحالة البنية المشتركة. أثبت أن المشاركة تحتاج غشاءً صلباً، وأن كل مسار اختياري يعبره يجب أن يستطيع الاختفاء قبل اختفاء الخدمة كلها.

المصادر