Next.js 16.4 + وصله امنیتی 16.4.1: هر چی لازمه بدونی در یک پست
نویسنده: آرش لطیفی
راهنمای کامل Next.js 16.4 و وصله ۱۶ اکتبر: Cache Components و ensureStatic، سه advisory بحرانی با نسخههای دقیق، فلگهای جدید Turbopack و چکلیست آپگرید بدون دردسر.
TL;DR — Next.js 16.4 (۶ اکتبر) رسماً Cache Components را پیشفرض کرد و ابزارهایی مثل
ensureStaticوnext upgrade --agentداد؛ اما فقط چند روز بعد در ۱۴ اکتبر سه advisory امنیتی (دو RCE بحرانی + یک DoS) با وصله در 16.4.1 منتشر شد — یعنی اگر آپگرید میکنی، مستقیم برو روی 16.4.1 نه 16.4.0.
ماجرا در یک نگاه
اگر این دو هفته سرت به کار خودت بود، Next.js دو خبر مهم داد که عملاً یک خبرند:
- ۶ اکتبر: ریلیز Next.js 16.4 — تیم رسماً گفت Cache Components «بهترین انتخاب برای هر اپ Next.js» است و
create-next-appدیفالت روشنش کرد. - ۱۴ اکتبر: یک آپدیت امنیتی out-of-band با سه advisory، وصلهشده در 16.4.1 (Active LTS) و 15.5.28 (Maintenance LTS).
نکتهی مهم برای self-hostedها: وقتی پست ریلیز جدید میآید، وسوسه میشوی روی همون اولین نسخه آپگرید کنی. این بار نسخهی 16.4.0 فقط ۸ روز دوام آورد. آپگرید امن یعنی 16.4.1.
سه آسیبپذیری ۱۴ اکتبر — دقیق و با عدد
هر سه advisory را مستقیم از GitHub خوندم؛ خلاصهاش این است:
| Advisory | شدت | چی هست | نسخههای آسیبپذیر | وصله |
|---|---|---|---|---|
| GHSA-2464-fhr4-w9xw (CVE-2026-96889) | بحرانی | RCE بدون احراز هویت در Image Optimization با فایل SVG، روی لینوکسهای glibc | 10.0.0 تا 15.5.27، و 16.0.0+ تا 16.4.0 | 15.5.28 / 16.4.1 + sharp >= 0.35.5 |
| GHSA-673q-mjm6-r5xr | بحرانی | RCE بدون احراز هویت وقتی یک تابع use cache چند typed array برمیگرداند | 16.0.0 تا 16.4.0 | 16.4.1 |
| GHSA-p3m5-59mp-jv5r | بالا (High) | DoS روی Server Actions — درخواستهای دستکاریشده CPU را پر میکنند و پردازش بقیه درخواستها در همان پروسه قفل میشود | 13.0.0 تا 15.5.27، و 16.0.0 تا 16.4.0 | 15.5.28 / 16.4.1 |
چند نکته که در متن رسمی advisoryها هست و جدولها معمولاً جا میگذارند:
- RCE تایپد اری (GHSA-673q-mjm6-r5xr) هیچ workaround ندارد. جملهی خود advisory: «حتی اگر اپ تو چنین توابعی ندارد، فوراً آپگرید کن.» پس جستوجوی
use cacheدر کدت راحتی فکری نمیدهد. - آسیبپذیری Image Optimization وابسته به
sharpاست. اگر آپگرید Next.js نداری، دستیsharpرا به 0.35.5 یا بالاتر ببر — این همان workaround رسمی است. - DoS فقط اپهای App Router با حداقل یک Server Action را میگیرد؛ Pages Router یا اپ بدون Server Action آسیبپذیر نیست. ولی توجه کن «حداقل یک Server Action» در اپهای امروزی تقریباً همیشه برقرار است.
- در پست رسمی Next.js گفته شده دو تا از این فیکسها از سپتامبر عقب افتاده بودند بهخاطر وابستگیهای upstream — برای همین آپدیت ناگهانی و خارج از چرخه عادی بود.
چکلیست آپگرید امن
- [ ] نسخه فعلیت را چک کن:
npx next --version - [ ] روی 15.x هستی →
npm install next@15.5.28؛ روی 16.x هستی →npm install next@16.4.1(اصلاً روی 16.4.0 نمان) - [ ] نسخه
sharpرا چک کن:npm ls sharp— باید 0.35.5 یا بالاتر باشد - [ ]
npm ls react react-domرا هم نگاه کن — 16.4 با React 19.3 میآید - [ ] بعد از آپگرید،
next buildبزن و چند Server Action و روت تصویری را دستی تست کن - [ ] اگر روی VPS ایران self-host کردهای، نگران DoS Server Actions باش: فقط پراکسی/فایروالت را با rate limit روی روتها ست کن — workaround واقعی همان آپگرید است
حالا خود 16.4 — چرا اینقدر مهم بود؟
پست رسمی ریلیز را کامل خواندم؛ اینها تغییرات اصلی است:
۱. Cache Components دیفالت شد
مدل جدید کش از شروع خط 16.x ساخته میشد ولی توصیه عمومی نمیشد چون در بعضی موارد همسطح مدل قبلی از نظر هزینه و کارایی نبود. در 16.4 تیم اعلام کرد این شکافها بسته شده و create-next-app از همین نسخه Cache Components را روشن تحویل میدهد. برای اپهای موجود دو فلگ لازم است:
منطقش شبیه Cache-Control در سطح کامپوننت است — با 'use cache' مشخص میکنی کدام بخش کش شود:
۲. ensureStatic — قفل کردن استاتیک بودن روت
مشکل همیشگی سایتها: یک کامپوننت داینامیک (مثلاً آواتار کاربر) ناخواسته وارد صفحهای میشود که باید کاملاً استاتیک باشد. با 16.4 میتوانی این را در سطح build تضمین کنی:
سه سطح دارد: navigation (سختگیرانهترین — هیچ رندر لحظهی درخواست مجاز نیست)، prefetch و shell. روی layout هم میگذاری تا همه صفحات زیرمجموعه قفل شوند. تیم رسمی خودش میگوید مخاطب اصلی این قابلیت «فروشگاههای اینترنتی، صفحات مارکتینگ و بلاگها» است.
۳. کنترل دقیق prefetch با navigation() و prefetch()
مثال خود تیم: در یک اپ ایمیل، <Link prefetch> کل thread پیام را از قبل میکشد حتی اگر کاربر هرگز بازش نکند. با await navigation() داخل یک کامپوننت، آن بخش از prefetch حذف میشود و فقط در navigation واقعی رندر میشود. یعنی میتوانی بگویی «لیست پیامها را از قبل بیاور، متن کامل را نه.»
۴. ابزارهای عامل (Agent)
npx next@canary upgrade --agent=latest— آپگرید کامل را به ایجنت کدنویسی میسپارد: نسخه، codemod، راهنمای مایگریشن و تست.experimental.agentUpgrade: 'security'— موقعnext devیاnext build، اگر وصله امنیتی مربوط به نسخه تو منتشر شده باشد یادت میاندازد. این فلگ برای رخداد همین هفته دقیقاً ساخته شده.experimental.agentFeedback: true— ایجنت گزارش باگهای خود فریمورک را آماده میکند و فقط بعد از تایید تو ارسال میشود.
۵. بهبودهای Turbopack و React
- کش دیسک Turbopack با فشردهسازی Zstandard ۲۰ تا ۲۵٪ فضای کمتری میگیرد (بدون هیچ تنظیمی).
- React Compiler نسخه Rust: مصرف حافظه ۳۰٪ و زمان کامپایل ۱۵٪ کمتر شده — با
reactCompiler: trueوexperimental.turbopackRustReactCompiler: true. - GC آزمایشی کش (
experimental.turbopackGc: true) دادههای سشنهای قدیمی dev را پاک میکند. - نام کلاسهای CSS Module در production کوتاهتر و export mangling هم فعال شده → باندل کوچکتر.
- React 19.3: View Transitions و Fragment Refs استیبل شدند.
برای اپهای ایرانی self-hosted چه معنی دارد؟
اگر فروشگاه یا سرویسات روی VPS داخل ایران با Node.js خام اجرا میشود، این دو هفته به تو دو تا کاری میدهد:
- فوری: برو روی 16.4.1 (یا 15.5.28 اگر هنوز روی 15 هستی) و
sharpرا چک کن. دو RCE بدون احراز هویت یعنی نیازی به لاگین بودن مهاجم نیست — فایروال معمولی هم برای Image Optimization کمکی نمیکند چون خود endpoint عمومی است. - کوتاهمدت: برای آپگریدهای بعدی،
experimental.agentUpgrade: 'security'را روشن کن تا وصلههای امنیتی را از خود لاگ dev ببینی، نه از توییتر.
FAQ
Q: من هنوز روی Next.js 15 هستم، چیکار کنم؟
روی 15.5.28 برو — تیم همه سه فیکس را به خط 15 هم بکپورت کرده. اگر اپت Server Action ندارد فقط DoS شامل حالت نمیشود ولی دو RCE (بهخصوص Image Optimization با SVG) مستقل از این است که از کدام روتینگ استفاده میکنی.
Q: آیا Cache Components را همین الان برای پروژه موجود فعال کنم؟
از 16.4 به بعد توصیه رسمی بله است، ولی مایگریشن پروژههای بزرگ یک refactoring واقعی میخواهد. مسیر پیشنهادی خود تیم: اول next upgrade --agent را اجرا کن، بعد از Skills رسمی برای مایگریشن Cache Components استفاده کن. برای پروژههای کوچک و جدید، از الان دیفالت است و نیازی به کار اضافه نیست.
Q: چطور مطمئن شوم وصله را درست گرفتم؟
npm ls next sharp بزن: next باید 16.4.1 (یا 15.5.28) باشد و sharp حداقل 0.35.5. بعد next build کامل بزن — اگر خطای typed-version dependency دیدی، lock file را با npm install بازسازی کن، نه با ویرایش دستی.