آسیب‌پذیری بحرانی در React و Next.js؛ اجرای کد از راه دور بدون نیاز به احراز هویت

تاریخ انتشار: ۱۲ آذر ۱۴۰۴

مطالبی که در این قسمت میخوانید

چند روز پیش یک آسیب‌پذیری بسیار جدی در React Server Components (RSC) افشا شد که واقعاً جامعه برنامه‌نویسان و فعالان امنیت وب را شوکه کرد. من هم مثل بسیاری از متخصصان، وقتی جزئیات فنی آن را بررسی کردم، عمق فاجعه بیشتر روشن شد؛ سوراخی امنیتی که با امتیاز کامل CVSS 10.0 دسته‌بندی شده و امکان اجرای کد از راه دور (RCE) بدون هیچ‌گونه احراز هویت را فراهم می‌کند!

این ضعف امنیتی با شناسه CVE-2025-55182 شناخته می‌شود و نام غیررسمی آن را React2Shell گذاشته‌اند. مشکل اصلی از نحوه‌ی پردازش و deserialization ناامن payloadهای RSC توسط React سرچشمه می‌گیرد؛ یعنی مهاجم می‌تواند تنها با ارسال یک درخواست HTTP مخرب به یکی از Endpointهای مربوط به Server Function، کاری کند که سرور اجرای کد جاوااسکریپت دلخواه او را بپذیرد – دقیقاً همان‌طور که باید کد معتبر را اجرا کند!

نکته‌ی نگران‌کننده‌تر این است که حتی اگر اپلیکیشن شما هیچ Server Function تعریف نکرده باشد، باز هم در صورتی که از RSC پشتیبانی می‌کند، آسیب‌پذیر است.

ریشه آسیب‌پذیری؛ deserialization خطرناک در React Flight

طبق بررسی‌هایی که شرکت‌های امنیتی مانند Wiz و Aikido انجام داده‌اند، مشکل از پروتکل React Flight و نحوه‌ی برخورد آن با داده‌های سریال‌شده آغاز می‌شود. چون این داده‌ها به‌درستی اعتبارسنجی نمی‌شوند، مهاجم می‌تواند با ساختن Payloadهای بدساختار (malformed) مسیر اجرای برنامه را تغییر دهد.

نسخه‌های آسیب‌پذیر شامل موارد زیر هستند:

  • react-server-dom-webpack
  • react-server-dom-parcel
  • react-server-dom-turbopack

در نسخه‌های 19.0، 19.1.0، 19.1.1 و 19.2.0 این مشکل وجود دارد و تیم React آن را در نسخه‌های 19.0.1، 19.1.2 و 19.2.1 وصله کرده است.

این آسیب‌پذیری توسط محقق امنیتی Lachlan Davidson کشف شده و به Meta گزارش شده است.

تأثیر مستقیم روی Next.js

اگر از Next.js با App Router استفاده می‌کنید، باید خیلی سریع نسخه را به‌روزرسانی کنید. در واقع Next.js یک سطح حمله واقعی ایجاد می‌کند چون Endpointهای Flight را به صورت عمومی در اختیار کلاینت قرار می‌دهد.

نسخه‌های آسیب‌پذیر:

  • نسخه‌های Canary از 14.3.0
  • نسخه‌های 15 و 16

نسخه‌های وصله‌شده:

16.0.7، 15.5.7، 15.4.8، 15.3.6، 15.2.6، 15.1.9، 15.0.5

نکته‌ی مهم: CVE مخصوص Next.js ابتدا با کد دیگری ثبت شد (CVE-2025-66478) اما در نهایت به‌عنوان نسخهٔ تکراری همان CVE-2025-55182 رد شد.

ابعاد گسترده مشکل

هر کتابخانه‌ای که RSC را بازبسته (Bundle) کرده، ممکن است آسیب‌پذیر باشد:

  • Vite RSC plugin
  • Parcel RSC plugin
  • React Router RSC preview
  • RedwoodJS
  • Waku
    و موارد مشابه

طبق گزارش Wiz حدود ۳۹٪ محیط‌های ابری تحت تأثیر این باگ هستند. همچنین تحلیل Palo Alto نشان می‌دهد بیش از ۹۶۸ هزار سرور که از جدیدترین نسخه‌های React و Next.js استفاده می‌کنند، در معرض حمله قرار دارند.

این یعنی یک «سطح حمله‌ی گسترده» برای مهاجمان.

چطور حمله انجام می‌شود؟

طبق تحلیل Upwind، آسیب‌پذیری از تابع requireModule در بسته react-server-dom-webpack شروع می‌شود. مهاجم می‌تواند یک درخواست POST ویژه به سرور ارسال کند که به ظاهر یک “Server Action” است، اما در باطن یک Payload مخرب دارد که توسط vm.runInThisContext اجرا می‌شود.

نتیجه؟
اجرای کد مخرب با همان دسترسی Node.js روی سرور!

جالب (و البته ترسناک!) اینجاست که React به‌صورت پیش‌فرض Endpoint RSC را منتشر نمی‌کند، اما Next.js این کار را انجام می‌دهد و همین باعث می‌شود حمله از یک سناریوی تئوری، به یک حمله واقعی قابل استفاده از اینترنت تبدیل شود.

راهکار دفاعی فوری

تا زمانی که مجبورید منتظر آپدیت باشید یا امکان به‌روزرسانی فوری ندارید:

  • حتماً WAF فعال کنید.
  • ترافیک مربوط به Server Functionها را زیر نظر داشته باشید.
  • موقتاً دسترسی شبکه به سرویس را محدود کنید.

Cloudflare، AWS، Akamai، Fastly و Google Cloud همه قوانین جدیدی برای دفاع در برابر این حمله اعمال کرده‌اند.

جمع‌بندی تحلیلی من

از نظر من این آسیب‌پذیری یکی از خطرناک‌ترین حفره‌هایی است که تاکنون در اکوسیستم React دیده شده. علتش هم ساده است:
سرور دقیقاً همان کاری را انجام می‌دهد که انتظار می‌رود – فقط با داده‌ای که مهاجم ساخته!

این یعنی یک «کلید طلایی» برای اجرای کد.

اگر اپلیکیشن شما به هر شکل از RSC یا Next.js App Router استفاده می‌کند، به‌روزرسانی فوری کاملاً ضروری است. حتی اگر فکر می‌کنید از Server Function استفاده نمی‌کنید، باز هم در معرض خطر هستید.

خبرهای مرتبط

امروز: ۲۳ آذر ۱۴۰۴