۱۴۰۴/۰۹/۲۴
تحلیل جامع آسیبپذیری React2Shell (CVE-2025-55182)
در سالهای اخیر، اکوسیستم وب با شتاب زیادی به سمت معماریهایی حرکت کرده است که بار پردازش را از مرورگر کاربر به سرور منتقل میکنند. هدف این تغییر، افزایش سرعت، بهبود تجربه کاربری و سادهسازی منطق سمت کلاینت بوده است؛ اهدافی که بدون انجام تست عملکرد نرمافزار در معماریهای جدید سمت سرور قابل تضمین نیستند. فریمورکهایی مانند React و Next.js با معرفی قابلیتهایی نظیر React Server Components و Server Actions، این ایده را به شکل گستردهای وارد جریان اصلی توسعه وب کردند.
با این حال، هر تغییر معماری عمیق، سطح حملهی جدیدی نیز به همراه دارد و اهمیت تحلیل امنیت کد نرمافزار را بیش از پیش برجسته میکند. آسیبپذیریای که با نام React2Shell شناخته میشود و تحت شناسه CVE-2025-55182 ثبت شده، نمونهای واضح از این واقعیت است. این آسیبپذیری امکان اجرای کد دلخواه روی سرور را بدون نیاز به احراز هویت فراهم میکند و به همین دلیل در دستهی خطرناکترین آسیبپذیریهای وب مدرن قرار میگیرد.
در این مقاله، تلاش شده است React2Shell بهصورت کاملاً مفهومی و عملی بررسی شود؛ از منطق فنیای که منجر به ایجاد این آسیبپذیری شده، تا روشهای شناسایی، اعتبارسنجی و در نهایت بهرهبرداری از آن، همراه با توضیح دقیق کدهای کلیدی.
React Server Components قابلیتی است که به توسعهدهنده اجازه میدهد بخشی از کامپوننتهای رابط کاربری را مستقیماً روی سرور اجرا کند. این کامپوننتها برخلاف کامپوننتهای معمولی React، به منابعی مانند فایلسیستم یا دیتابیس دسترسی مستقیم دارند و خروجی آنها بهصورت دادهای ساختاریافته برای مرورگر ارسال میشود.
برای انتقال این دادهها، React از مکانیزمی به نام Flight Protocol استفاده میکند. Flight در واقع یک پروتکل سریالسازی است که وضعیت و خروجی کامپوننتهای سمت سرور را به شکل پیامهایی خاص بین کلاینت و سرور جابهجا میکند. در حالت عادی، این دادهها توسط سرور deserialize شده و به شکل امن پردازش میشوند. اما اگر این مرحله بدون اعتبارسنجی کافی انجام شود، زمینه برای بروز آسیبپذیریهای خطرناک فراهم میشود.
در Next.js نسخه ۱۳ به بعد، مفهومی به نام Server Actions معرفی شد. Server Action به توسعهدهنده اجازه میدهد یک تابع جاوااسکریپتی را مستقیماً داخل یک کامپوننت تعریف کند، در حالی که اجرای آن تابع روی سرور انجام میشود.
به عنوان مثال:

در پشت صحنه، زمانی که کاربر عملی را در مرورگر انجام میدهد، Next.js یک درخواست POST خاص ایجاد میکند که حاوی اطلاعات مورد نیاز برای اجرای این تابع است. این درخواست یک API معمولی با JSON ساده نیست، بلکه از همان ساختار Flight و React Server Components استفاده میکند.
نقطهی حساس دقیقاً همینجاست: اگر سرور دادههای دریافتی از این درخواست را «قابل اعتماد» فرض کند و بدون بررسی دقیق deserialize کند، مهاجم میتواند ساختار داده را به شکلی دستکاری کند که منجر به اجرای کد دلخواه شود.
مشکل اصلی در CVE-2025-55182 به Unsafe Deserialization برمیگردد. در درخواستهای مربوط به Server Actions، دادهها معمولاً بهصورت multipart/form-data ارسال میشوند و یکی از فیلدهای کلیدی آنها فیلدی با نام 0 است.
در یک سناریوی سالم، مقدار این فیلد چیزی شبیه به مثال زیر است:
سرور این داده را دریافت کرده، آن را deserialize میکند و بر اساس شناسهی $ACTION_abc123، تابع مربوطه را اجرا میکند. اما در نسخههای آسیبپذیر، فرآیند deserialize بهاندازه کافی سختگیرانه نیست. این موضوع به مهاجم اجازه میدهد بهجای یک آبجکت دادهی ساده، ساختاری ارسال کند که حاوی اطلاعات اجرایی باشد.
برای اینکه یک endpoint در معرض React2Shell باشد، درخواست ارسالی به آن باید چند ویژگی مشخص داشته باشد. در بررسی ترافیک شبکه (مثلاً از طریق ابزارهای مرورگر یا پروکسی)، این ویژگیها بهوضوح قابل مشاهده هستند.
اولین نشانه، وجود هدر Next-Action است که نشان میدهد درخواست مربوط به یک Server Action است. دومین نشانه، نوع محتوای درخواست است که باید multipart/form-data باشد. اگر درخواست با application/json ارسال شود، در این دسته قرار نمیگیرد. در نهایت، وجود فیلدی با نام 0 در بدنه درخواست که مقدار آن با $ACTION_ شروع میشود، نشاندهندهی فعال بودن مسیر آسیبپذیر است.
برای اعتبارسنجی ایمن، میتوان مقدار این فیلد را عمداً به دادهای نامعتبر تغییر داد تا واکنش سرور بررسی شود. اگر سرور با خطاهای داخلی یا پیامهایی مرتبط با decode یا deserialize پاسخ دهد، احتمال آسیبپذیری بسیار بالاست.
در مرحلهی بهرهبرداری، مهاجم از این واقعیت سوءاستفاده میکند که سرور برخی ساختارهای خاص را بهعنوان callback یا تابع قابل اجرا در نظر میگیرد. بهعنوان نمونه، payload زیر نشان میدهد که چگونه میتوان یک دستور سیستمعامل را اجرا کرد:

در این کد، بخش مهم آبجکتی است که شامل کلید $function میباشد. این مقدار به سرور القا میکند که هنگام deserialize، تابع execSync از ماژول child_process فراخوانی شود. آرگومان whoami نیز دستوری است که روی سیستمعامل اجرا میشود. اگر سرور آسیبپذیر باشد، خروجی این دستور در پاسخ HTTP قابل مشاهده خواهد بود.
در برخی محیطها، ممکن است خروجی دستور مستقیماً در پاسخ HTTP نمایش داده نشود. در چنین شرایطی، میتوان از تکنیکهای Out-of-Band استفاده کرد؛ به این معنا که سرور پس از اجرای کد، یک درخواست خارجی (مثلاً HTTP یا DNS) ارسال میکند. مشاهده این درخواست در سمت مهاجم، تأییدکننده اجرای موفق کد خواهد بود.
همچنین در سناریوهای پیشرفتهتر، امکان تزریق یک endpoint موقت در حافظهی پردازش Node.js وجود دارد. این endpoint تا زمانی که پردازش فعال است باقی میماند و میتواند مانند یک shell ساده برای اجرای دستورات بعدی استفاده شود.
جمعبندی
React2Shell نشان میدهد که ترکیب قابلیتهای قدرتمند سمت سرور با اعتماد بیش از حد به دادههای ورودی، میتواند به آسیبپذیریهایی با تأثیر بسیار بالا منجر شود. CVE-2025-55182 تنها یک باگ ساده نیست، بلکه نمونهای از چالشهای امنیتی معماریهای مدرن وب است.
درک دقیق نحوهی کار React Server Components، Flight Protocol و Server Actions برای توسعهدهندگان و تیمهای امنیتی ضروری است. تنها با این درک عمیق میتوان از تکرار چنین آسیبپذیریهایی در آینده جلوگیری کرد و از امنیت زیرساختهای مبتنی بر JavaScript اطمینان حاصل نمود.
آسیبپذیری React2Shell بهخوبی نشان میدهد که دانش سطحی از معماریهای مدرن وب برای تضمین امنیت کافی نیست. وقتی منطق اجرا به سرور منتقل میشود، کوچکترین اعتماد نابهجا به دادههای ورودی میتواند به اجرای کد دلخواه و compromise کامل سیستم منجر شود.
تیم امنافزار با تمرکز بر درک عمیق معماریهایی مانند React Server Components، Flight Protocol و Server Actions، به سازمانها کمک میکند تا این ریسکها را در سطح کد و زیرساخت شناسایی و برطرف کنند.
ما با انجام تحلیل امنیت کد نرمافزار و تست عملکرد نرمافزار، نقاط ضعفی را بررسی میکنیم که معمولاً در تستهای سطحی یا خودکار دیده نمیشوند.
اگر از فریمورکهای مدرن JavaScript استفاده میکنید و میخواهید قبل از مهاجمان، آسیبپذیریهای واقعی سیستم خود را بشناسید،
همین حالا برای دریافت مشاوره تخصصی با شرکت امنافزار اقدام کنید.