تحديثات أمان Node.js في أكتوبر 2026: ماذا ترقّي ولماذا
في 21 أكتوبر 2026 أصدر مشروع Node.js تحديثات أمان للخطوط الثلاثة المدعومة: v26.12.1 وv24.22.1 وv22.23.4. التحديثات تعالج عشر ثغرات، أربع منها مصنّفة عالية الخطورة، وأبرزها كتابة خارج حدود الذاكرة في فك ضغط Brotli يقول المشروع إنها تسمح بتنفيذ كود عن بعد. الإصلاح متاح الآن لكل الخطوط المدعومة، فالترقية هنا عمل روتيني، والأفضل أن تتم وهي ما زالت كذلك.
ثلاثة أنواع من الإصلاح في إصدار واحد
الثغرات الأربع العالية ليست خللًا واحدًا. كل منها في جزء مختلف من بيئة التشغيل، ويصل إليه نوع مختلف من الكود.
فك ضغط Brotli (CVE-2026-111497، في الخطوط الثلاثة): خلل ذاكرة في كود أصلي يفك ضغط البيانات. قراءتي هنا استنتاج عام وليست من نص التنبيه: الكود الذي يصل إليه هو كود يفك ضغط بيانات Brotli يتحكم فيها طرف آخر، مثل خادم يقبل أجسام طلبات مضغوطة، أو عميل يجلب ردودًا من واجهات خارجية ويفك ضغطها.
فحص اسم المضيف في TLS (CVE-2026-106069 في الخطوط الثلاثة، وCVE-2026-105483 في 26 و24): خللان منطقيان في التحقق من أن الشهادة تخص المضيف المقصود، الأول حين يُفسَّر المضيف بتساهل على أنه عنوان IP، والثاني حين يُكتب العنوان بأرقام عريضة. وهناك ثغرة متوسطة قريبة، CVE-2026-106072، تسمح لأسماء DNS في الشهادة بمصادقة عناوين IPv4 مكتوبة بصيغة غير قياسية. الكود المعرّض هو أي كود يتصل بمضيف أو عنوان جاء من مستخدم أو من إعداد webhook أو من ملف إعدادات.
معالجة أسماء DNS (CVE-2026-105482، في الخطوط الثلاثة): الدالة dns.resolve تقتطع الأسماء التي تحتوي على المحرف NUL. وكاستنتاج عام أيضًا: هذا يهم حيث تحلّ اسمًا لم تكتبه بنفسك، مثلًا لتقارنه بقائمة مسموحة.
بقية الثغرات متوسطة أو منخفضة: مقبس keep-alive يعالج ردًا كُتب قبل إرسال الطلب، وقيم عشوائية تتكرر في لقطات بدء التشغيل، ومشكلات في نموذج الصلاحيات وفي ZipFile. ويحدّث الإصدار كذلك مكتبات مدمجة منها c-ares وUndici وقائمة شهادات الجهات المصدّقة، التي أُزيلت منها الثقة بالجهة الوسيطة المخترقة التابعة لـeMudhra.
افحص الإصدار الذي تشغّله فعلًا
جهازك الشخصي غالبًا أقل مكان يهم فحصه. بيئة التشغيل التي تخدم الزوار تأتي من صورة Docker أساسية، والتي تشغّل اختباراتك تأتي من صورة CI، وقد يختلف كل منها عن الآخر.
# on any machine, or inside a running container
node -v
# what a base image really ships, without trusting its tag name
docker run --rm node:22 node -v
قارن كل نتيجة بالإصدارات المصلَحة: 26.12.1 أو أحدث على الخط 26، و24.22.1 أو أحدث على 24، و22.23.4 أو أحدث على 22. الوسم node:22 لا يتغير إلا حين تسحبه من جديد، فقد تبقى نسخة مخزّنة على خادم البناء على الإصدار القديم. وإذا كان ملف Dockerfile يثبّت إصدارًا محددًا، فارفعه.
الإصدار 20 لا يحصل على شيء
وصل Node 20 المعروف باسم Iron إلى نهاية عمره، وكان آخر تحديث له في 24 مارس 2026، ولم يُذكر في هذا الإصدار. والمشروع يقولها صراحة: الإصدارات المنتهية تتأثر دائمًا حين يصدر تحديث أمان. فعبارة "نحن على 20 ولم يُذكر في القائمة" تعني عكس الأمان تمامًا. والخطوط الفردية مثل 25 و23 منتهية أيضًا. توصية المشروع أن الإنتاج يعمل على خطوط LTS النشطة أو خطوط الصيانة فقط، أي 24 أو 22 اليوم، أو 26 إن قبلت إصدارًا من مرحلة Current.
node -v داخل حاوية الإنتاج لا على جهازك، وقارن النتيجة بـ26.12.1 أو 24.22.1 أو 22.23.4.الخطوة التالية صغيرة: ارفع إصدار الصورة الأساسية المثبّت في Dockerfile وفي إعدادات CI إلى الإصدار المصلَح لخطك، وأعد البناء بلا ذاكرة مؤقتة، ودع الاختبارات تعمل. وإن كنت ما زلت على Node 20 فخطّط للانتقال إلى 22 أو 24 الآن، لا عند التنبيه القادم. المصدر: صفحة تحديثات الأمان على nodejs.org بتاريخ 21 أكتوبر 2026.
ملاحظات القراء