إذا كان خادمك يعمل بـ Node.js ويفك ضغط بيانات قادمة من الخارج، فهذا الأسبوع يخصّك. في 21 أكتوبر 2026 أصدر مشروع Node.js إصلاحاً لثغرة حرجة في مفكّك ضغط Brotli المضمَّن في بيئة التشغيل، عُرفت باسم Node2Shell ورقمها CVE-2026-111497. الثغرة كتابة خارج حدود الذاكرة، وقد ظهر بعد يوم واحد إثبات مفهوم علني نجح في تنفيذ شيفرة على نسخة Node.js غير معدّلة. في هذا المقال نشرح ما حدث ومن المعرّض للخطر وما الذي ينبغي فعله اليوم.

ما هي الثغرة بالضبط؟

Node2Shell: ثغرة Brotli الحرجة في Node.js، هل خادمك معرّض للخطر؟ — برمجة وتطوير

Brotli خوارزمية ضغط تستخدمها المتصفحات والخوادم على نطاق واسع، وتظهر في ترويسة Content-Encoding: br. يتضمن Node.js مفكّكاً لها يعمل عند استخدام وحدة node:zlib أو عند تلقّي استجابات fetch() المضغوطة. الخلل هنا أن المفكّك قد يكتب بيانات خارج المخزن المخصّص لها عند معالجة ملف مصمَّم خصيصاً، وهذا ما يسمح لمهاجم بالتأثير في ذاكرة العملية.

تقدّر سجلات CVE خطورتها بـ 9.2 على مقياس CVSS 4.0، بينما صنّفها فريق Node.js "عالية". والسبب أن الاستغلال لا يتطلب مصادقة، فيكفي أن يصل إلى تطبيقك محتوى مضغوط من مصدر لا تتحكم فيه.

ما الذي تغيّر بعد الإعلان؟

  • 21 أكتوبر: صدور الإصدارات المصحّحة ضمن الإصدار الأمني لشهر أكتوبر.
  • 22 أكتوبر: نشر إثبات مفهوم علني ينفّذ شيفرة على Node.js 24.22.0 بنظام Linux arm64، وإن كان ذلك بشكل غير مستقر.
  • حتى 23 أكتوبر: لم تُسجَّل هجمات فعلية في البرية، لكن هذه النافذة عادةً ما تضيق بسرعة بعد نشر إثبات المفهوم.

الثغرات التي تُنشر لها أدلة استغلال علنية نادراً ما تبقى بلا استغلال طويلاً؛ الفارق بين "لم يُستغل بعد" و"يُستغل الآن" قد يكون أياماً قليلة.

هل تطبيقك معرّض للخطر؟

الخطر الأكبر على الخدمات التي تفك ضغط Brotli لبيانات لا تثق بها. أمثلة شائعة:

السيناريو سبب التعرّض
Express 5 مع body-parser وتفعيل فك الضغط يقبل جسم طلب بترميز br من أي عميل
استدعاء fetch() لمصدر خارجي غير موثوق الاستجابة المضغوطة تُفك داخل العملية
استخدام مباشر لـ createBrotliDecompress() تمرير بيانات المستخدم إلى المفكّك
وكلاء الذكاء الاصطناعي الذين يجلبون صفحات ويب محتوى خارجي يُفك تلقائياً

النقطة الأخيرة تستحق الانتباه: وكلاء البرمجة وأدوات الجلب الآلي تقرأ آلاف الصفحات الخارجية، وكل واحدة منها مدخل محتمل إن كانت بيئة التشغيل غير مُحدَّثة.

الإصدارات المصحّحة

  • Node.js 26: الإصدار 26.12.1 أو أحدث.
  • Node.js 24: الإصدار 24.22.1 أو أحدث.
  • Node.js 22: الإصدار 22.23.4 أو أحدث.
  • الفروع 25 و23 و20 وما قبلها انتهى دعمها ولن تتلقى إصلاحاً، فالحل هو الانتقال إلى فرع مدعوم.

وإن كنت تستخدم مكتبة Brotli مباشرة، فالإصدارات المصحّحة منها هي 1.0.10 و1.1.1 و1.2.1، وحزمة بايثون brotli تُصلَح في 1.2.1. كما أصدر Bun الإصلاح في 1.4.4.

خطوات عملية اليوم

  1. حدّد الإصدارات المنتشرة: نفّذ node -v على الخوادم، وافحص صور الحاويات الأساسية في ملفات Dockerfile.
  2. حدّث وأعد البناء: لا يكفي تحديث الجهاز المضيف؛ كل صورة حاوية أو ملف تنفيذي يضمّن بيئة Node.js يجب إعادة بنائه ثم إعادة تشغيل العمليات.
  3. طبّق حلولاً مؤقتة إن تأخر التحديث: عطّل خيار inflate في body-parser، أو ارفض الطلبات ذات الترميز br على مستوى الوكيل العكسي أو الحافة.
  4. راجع التوزيعات: حتى 23 أكتوبر لم تكن حزم Debian لـ nodejs وbrotli قد حُدّثت، فتحقق من مصدر الحزمة قبل الافتراض بأنك آمن.
  5. راقب السجلات: ابحث عن انهيارات غير مفسَّرة في العمليات أو طلبات بترميز br من مصادر غريبة.

حل مؤقت لا يغني عن التحديث

منع الترميز br في الحافة يقلّل سطح الهجوم، لكنه لا يغطي الاستدعاءات الصادرة من تطبيقك عبر fetch(). لذلك اعتبره جسراً قصيراً لا حلاً دائماً.

أسئلة شائعة

هل يكفي تحديث حزم npm لمعالجة المشكلة؟

لا. الثغرة داخل بيئة التشغيل نفسها لا في حزمة npm، لذا يلزم تحديث Node.js ذاته وإعادة تشغيل العمليات التي تعمل به.

هل التطبيقات التي لا تستقبل ملفات من المستخدمين آمنة؟

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

ماذا أفعل إن كنت على Node.js 20؟

هذا الفرع انتهى دعمه ولن يصله إصلاح. انتقل إلى 22 أو 24 أو 26 في أقرب وقت، فالترقية هنا أمر أمني لا مجرد تحسين.

الخلاصة

Node2Shell تذكير بأن مفكّكات الضغط من أخطر المكونات لأنها تعالج بيانات خارجية بشيفرة منخفضة المستوى. الإجراء المطلوب واضح: حدّث إلى 26.12.1 أو 24.22.1 أو 22.23.4، أعد بناء الصور وأعد التشغيل، وانتقل من الفروع المنتهية الدعم. وحتى تكتمل الترقية، عطّل فك ضغط Brotli حيث لا تحتاجه.

المصادر: Qualys، Sysdig، Wiz