آسیبپذیری بحرانی Next.js؛ راهنمای آپدیت به 16.3.8
نویسنده: آرش لطیفی
Next.js در سپتامبر ۲۰۲۶ دو راند پچ امنیتی منتشر کرد: RCE بحرانی در ImageResponse و بعد CSRF و کشپویزنینگ. ببین نسخهات آسیبپذیر است یا نه، چطور آپدیت کنی و چکلیست بعد از آپدیت.
TL;DR — سپتامبر ۲۰۲۶ ماه بدی برای Next.js بود: یک RCE بحرانی (CVSS 9.5) در
next/ogو بعد یک راند کامل پچ دیگر. اگر روی 16.2 تا 16.3.5 هستی، همین امروز بهnext@16.3.8آپدیت کن — یکی دو دستور ترمینال و چند دقیقه تست.
اگر پروژه Next.js داری و این ماه آپدیت نکردهای، این پست برای توست.
گوگل چرا؟ چون Next.js در سپتامبر ۲۰۲۶ دو راند پچ امنیتی منتشر کرد: یک آپدیت اضطراری برای یک آسیبپذیری بحرانی RCE، و بعد ریلوز ماهانهای که چند مشکل دیگر را هم بست. خیلی از سایتها هنوز روی نسخههای آسیبپذیرند.
راند اول: RCE در ImageResponse (بحرانی — 22 سپتامبر)
نسخههای 16.2.0 تا قبل از 16.3.6 یک آسیبپذیری بحرانی (GHSA-vcvr-r3jv-pc5j، CVSS 9.5) دارند: پیادهسازی Node.js از ImageResponse در next/og میتواند به اجرای کد از راه دور (RCE) منجر شود.
از اعلامیه رسمی Next.js: مشکل از فرار ندادن (improper escaping) خروجی SVG در Satori است و فقط وقتی فعال است که مقدار کنترلشده توسط مهاجم را به محتوا، اتریبیوت یا استایل SVG بدهی:
// الگوی آسیبپذیر — از اعلامیه رسمی Next.js
import { ImageResponse } from 'next/og'
export async function GET(request: Request) {
const value = new URL(request.url).searchParams.get('value') ?? ''
return new ImageResponse(
<svg width="1200" height="630">
<title>{value}</title>
</svg>
)
}
دو نکته مهم:
- پیادهسازی Edge از
ImageResponseآسیبپذیر نیست - اگر مقدار کاربر را به SVG پاس نمیدهی، هم آسیبپذیر نیستی — اما آپدیت بده چون پچ بالا-دستی است
نسخه 15.5.26 هم hardening دارد، ولی طبق اعلامیه Next.js 15.x مستقیماً به RCE مبتلا نیست.
راند دوم: پچهای 30 سپتامبر (16.3.8 و 15.5.27)
یک هفته بعد، ریلوز امنیتی ماهانه چند مشکل دیگر را بست — از اعلامیه رسمی:
| مشکل | شدت | چه کسانی در معرضاند |
|---|---|---|
| SSRF در بهینهسازی تصویر (CVE-2026-94483) | High | کسانی که images.remotePatterns دارند |
| کشپویزنینگ صفحات SSG/ISR در self-hosted (CVE-2026-94543) | Medium | Pages Router + SSG/ISR روی سرور خودت (روی Vercel خیر) |
| کشپویزنینگ با root-level catch-all (CVE-2026-94484) | Medium | catch-all در ریشه + SSG/ISR |
| افشای dynamicParams در مسیرهای metadata (CVE-2026-94485) | Medium | App Router + webpack (Turbopack خیر) |
| نشت کش در تو در تو 'use cache' | Medium | Cache Components فعال |
| نشت محتوای Draft Mode از طریق کش (CVE-2026-94544) | Medium | Cache Components + پیشنمایش Draft Mode |
| افشای اطلاعات در endpoint MCP سرور توسعه (CVE-2026-94486) | Low | فقط next dev |
دو مورد که برای توسعهدهندههای خودمیزبان مهمترند:
- SSRF تصویر: اگر
remotePatternsبرای دامنههای خارجی داری، آپدیت جدی است — یک URL لیستشده میتواند برای رسیدن به IPهای خصوصی سوءاستفاده شود - کشپویزنینگ ISR: یک درخواست ساختگی و بدون احراز هویت میتواند محتوای یک مسیر را جای مسیر دیگری به همه بازدیدکنندهها بدهد تا زمان revalidate
چطور چک و آپدیت کنی
اول ببین کجایی:
بعد آپدیت — نسخه فعلی LTS بر اساس خط نسخهات:
اگر ESLint یا پکیجهای جانبی next (eslint-config-next و غیره) داری، همانها را هم همراستا کن.
بعد از آپدیت، حتماً build بگیر و تست کن:
- [ ] نسخه
nextرا چک کردم و روی 16.3.8 / 15.5.27 یا بالاتر هستم - [ ] اگر
next/ogاستفاده میکنم، مطمئنم ورودی کاربر به SVG پاس نمیشود (یا به Edge runtime رفتم) - [ ]
images.remotePatternsرا مرور کردم — فقط دامنههای واقعاً لازم لیستاند - [ ] اگر self-hosted هستم با Pages Router + ISR، صفحات کلیدی را بعد از آپدیت با curl چک کردم
- [ ] اگر Cache Components /
use cacheدارم، تغییر رفتار Draft Mode را در پرسویو تست کردم - [ ] یک روال برای آپدیتهای امنیتی ماهانه Next.js گذاشتم — از الان به بعد ریتم ماهانه است
نکته: ریتم جدید ریلوزهای امنیتی
وِرکل از تابستان امسال فرآیند رسمی ریلوز امنیتی گذاشت: پچهای امنیتی ماهانه با اطلاعرسانی قبلی. یعنی دیگر نمیشود «سالم بودیم که آپدیت نکنیم» — اگر Next.js داری، یک روز مشخص در ماه برای چک کردن نسخه و پچهای امنیتی بگذار. برای سایتهای فروشگاهی که درآمدزاییاند، این کار پنجدقیقهای است که ریسک قطعی سایت را میخواباند.
قبل از آپدیتهای بزرگ ترجیح میای کسی تجربهش را داشته باشد؟ من در خدمات توسعه Next.js پروژهها را روی آخرین نسخه LTS نگه میدارم — برآورد رایگان پروژهات رو بگیر.
سوالات پرتکرار
Q: روی Next.js 15 هستم، باید بترسم؟
برای RCE بحرانی، نه — Next.js اعلام کرد 15.x مستقیماً مبتلا به RCE نیست و 15.5.26 فقط hardening دارد. اما برای پچهای 30 سپتامبر (SSRF تصویر، کشپویزنینگ و...) بله: به next@15.5.27 آپدیت کن، چون بعضی از آن مسیرها به 15.5 هم مربوطاند.
Q: از Edge runtime برای ImageResponse استفاده میکنم، باز هم آپدیت کنم؟
اعلامیه رسمی میگوید پیادهسازی Edge آسیبپذیر نیست. با این حال آپدیت به آخرین پچ به صرفه است چون این ریلیزها فقط ImageResponse را نبستهاند — و ممکن است در آینده runtime را عوض کنی و یادت برود.
Q: از کجا بفهمم پروژهام به SSRF تصویر حساس است؟
اگر در next.config بخش images.remotePatterns یا کلید قدیمی images.domains با دامنههای خارجی داری، در معرض سناریوی SSRF هستی (طبق CVE-2026-94483). اگر چیزی تنظیم نکردهای، طبق اعلامیه پروژهات به این مورد مبتلا نیست — ولی باز هم به آخرین پچ آپدیت کن.