لن يحصل Node.js 20 على أي تحديثات في 11 نوفمبر 2026؛ فالإصدارات الأمنية تقتصر فقط على 26.x و24.x و22.x، نظرًا لأن Node.js 20 وصل إلى نهاية عمره التشغيلي (End-of-Life) في 30 أبريل 2026. وكان آخر تحديث أمني تلقيته هو 20.20.2، والذي صدر في 24 مارس. ومنذ ذلك الحين، صدرت 33 ثغرة أمنية (CVE) دون توفير أي إصدار فرعي لـ 20.x. بادر بالترقية إلى الإصدار 24 أو 26 هذا الأسبوع.
وردت هذه الثغرات ضمن ثلاثة إصدارات أمنية استثنت الإصدار 20 تمامًا. ولم يتبقَّ سوى أيام قليلة على الإصدار الرابع، حيث يُصنّف الإعلان المسبق أخطر مشكلة فيه بأنها «عالية الخطورة» (HIGH) في جميع الإصدارات المدعومة.
ما الذي سيحدث في 11 نوفمبر، ولماذا تم استبعاد Node.js 20؟
سيُطلق مشروع Node.js إصدارات جديدة من 26.x و24.x و22.x يوم الأربعاء 11 نوفمبر 2026 أو بعده بفترة وجيزة. لا تزال تفاصيل ثغرات CVE غير معلنة حاليًا، وستظل سرية حتى إتاحة الإصدارات رسميًا. يُغطي دليلنا التنازلي لإصدار نوفمبر جرد بيئات التشغيل وأوامر يوم التحديث، لذا لن نتطرق إليها في هذا المقال.
لا يتواجد Node.js 20 ضمن هذه القائمة لأن المشروع توقف عن دعمه وصيانته. وتوضح صفحة نهاية العمر التشغيلي (End-of-Life) ذلك بصراحة تامة: عندما تكشف الإصدارات الأمنية الجديدة عن مشكلات، «حتى لو كانت الثغرة الأمنية نفسها تؤثر على خطوط الإصدارات التي انتهى دعمها، فلن تصدر أي تحديثات جديدة لها».
ويضيف الإشعار جملة أخرى بالغة الأهمية بالنسبة لك: «تتأثر الإصدارات المنتهية الصلاحية دائمًا عند صدور أي إصدار أمني جديد».
ما فات Node.js 20 بالفعل
صدرت ثلاثة تحديثات أمنية منذ انتهاء دعم الإصدار 20، ولم يتضمن أي منها تحديثًا لـ 20.x.
| الإشعار الأمني | ثغرات CVE | عالية | متوسطة | منخفضة | تم إصلاحها في |
|---|---|---|---|---|---|
| 18 يونيو 2026 | 12 | 2 | 6 | 4 | 26.3.1, 24.17.0, 22.23.0 |
| 29 يوليو 2026 | 11 | 3 | 5 | 3 | 26.5.1, 24.18.1, 22.23.2 |
| 21 أكتوبر 2026 | 10 | 4 | 3 | 3 | 26.12.1, 24.22.1, 22.23.4 |
| الإجمالي | 33 | 9 | 14 | 10 | لا يوجد إصدار لـ 20.x |
التعليمات البرمجية التي تمسّها هذه الإصلاحات هي صلب ما يُشغّله خادم واجهة برمجة التطبيقات (API) طوال الوقت:
- التحقق من اسم مضيف TLS. أصلح كلا تحديثي يونيو وأكتوبر ثغرات تسمح بقبول شهادة لمضيف غير صحيح.
- HTTP/2. شملت إصلاحات يوليو عالية الخطورة ثغرة استخدام الذاكرة بعد تحريرها (heap use-after-free) وخللاً يؤدي إلى استنزاف الذاكرة عن بُعد.
- نظام أسماء النطاقات (DNS). أصلح تحديث أكتوبر اقتطاع دالة
dns.resolve*()لأسماء المضيفين عند البايت الصفري (NUL byte)، وهو ما قد يخدع القوائم المسموحة (allowlist). - الضغط (Compression). أصلح تحديث أكتوبر ثغرة كتابة خارج الحدود في مفكك ترميز Brotli قد تؤدي إلى تنفيذ تعليمات برمجية عن بُعد (RCE)، وقد تناولنا تفاصيلها في مقال فحص ثغرة Brotli RCE.
اقرأ هذه القائمة بعناية؛ فالمشروع لا يُجري تقييمات للإصدارات التي انتهى دعمها، وبالتالي فإن إشعاراته لا تذكر سوى الإصدارات المدعومة. قد تكمن بعض هذه الأخطاء في أجزاء برمجية قد لا يحتويها الإصدار 20 أصلاً؛ فعلى سبيل المثال، إحدى ثغرات CVE في أكتوبر هي تراجع برمجي (regression) حصره المشروع في 26.x و24.x فقط. لذا فإن الوصف الدقيق والصريح لحالة كل ثغرة CVE في Node.js 20 هو أنها غير مصلحة وغير خاضعة للتقييم. لم يخبرك أحد بأنك بأمان، ولن يتطوع أحد للتحقق من ذلك نيابة عنك.
وما يزيد الطين بلة هو تسلسل الأخطاء البرمجية (Bug chains)؛ فإصلاح DNS في أكتوبر يُكمل إصلاحًا صدر في يونيو، وإصلاح يوليو يُكمل إصلاحًا آخر من يونيو. فكل تصحيح لاحق يُبنى على تصحيح سابق لا تملكه في نظامك.

«لكنه ما زال يعمل دون مشاكل!»
هذا صحيح، وتلك هي المشكلة بعينها.
فبيئة التشغيل التي انتهت صلاحيتها لا تتوقف فجأة عن العمل؛ إذ يطبع الأمر node -v رقم الإصدار نفسه، وتجتاز اختباراتك بنجاح، وتظل لوحات المتابعة لديك خضراء. لكن الخطر يكمن في أماكن لا تراقبها:
- التحديث الأمني بحد ذاته هو الخريطة الكاشفة. تصدر الإصلاحات والإشعارات البرمجية وتعديلات الشيفرة (commits) علنًا معًا، مما يُتيح لأي شخص قراءة ما تم تغييره بدقة في الإصدارات المدعومة والتحقق مما إذا كانت نفس الشيفرة موجودة في الإصدار 20.
- قد تستمر منصتك في نشره وتشغيله. صنّفت خدمة AWS Lambda بيئة
nodejs20.xبأنها مهملة (deprecated) في 30 أبريل 2026، ولكنها لن تمنع إنشاء دوال جديدة حتى 29 يوليو 2027، أو تحديثها حتى 31 أغسطس 2027. - الحزم وعمليات التدقيق تتجاوزه. يُحذّر مشروع Node.js من أن الحزم الشائعة تسقط دعم الإصدارات المنتهية صلاحيتها بمرور الوقت، كما تحظر العديد من عمليات تدقيق الامتثال الأمني استخدام بيئات تشغيل غير مدعومة.
اختر هدف الترقية: Node.js 24 أو 26، وتجنب 22
انتقل إلى الإصدار 24 هذا الأسبوع إذا كنت تبحث عن المسار الأقصر والأسهل، أو اختر 26 إذا كنت قادرًا على التعامل مع المزيد من الميزات المحذوفة وترغب في الحصول على أطول فترة دعم ممكنة. وتجاوز الإصدار 22؛ فعلى الرغم من حصوله على إصلاحات شهر نوفمبر، إلا أن دعمه سينتهي في 30 أبريل 2027—أي بعد أقل من ستة أشهر من الآن—مما سيضطرك لتكرار عملية الترقية بحلول الربيع القادم.
| خط الإصدار | الحالة | أحدث إصدار في 5 نوفمبر | نهاية الدعم | الخيار الأنسب لـ |
|---|---|---|---|---|
| 26.x “Lithium” | دعم طويل الأمد نشط (Active LTS) منذ 28 أكتوبر 2026 | 26.13.0 | 30 أبريل 2029 | الخدمات التي يمكنك إعادة اختبارها بالكامل الآن |
| 24.x “Krypton” | دعم صيانة طويل الأمد (Maintenance LTS) منذ 20 أكتوبر 2026 | 24.22.2 | 30 أبريل 2028 | أسرع مخرج آمن من الإصدار 20 |
| 22.x “Jod” | دعم صيانة طويل الأمد (Maintenance LTS) | 22.23.4 | 30 أبريل 2027 | لا يستحق عناء الترقية اليوم |
هذه التواريخ مأخوذة من جدول إصدارات Node.js. تحقق من المنصة التي تستخدمها قبل اتخاذ القرار؛ فعلى سبيل المثال، لا تزال بيئة تشغيل Node.js 26 في Lambda في مرحلة المعاينة العامة (public preview) وليست مشمولة باتفاقية مستوى الخدمة (SLA)، لذا يُعد الإصدار 24 الهدف الأكثر أمانًا لبيئات الإنتاج هناك في الوقت الحالي.

خطوات الترقية والتغييرات الجذرية المتوقعة
كل ما ورد في هذا الجدول مستند إلى ملاحظات الإصدار الرسمية للإصدارات 22.0.0 و24.0.0 و25.0.0 و26.0.0، بالإضافة إلى دليل الترقية من v22 إلى v24. هذه قائمة مختصرة موجهة لخدمات واجهات برمجة التطبيقات (APIs)، وليست سجل التغييرات الكامل.
| ظهر في | التغيير | المتأثرون به |
|---|---|---|
| 22 | import ... assert { type: 'json' } removed; use with |
شيفرات ESM التي تستورد ملفات JSON |
| 22 | crypto.createCipher() and createDecipher() removed |
شيفرات التشفير القديمة |
| 23 and 24 | No prebuilt 32-bit Windows or 32-bit armv7 Linux binaries; macOS 13.5 minimum | الخوادم والأجهزة الطرفية القديمة |
| 24 | OpenSSL 3.5 at security level 2: RSA, DSA, and DH keys under 2048 bits, ECC keys under 224 bits, and RC4 are prohibited | مصادقة mTLS والأنظمة المصدرية القديمة (upstreams) |
| 24 | tls.createSecurePair removed; url.parse() runtime-deprecated |
الشيفرات القديمة للشبكات |
| 24 | Stricter fetch() compliance, AbortSignal validation, stream and pipe errors now throw |
عملاء HTTP والخوادم الوسيطة (proxies) |
| 24 | V8 13.6; addons may need C++20 | الوحدات البرمجية الأصلية (Native modules) |
| 25 (if targeting 26) | SlowBuffer and fs.F_OK, R_OK, W_OK, X_OK removed; Corepack no longer ships |
الأدوات المساعدة القديمة، واستخدام Yarn أو pnpm عبر Corepack |
| 25 (if targeting 26) | IP address as TLS servername moved to End-of-Life |
العملاء الذين يتصلون عبر عناوين IP |
| 26 | _stream_* modules and writeHeader() removed; module.register() runtime-deprecated; Undici 8 |
الشيفرات القديمة للتدفقات، وأدوات التحميل المخصصة (custom loaders) |
سطر OpenSSL هو النقطة التي قد تفاجئك في صمت؛ فلن تحتاج لتغيير شيفرتك البرمجية، لكن عملية المصافحة (handshake) مع نظام قديم لأحد الشركاء ستفشل فجأة أثناء وقت التشغيل.
في فرع عمل جديد (branch)، قم بتحديث .nvmrc وحقل engines وملف Dockerfile وإعدادات CI للإشارة إلى خط الإصدار المستهدف (بالنسبة للأجهزة الجديدة، راجع دليل تثبيت Node.js). بعد ذلك، أعد التثبيت لإعادة بناء الوحدات الأصلية، وابحث عن واجهات برمجة التطبيقات المحذوفة، وشغّل أدوات التحويل البرمجي التلقائي الرسمية (codemods)، ثم ابدأ تشغيل الخدمة مع تفعيل تتبع الواجهات المهملة:
nvm install 24 && nvm use 24
rm -rf node_modules && npm ci
grep -rnE "assert \{ *type|createCipher\(|createDecipher\(|url\.parse\(|fs\.[FRWX]_OK|SlowBuffer|createSecurePair|_stream_[a-z]+|module\.register\(" \
--include="*.js" --include="*.mjs" --include="*.ts" --exclude-dir=node_modules .
npx codemod run @nodejs/import-assertions-to-attributes
npx codemod run @nodejs/crypto-createcipheriv-migration
npx codemod run @nodejs/tls-create-secure-pair-to-tls-socket
npx codemod run @nodejs/fs-access-mode-constants
NODE_OPTIONS="--trace-deprecation" npm start
راجع نتائج codemod يدويًا؛ فالأمر المتعلق بـ createCipher واضح وصريح: الشيفرة البرمجية الناتجة لن تتمكن من فك تشفير البيانات التي تم تشفيرها بالواجهة القديمة، لذا خطط لترحيل البيانات إن كانت لديك أي بيانات مشفرة بها.
لا يتوفر دليل انتقال من 24 إلى 26 على موقع Node.js حتى الآن، لذا استعن بملاحظات الإصدارين 25.0.0 و26.0.0 لإجراء هذه القفزة.
تأكد من تطابق سلوك واجهة برمجة التطبيقات (API) على الإصدار الجديد
لا تُظهر اختبارات الوحدة (Unit tests) تأثير حزمة TLS الجديدة وعميل HTTP على حركة البيانات الفعلية. وعند الترقية بمقدار إصدارين رئيسيين أو ثلاثة، ستحتاج إلى مقارنة أداء الخدمة أثناء تشغيلها قبل الترقية وبعدها، وهنا يأتي الدور المثالي للمساعد البرمجي الذكي (Coding Agent).
تتيح لك أداة Apidog CLI تمكين أدوات مثل Claude Code أو Codex أو Cursor من تشغيل مجموعات اختبارات Apidog مباشرةً من الطرفية (terminal). يمكنك إعدادها لمرة واحدة عبر:
npm install -g apidog-cli@latest
apidog login --with-token <YOUR_TOKEN>
npx -y skills add https://apidog.com # pick your agent when prompted
ثم وجّه هذا الطلب إلى مساعدك البرمجي:
My service runs on Node.js 20 in staging. Run Apidog test suite <suiteId> in project
<projectId> against environment <envId> and save reports to reports/node20. When I
redeploy on Node.js 24, run the same suite into reports/node24. List every request
whose status, body, or TLS behavior changed. Then read the service logs for deprecation
warnings and check each failure against the 22, 24, and 25 release notes: removed APIs,
changed defaults, stricter fetch and AbortSignal handling, OpenSSL key size rejections.
سيُشغّل المساعد البرمجي مجموعة الاختبارات نفسها قبل الترقية وبعدها:
apidog run --test-suite <suiteId> --project <projectId> -e <envId> \
-r cli,junit --out-dir reports/node20
# redeploy the service on the target line, restart it
apidog run --test-suite <suiteId> --project <projectId> -e <envId> \
-r cli,junit --out-dir reports/node24
أمران يضمنان دقة وموثوقية هذه المقارنة:
- لا تستخدم المعامل
-kأبدًا. فهذا الخيار يُعطّل التحقق من صحة شهادات SSL، مما يُخفي أخطاء TLS الفعلية التي تبحث عنها. - ضمّن الطلبات التي تُجريها خدمتك للأنظمة المصدرية (upstream). يظهر رفض OpenSSL كخطأ في نقطة نهاية تعتمد على نظام شريك قديم، لذا اختبر هذه المسارات ولا تكتفِ باختبار مسار الصحة
/healthفقط.
بمجرد نجاح الترقية، احتفظ بهذا الفحص ضمن مسار البناء والنشر التلقائي (CI/CD). يوضح دليل Apidog CLI لخطوط أنابيب CI/CD آلية سير العمل، بينما يشرح دليل Claude Code خطوات إعداد المساعد الذكي.
ماذا تفعل إذا لم تتمكن من الترقية هذا الأسبوع؟
شراء إصدارات مدعومة بتحديثات أمنية مدفوعة. تُحدد صفحة نهاية العمر التشغيلي لـ Node.js ثلاثة شركاء عبر برنامج استدامة منظومة OpenJS؛ حيث تقدم شركة HeroDevs دعمًا مستمرًا (Never-Ending Support) يشمل التحديثات الأمنية، وتوفر خدمة Endless Lifecycle Support من TuxCare نقل الإصلاحات إلى الإصدارات منتهية الدعم (backporting)، بينما تقدم NodeSource تقييمات للترقية ودعمًا فنيًا. ويصف المشروع هذا الخيار بأنه حل مؤقت، وهو كذلك بالفعل.
تقليص ما يمكنه الوصول إلى بيئة التشغيل. تُقلل هذه الخطوات من احتمالية التعرض لفئات الثغرات المذكورة أعلاه، لكنها لا تُصلحها جذريًا:
- إنهاء اتصالات TLS وHTTP/2 عند خادم وسيط (proxy) مدعوم أو موزع أحمال (load balancer)، والتواصل مع Node.js عبر بروتوكول HTTP/1.1 العادي داخل شبكة خاصة.
- التوقف عن فك ضغط Brotli من مصادر غير موثوقة، سواء في الطلبات الواردة أو المحتوى المستجلب.
- رفض أسماء المضيفين التي تحتوي على بايت صفري (NUL bytes) أو تمثيلات غير قياسية لعناوين IP قبل إجراء أي فحص للقائمة المسموحة أو إجراء اتصال خارجي.
- عزل الخدمة: تطبيق مبدأ الامتيازات الأقل على بيانات الاعتماد، وتقييد حركة البيانات الصادرة (egress)، وعدم مشاركة أي مفاتيح سرية مع الخدمات المحدّثة.
توثيق المخاطر كتابيًا. حدد مسؤولاً عن الترقية، وتاريخًا نهائيًا لتنفيذها، والضوابط التعويضية المطبقة، لضمان ألا يتحول هذا الحل «المؤقت» إلى وضع دائم.
الأسئلة الشائعة
هل لا يزال Node.js 20 مدعومًا؟ لا، لقد انتهى عمره التشغيلي (End-of-Life) في 30 أبريل 2026. وكان آخر إصدار له هو 20.20.2 الصادر في 24 مارس 2026، ولن يُصدر المشروع أي تحديثات أخرى له.
هل يتأثر Node.js 20 بالثغرات الأمنية الصادرة في 11 نوفمبر؟ لم تُنشر تفاصيل ثغرات CVE علنًا بعد، لذا لا يمكن لأحد الجزم بأي منها يؤثر عليه. ومع ذلك، يؤكد الإشعار الأمني أن الإصدارات منتهية الصلاحية تتأثر دائمًا عند صدور تحديث أمني جديد، والمشروع لا يقوم بتقييمها بشكل فردي.
هل ينبغي الترقية إلى Node.js 22 كبديل؟ لا؛ فعلى الرغم من أنها القفزة الأصغر، إلا أن دعمه سينتهي في 30 أبريل 2027. الترقية إلى 24 تمنحك عامًا إضافيًا من الدعم، بينما تمنحك الترقية إلى 26 عامين إضافيين.
أيهما أختار: Node.js 24 أم 26؟ اختر الإصدار 24 إذا كنت بحاجة إلى الترقية العاجلة هذا الأسبوع أو إذا كانت منصتك لا تدعم الإصدار 26 بشكل كامل بعد. واختر الإصدار 26 إذا كنت قادرًا على إعادة اختبار كل شيء بالكامل الآن، حيث يستمر دعمه حتى 30 أبريل 2029.
أنا أستخدم Node.js 25، فهل ينطبق هذا عليّ؟ نعم، فقد وصل Node.js 25 إلى نهاية عمره التشغيلي في 1 يونيو 2026، وكان 25.9.0 هو آخر إصدار له. ولن يحصل هو الآخر على أي إصلاحات في نوفمبر، كما أن الترقية إلى 26 لا تفصلك عنها سوى ترقية إصدار رئيسي واحد.
