دليل عملي

Next.js 16.4.1 و15.5.28: إصلاح ثغرات RCE على VPS

الأمان والمراقبة9 دقائق للقراءةعدد الخطوات: 10

في 14 أكتوبر 2026 أصدر Next.js تحديثًا استثنائيًا خارج الدورة المعتادة: الإصداران 16.4.1 و15.5.28. يعالج هذا التحديث ثغرتين حرجتين لتنفيذ التعليمات عن بُعد لا تتطلبان أي حساب، إضافةً إلى ثغرة حجب خدمة. على خادم VPS لا توجد منصة تحدّث تطبيقك نيابةً عنك: عليك رفع الإصدار ومراجعة ملف القفل وإعادة البناء وإعادة تشغيل العملية الصحيحة. بل قد تعيد عملية نشر Docker استخدام طبقة مخزّنة مؤقتًا فتعود النسخة القديمة إلى الإنتاج. إليك كيف تعرف خلال عشر دقائق إن كنت معرّضًا، وكيف تحدّث، وكيف تثبت أن الإصلاح يعمل فعلًا.

المحتويات· ما الذي صدر في 14 أكتوبر1/13
  1. 01ما الذي صدر في 14 أكتوبر
  2. 02أهم ما يجب تذكّره
  3. 03دون use cache ولا SVG: لماذا لا يكفي ذلك
  4. 04أي إصدار تثبّت بحسب فرعك
  5. 05معرفة ما يعمل فعلًا
  6. 06جرد الوضع في خمسة فحوص
  7. 07التحديث ثم مراجعة ملف القفل
  8. 08إعادة النشر بحسب بيئتك
  9. 09إذا تعذّرت إعادة النشر اليوم
  10. 10إجراءات تخفيف مؤقتة وليست إصلاحات
  11. 11شغّل npm audit بعد التحديث
  12. 12بعد الإصلاح: المراقبة والتخطيط للفرع 15
  13. 13التوثيق الرسمي

ما الذي صدر في 14 أكتوبر

في 14 أكتوبر 2026 نشر فريق Next.js تحديثًا أمنيًا خارج الدورة المعتادة: الإصدار 16.4.1 لفرع Active LTS والإصدار 15.5.28 لفرع Maintenance LTS. يعالج التحديث ثلاث ثغرات مرتبطة بمكتبات أصلية يعتمد عليها: ثغرتان حرجتان لتنفيذ التعليمات عن بُعد دون مصادقة، وثغرة حجب خدمة عالية الخطورة. وكان إصلاحان من هذه الإصلاحات قد تأجّلا منذ إصدار سبتمبر بسبب تأخر المشاريع الأصلية.

على خادم تديره بنفسك لا يصل الإصلاح من تلقاء نفسه. عليك رفع next والتأكد من أن مكتبة sharp تتبعه، ثم إعادة بناء التطبيق وإعادة تشغيل العملية التي تخدم الزوار فعلًا. تسلك هذه المقالة هذا المسار مع PM2 وDocker وCoolify، دون إعادة شرح تثبيت خادم Next.js.

أهم ما يجب تذكّره

  • GHSA-673q-mjm6-r5xr (حرجة) — تنفيذ تعليمات عن بُعد دون مصادقة في تطبيق App Router يستخدم Cache Components، عندما تُرجع دالة use cache عدة مصفوفات typed arrays. لا يوجد حل بديل معروف. يذكر التنبيه النطاق من 16.0.0 إلى 16.4.0 ودرجة CVSS تساوي 9.5.
  • CVE-2026-96889 / GHSA-2464-fhr4-w9xw (حرجة) — تنفيذ تعليمات عن بُعد عبر مكتبة أصلية في واجهة تحسين الصور، عند استخدام ملفات SVG، على أنظمة Linux المعتمدة على glibc. الدرجة 9.5. الإجراء الرسمي: sharp بالإصدار 0.35.5 أو أحدث.
  • GHSA-p3m5-59mp-jv5r (عالية) — حجب خدمة في تطبيق App Router يحتوي على Server Action واحدة على الأقل: طلبات مصطنعة تستنزف المعالج وتعطّل الطلبات التالية في العملية نفسها. الدرجة 8.2. لا يتأثر Pages Router ولا التطبيق الخالي من Server Actions.
  • الإصدارات المصحّحة — 16.4.1 للفرع 16 و15.5.28 للفرع 15، مع الأمرين الرسميين npm install [email protected] وnpm install [email protected].
  • لا CVE لتنبيهين من ثلاثة — ثغرة الصور وحدها تحمل معرّف CVE. أما الأخريان فتُتابعان بمعرّف GHSA: أداة لا تبحث إلا عن CVE ستفوّتهما.
  • حتى دون استخدام مباشر — بالنسبة إلى ثغرة use cache تطلب Vercel التحديث حتى لو لم يحتوِ تطبيقك على دالة مشابهة.

دون use cache ولا SVG: لماذا لا يكفي ذلك

هناك ثلاثة أسباب تمنعك من التوقف عند هذا الاعتراض. أولًا، في ثغرة use cache الإعلان صريح: لا يوجد حل بديل، ويُطلب التحديث حتى حين لا يحتوي التطبيق على دالة مشابهة. ثانيًا، تعتمد ثغرة الصور على مكتبة أصلية، ولا تعرف دائمًا أي ملفات SVG تصل إلى أداة التحسين، خصوصًا عندما تأتي الصور من مصادر بعيدة. ثالثًا، لا يحتاج حجب الخدمة إلا إلى Server Action واحدة، وهو أمر تحتويه نماذج كثيرة في App Router.

خطر الأعطال محدود: الترقية تبقى داخل الفرع نفسه، 16.4.x أو 15.5.x. قيد واحد يجب معرفته: يعلن الإصدار 16.4.1 اشتراط Node بالإصدار 20.9 أو أحدث، بينما يقبل 15.5.28 الإصدار 18.18 فما فوق من Node. وإن كنت على إصدار أقدم من الفرع 16، فالانتقال إلى 16.4.1 يبقى ضمن الإصدار الرئيسي نفسه.

أي إصدار تثبّت بحسب فرعك

مرّر الجدول أفقيًا

إصداركالحالةما العمل
من 16.0.0 إلى 16.4.0متأثر بالتنبيهات الثلاثةالانتقال إلى 16.4.1 أو إلى إصدار 16.4.x أحدث
16.4.1 وما بعدهالإصلاح متضمَّنفحص sharp والتأكد من إعادة النشر الفعلية
من 15.0.0 إلى 15.5.27متأثر بثغرة الصور وبحجب الخدمةالانتقال إلى 15.5.28 ثم التخطيط للترحيل إلى 16.4.x
15.5.28الإصلاح متضمَّنالتخطيط للترحيل إلى 16.4.x
13.x و14.xمتأثر ولم يُنشر إصلاح لهذين الفرعينالترحيل إلى 15.5.28 أو 16.4.1
من 10.0.0 إلى 12.xمتأثر بثغرة الصور ولم يُنشر إصلاحالترحيل إلى فرع ما زال مدعومًا

معرفة ما يعمل فعلًا

الإصدار المكتوب في مستودعك ليس هو الذي يردّ على الطلبات. قد يسبق ملف القفل الإصلاح، وقد يعيد بناء Docker استخدام طبقة مخزّنة، وقد تشير عملية PM2 إلى مجلد إصدار قديم. ومع خرج standalone ينسخ Next.js إلى مجلد النشر ملفات node_modules التي يحتاجها: فتكون مكتبة sharp المضمّنة هي الموجودة لحظة البناء، لا التي ثبّتّها بعد ذلك. تُجرى الفحوص التالية على الجهاز أو الحاوية التي تخدم الزوار.

جرد الوضع في خمسة فحوص

  1. قراءة إصداري Next.js وsharp

    من جذر المشروع: npm ls next sharp، أو pnpm why sharp عند استخدام pnpm. وللإصدار الدقيق من Next.js: node -p "require('next/package.json').version". إذا ظهرت sharp أقل من 0.35.5 تحت next فيجب تصحيحها.

  2. رصد Cache Components وuse cache

    grep -rn "cacheComponents" next.config.* ثم grep -rln "use cache" app src. إذا لم يظهر cacheComponents فتطبيقك لا يسلك المسار الذي يصفه التنبيه. حدّث مع ذلك: تطلب Vercel ذلك في جميع الحالات.

  3. رصد استخدام SVG

    grep -rn "dangerouslyAllowSVG\|remotePatterns" next.config.* وfind public -name "*.svg". بحسب التوثيق لا يحسّن Next.js صور SVG افتراضيًا، ويتيحها الإعداد dangerouslyAllowSVG. غياب هذا الإعداد علامة جيدة وليس دليلًا، فالتنبيه لا يفصّل المسار الدقيق.

  4. رصد Server Actions

    grep -rln "use server" app src. يكفي ملف واحد ليصبح تطبيق App Router معنيًّا بحجب الخدمة.

  5. التعرف على مكتبة C في النظام

    يعرض الأمر ldd --version عبارة GNU libc على Debian وUbuntu وAlmaLinux وRocky، وعبارة musl libc على Alpine. لا يذكر التنبيه سوى glibc ولا يقول شيئًا عن musl: فلا تستنتج أن Alpine بمنأى. داخل حاوية: docker exec <الحاوية> ldd --version.

التحديث ثم مراجعة ملف القفل

نفّذ الأمر الخاص بفرعك: npm install [email protected] أو npm install [email protected]. يبقى فخ لا يفصّله الإعلان. يعلن الإصدار 16.4.1 أن sharp اعتمادية اختيارية بالنطاق ^0.35.5، أما 15.5.28 فيعلن ^0.34.3 || ^0.35.5. وملف قفل يحتوي أصلًا على إصدار 0.34.x يحقق هذا النطاق، فلا يجد مدير الحزم سببًا لرفعه.

راجع إذن النتيجة بالأمر npm ls sharp. إذا ظهر إصدار أقل من 0.35.5 فافرض الترقية بالأمر npm install sharp@^0.35.5، أو أضف override في package.json مثل "overrides": { "sharp": "^0.35.5" }. ومع pnpm أو yarn يكون المعادل برفع sharp أو بتصريح override. ثبّت ملف القفل في المستودع: فهو ما ستقرؤه أنظمة CI وصورة Docker.

إعادة النشر بحسب بيئتك

  1. التحقق من البناء

    npm ci ثم npm run build ثم npm ls next sharp. إذا فشل البناء بسبب Node فراجع الإصدار الذي يشترطه الفرع الذي اخترته.

  2. PM2

    ابنِ في المجلد الذي يشغّله PM2 ثم نفّذ pm2 reload <الاسم>. وتأكد بالأمر pm2 describe <الاسم> أن مجلد التنفيذ هو الذي أعدت بناءه للتو: ففي نظام الإصدارات المتتالية قد يعيد رابط رمزي منسي تشغيل الشيفرة القديمة.

  3. Docker

    أعد البناء دون ذاكرة مؤقتة: docker build --no-cache -t myapp:fixed .، أو أبطل على الأقل طبقة npm ci. ثم أعد التشغيل بالأمر docker compose up -d --force-recreate. بعد ذلك قارن صورة الحاوية العاملة (docker inspect -f '{{.Image}}' <الحاوية>) بالصورة التي بنيتها للتو.

  4. Coolify

    أطلق إعادة نشر تتجاهل ذاكرة البناء المؤقتة، ثم اقرأ السجل: يجب أن تُنفَّذ خطوة تثبيت الاعتماديات لا أن تُعلَّم على أنها أُعيد استخدامها. إعادة التشغيل البسيطة لا تعيد بناء شيء.

  5. إثبات الإصلاح

    اقرأ الإصدار من العملية العاملة لا من المستودع: يجب أن يعرض الأمر docker exec <الحاوية> node -p "require('next/package.json').version" القيمة 16.4.1 أو 15.5.28 (أو إصدارًا أحدث من الفرع نفسه). وافحص sharp بالأمر docker exec <الحاوية> grep '"version"' node_modules/sharp/package.json الذي يجب أن يعرض 0.35.5 أو أحدث.

إذا تعذّرت إعادة النشر اليوم

لا توجد أي وسيلة بديلة لثغرة use cache: التحديث وحده يعالجها. أما الثغرتان الأخريان فهناك إجراءات تخفيف تقلّل الخطر في الأثناء. وهي لا تغني عن الإصلاح، ويحسن تدوينها في سجل التشغيل بوصفها مؤقتة.

إجراءات تخفيف مؤقتة وليست إصلاحات

  • رفع sharp وحدها — هذا هو الإجراء الرسمي لثغرة الصور: sharp بالإصدار 0.35.5 أو أحدث. تأكد من نجاح البناء ومن أن تحسين الصور ما زال يعمل.
  • عدم تمرير SVG عبر أداة التحسين — أبقِ dangerouslyAllowSVG معطّلًا ولا تفعّله دون حاجة مثبتة.
  • تضييق images.remotePatterns — اقصر المصادر البعيدة التي تقبلها أداة التحسين على المضيفين الذين تتحكم بهم.
  • تشغيل Node بصيغة PIE — يذكر تنبيه sharp هذا النمط لتقليل خطر تنفيذ التعليمات، مع التنبيه إلى أن ملفات Node.js الرسمية ليست PIE.
  • تقليص الضرر الممكن — عملية بلا صلاحيات الجذر، وحاوية للقراءة فقط (docker run --read-only)، ولا أسرار غير ضرورية في البيئة.
  • تحديد معدل الطلبات أمام Next.js — قاعدة limit_req في nginx وتنبيه على المعالج يبطئان حجب الخدمة دون أن يمنعاه.

شغّل npm audit بعد التحديث

يعتمد npm audit على قاعدة تنبيهات GitHub، فيغطي معرّفات GHSA بما فيها التي لا CVE لها. شغّله بعد رفع الإصدار، وأضفه إلى CI حتى لا يعتمد التنبيه القادم على مراقبة يدوية.

بعد الإصلاح: المراقبة والتخطيط للفرع 15

لا تنشر التنبيهات أي مؤشر اختراق، فلا توجد بصمة دقيقة للبحث عنها. راقب العلامات العامة. عملية Node يبقى معالجها مستنزفًا باستمرار تشير إلى حجب الخدمة. وإعادات التشغيل غير المتوقعة، أو العمليات الفرعية التي لا يطلقها التطبيق أبدًا، أو الاتصالات الصادرة من مستخدم التطبيق، كلها تستدعي التحقيق. وفي سجلات nginx يعرض الأمر grep "_next/image" access.log | grep -i svg طلبات التحسين التي تستهدف ملفات SVG.

أما الفرع 15 فكن حذرًا مع التقويم. بحسب endoflife.date انتهى الدعم الأمني للفرع 15 في 21 أكتوبر 2026، بينما لا تذكر صفحة سياسة Next.js تاريخًا وتحدد سنتين من Maintenance LTS. فقد يكون 15.5.28 آخر إصلاح لهذا الفرع: خطّط للترحيل إلى 16.4.x. أما الإصدار 16.4.2 الذي صدر في اليوم التالي لـ 16.4.1 فلا يحتوي بحسب ملاحظاته إلا على إصلاحات منقولة لا صلة لها بهذه التنبيهات.

التوثيق الرسمي

إعلان Next.js بتاريخ 14 أكتوبر 2026: https://nextjs.org/blog/nextjs-security-update-october-14-2026

تنبيهات GitHub: https://github.com/vercel/next.js/security/advisories/GHSA-673q-mjm6-r5xr و https://github.com/vercel/next.js/security/advisories/GHSA-2464-fhr4-w9xw و https://github.com/vercel/next.js/security/advisories/GHSA-p3m5-59mp-jv5r

تنبيه sharp: https://github.com/lovell/sharp/security/advisories/GHSA-wq5f-xc86-pv6w

ملاحظة Netlify: https://www.netlify.com/changelog/2026-10-14-nextjs-react-security-vulnerabilities/

سياسة الدعم: https://nextjs.org/support-policy و https://endoflife.date/nextjs

احتفظ بالتحكم في عمليات إعادة النشر

على خادم VPS من ServOrbit.com تحصل على صلاحيات الجذر وعنوان IPv4 مخصّص وحرية اختيار نظام التشغيل: يبقى Node وDocker وتوقيت كل إعادة نشر بيدك. وهناك أيضًا خيار لإدارة الـ VPS، ويُشرح نطاقه في صفحة العرض.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة