الخلاصة

  • في 2 يوليو 2019 وصلت قاعدة WAF مجازة وظيفياً إلى شبكة Cloudflare العالمية خلال ثوانٍ؛ تسبب تعبير نمطي في تراجع بحثي هائل، فاستنفدت عمليات HTTP/HTTPS المعالجات وظهرت أخطاء 502 مدة 27 دقيقة.
  • لا يقتضي الإصلاح التخلي عن سرعة الدفاع عند هجوم فعلي، بل فصل صلاحية الطوارئ العالمية عن التغيير العادي، وفرض سقف للموارد، وتوسيع التعرض على مراحل، والإبقاء على الإيقاف والمصادقة وحالة الخدمة خارج نطاق تعطل الحافة.

نجح الناقل واتسعت الصلاحية

في الساعة 13:31 بالتوقيت العالمي دُمج طلب تغيير بعد مراجعته. وفي 13:37 نفذ TeamCity البناء والاختبارات. وعند 13:42 بدأ مسار آلي نشر تعديل صغير في قاعدة لاكتشاف هجمات XSS.

أدى Quicksilver مهمته. كان نظام إعدادات Cloudflare مصمماً لإزالة المسافة بين القرار والنقاط الطرفية. يذكر تقرير الحادث أنه كان يغطي أكثر من 180 مدينة، ويعالج نحو 350 تغييراً في الثانية في المتوسط، ويحقق 2.29 ثانية عند المئين 99 للانتشار العالمي. ووصفت مقالة هندسية لاحقة القدرة نفسها عبر مئات المدن.

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

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

هنا انفصل الاعتماد عن الصلاحية. راجع البشر قراراً منطقياً، ثم منح النظام ذلك القرار سلطة التنفيذ على حركة العالم. اختصر Quicksilver الزمن بين الدمج وأقصى نطاق للأثر حتى اكتمل الانتشار قبل أن تتمكن المراقبة من تسعير العملية.

الجواب الصحيح قد يكون باهظاً إلى حد الانقطاع

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

قد يبقى الجواب النهائي صحيحاً، فيما تختفي الخدمة أثناء الوصول إليه.

للقاعدة الأمنية إذن عقدان منفصلان. العقد الدلالي يحدد ما يجب منعه. وعقد الموارد يحد CPU والذاكرة وزمن الطابور اللذين يمكن لأي طلب استهلاكهما. نجاح أمثلة السماح والحجب لا يثبت العقد الثاني.

كان WAF داخل مسار خدمة HTTP/HTTPS، ويقيّم آلاف القواعد على حجم هائل من الطلبات. وحين أصبح التعبير الجديد شديد الكلفة على بعض المدخلات، استنفدت عمليات الخدمة أنويتها. فتأثرت وظائف الوكيل وCDN وWAF معاً.

بقيت لدى خوادم الويب الأمامية أنوية متاحة لإنشاء صفحات 502، لكنها لم تستطع الوصول إلى عمليات HTTP/HTTPS. لذلك لا يصح اختزال الواقعة في موت كل نواة على كل خادم: بقيت طبقة عرض الخطأ، بينما تعطلت طبقة تنفيذ الخدمة الحرجة.

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

جاء الإنذار بعد وصول القاعدة

في 13:45 أطلق اختبار اصطناعي خارجي للـWAF أول تنبيه PagerDuty. ثم فشلت اختبارات شاملة أخرى، وانخفضت الحركة العالمية، وانتشرت أخطاء 502، وأبلغت نقاط الحضور عن نفاد المعالج. تقول المذكرة الأولية إن حركة Cloudflare هبطت 82% في أسوأ لحظة؛ ولا يعني ذلك 82% من الإنترنت.

ظن المستجيبون أولاً أنهم أمام هجوم غير مسبوق. وبحلول 14:00 أشارت بيانات الأداء والسجلات وstrace إلى WAF، واستُبعد الهجوم. وفي 14:02 طُرح global terminate، أي تعطيل مكوّن واحد في العالم كله.

لم يناسب التراجع العادي سرعة الأزمة. كان الرجوع الدقيق يتطلب بناء WAF كاملاً مرتين. فأصبح الإجراء الممكن أوسع: سحب المكوّن كله أولاً، ثم عزل القاعدة واختبار التصحيح وإعادته لاحقاً.

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

نُفذ الإيقاف العالمي في 14:07. وبحلول 14:09 عاد CPU والحركة إلى المستوى المتوقع، واستمرت آليات حماية أخرى. ثم أخرجت Cloudflare حركة العملاء الدافعين من مدينة واحدة واستخدمت جزءاً من الحركة هناك لاختبارات إثبات ونفي. وفي 14:52 أعادت WAF عالمياً.

يصف التقرير المفصل 27 دقيقة من عدم الإتاحة، بينما قالت المذكرة الأولى «نحو 30 دقيقة». الفرق الجوهري يقع في الساعات التشغيلية: ثوانٍ لمنح السلطة، دقائق لاكتشاف الضرر، إيقاف مكوّن كامل لسحبها، وأكثر من ساعة منذ البداية إلى استعادة مدروسة.

المحرك الآمن يضيّق ما يستطيع المؤلف فعله

أعلنت Cloudflare إعادة حماية CPU، ومراجعة القواعد البالغ عددها 3,868، وإضافة تحليل الأداء، والانتقال إلى RE2 أو محرك بلغة Rust. وفي يوليو 2020 قالت إن WAF انتقل في يوليو 2019 من قاعدة PCRE إلى محرك مستوحى من RE2.

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

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

لا يدّعي RE2 أنه الأسرع في كل حالة، وقد تحمل التعبيرات المعقدة كلفة ثابتة أعلى. كما توثق PCRE2 حدوداً لعدد المطابقات والعمق والذاكرة. لا تثبت المصادر أن هذه الضوابط العامة كانت مفعلة في مسار Cloudflare عام 2019.

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

ولا يضبط محرك التعبير وحده فك الترميز والتطبيع والمحللات والتخزين المؤقت وتفاعل القواعد. لذلك تحتاج السلسلة الكاملة إلى ميزانيات وحمل ممثل ومدخلات عدائية.

مساران بدلاً من حق عالمي واحد

فرّقت خطة Cloudflare بين نشر مرحلي للقواعد المعتادة وإرسال عالمي فوري عند هجوم نشط. يحافظ ذلك على قيمة السرعة ويمنع تحولها إلى تفويض يومي.

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

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

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

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

لا يجوز أن يختفي التحكم مع الشيء المحكوم

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

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

تقدم أولوية الشفرة العاملة عند Heng Lu معياراً واضحاً. المراجعة والتذكرة وخطة الرجوع وسائل تنسيق؛ لا تحد CPU بذاتها. حين تستنفد الشفرة الفعلية الجهاز وتغلق طريق التحكم بها، لا تنتج كلمة «معتمد» أماناً.

كما أن التحكم التقني ليس تحكماً عملياً. امتلاك أمر إيقاف لا يكفي إذا اعتمدت مصادقته وواجهته وأشخاصه وبناؤه على المكوّن المطلوب إيقافه. تُقاس السلطة في لحظة العطل.

حدود الأدلة

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

قالت Cloudflare صراحة إن الحادث لم يكن هجوماً. لا ينسب هذا المقال نية عدائية أو تشغيلاً متعمداً. لم يكتب Quicksilver التعبير ولم يزل حماية CPU؛ وسّع النتيجة لأن الاعتماد المعتاد استطاع استدعاء قدرته الكاملة.

تثبت مقالة 2020 انتقال المحرك وآثاراً مقاسة في ذيل الأداء، ولا تثبت استمرار اكتمال كل التزامات 2019. تدعم الواقعة نموذج تحكم، لا عصمة شركة أو تقنية من الفشل مستقبلاً.

المصادر