ما الذي صدر في 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 المضمّنة هي الموجودة لحظة البناء، لا التي ثبّتّها بعد ذلك. تُجرى الفحوص التالية على الجهاز أو الحاوية التي تخدم الزوار.
جرد الوضع في خمسة فحوص
قراءة إصداري 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فيجب تصحيحها.رصد Cache Components وuse cache
grep -rn "cacheComponents" next.config.*ثمgrep -rln "use cache" app src. إذا لم يظهرcacheComponentsفتطبيقك لا يسلك المسار الذي يصفه التنبيه. حدّث مع ذلك: تطلب Vercel ذلك في جميع الحالات.رصد استخدام SVG
grep -rn "dangerouslyAllowSVG\|remotePatterns" next.config.*وfind public -name "*.svg". بحسب التوثيق لا يحسّن Next.js صور SVG افتراضيًا، ويتيحها الإعدادdangerouslyAllowSVG. غياب هذا الإعداد علامة جيدة وليس دليلًا، فالتنبيه لا يفصّل المسار الدقيق.رصد Server Actions
grep -rln "use server" app src. يكفي ملف واحد ليصبح تطبيق App Router معنيًّا بحجب الخدمة.التعرف على مكتبة 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.
إعادة النشر بحسب بيئتك
التحقق من البناء
npm ciثمnpm run buildثمnpm ls next sharp. إذا فشل البناء بسبب Node فراجع الإصدار الذي يشترطه الفرع الذي اخترته.PM2
ابنِ في المجلد الذي يشغّله PM2 ثم نفّذ
pm2 reload <الاسم>. وتأكد بالأمرpm2 describe <الاسم>أن مجلد التنفيذ هو الذي أعدت بناءه للتو: ففي نظام الإصدارات المتتالية قد يعيد رابط رمزي منسي تشغيل الشيفرة القديمة.Docker
أعد البناء دون ذاكرة مؤقتة:
docker build --no-cache -t myapp:fixed .، أو أبطل على الأقل طبقةnpm ci. ثم أعد التشغيل بالأمرdocker compose up -d --force-recreate. بعد ذلك قارن صورة الحاوية العاملة (docker inspect -f '{{.Image}}' <الحاوية>) بالصورة التي بنيتها للتو.Coolify
أطلق إعادة نشر تتجاهل ذاكرة البناء المؤقتة، ثم اقرأ السجل: يجب أن تُنفَّذ خطوة تثبيت الاعتماديات لا أن تُعلَّم على أنها أُعيد استخدامها. إعادة التشغيل البسيطة لا تعيد بناء شيء.
إثبات الإصلاح
اقرأ الإصدار من العملية العاملة لا من المستودع: يجب أن يعرض الأمر
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