react2shell: داستان کشف آسیبپذیری بحرانی در React
خلاصهٔ کاملتر
CVE-2025-55182 یا همون react2shell، یه آسیبپذیری RCE (اجرای کد از راه دور) بود که در React Server Components کشف شد. مشکل اصلی از پروتکل Flight در React میاومد؛ این پروتکل نوع دادههایی که دریافت میکرد رو درست بررسی نمیکرد، در نتیجه یه مهاجم میتونست chunkهای دلخواه بسازه و به پروتوتایپهای اشیاء جاوااسکریپت دسترسی پیدا کنه — یعنی توابعی مثل Function.constructor که باهاشون میشه کد دلخواه اجرا کرد.
ماجرا از اواخر نوامبر ۲۰۲۵ شروع شد، وقتی Lachlan Davidson رفتار عجیبی در نحوه استفاده CMSها از React دید و با دوستش Sylvie در میون گذاشت. هر دو با بررسی کدهای Flight فهمیدن که primitive typeهایی مثل String، Object، Function و... در دسترسن و میشه باهاشون چیزی شبیه به یه جاوااسکریپت jail challenge ساخت. بعد از چند روز کار متوالی و کمخوابی، Lachlan موفق شد اولین PoC کامل رو بسازه.
بعد از اطلاعرسانی خصوصی به Meta، دو محقق شروع به recon (شناسایی هدف) کردن. Sylvie یه backend با Go و MariaDB نوشت تا دامنههای آسیبپذیر رو ردیابی کنه. اسکن اولیه روی ۴ میلیون دامنه نشون داد حدود ۲٪ از اونها Next.js داشتن — البته فقط نسخههای ۱۵ به بالا با App Router آسیبپذیر بودن. برای شناسایی زیردامنهها هم از سرویس Profundis استفاده شد و یه ابزار هدلس بروزر برای تشخیص دقیقتر نسخه Next.js نوشته شد.
روز انتشار عمومی CVE، مشخص شد که Cloudflare و سایر WAFها پیلودهای اولیه رو شناسایی و بلاک میکنن. یکی از روشهای بایپس استفاده از eval(atob(...)) بود، ولی regex کلودفلر هنوز سینتکس :constructor رو میگرفت. راهحل نهایی اضافه کردن دادههای اضافی داخل ساختار Flight بود تا WAF قبل از رسیدن به بخش مشکوک، بررسی رو متوقف کنه:
'_formData': {
'meow': 'meow'.repeat( 256 * 512 ),
'get': '$3:constructor:constructor'
}با این روش حدود ۵۰۰KB داده بیمعنی قبل از constructor قرار میگرفت و از آستانه اسکن WAF رد میشد — در حالی که هنوز زیر سقف ۱MB محدودیت Next.js بود.
بعداً Vercel یه چلنج باگبانتی ۵۰هزار دلاری برای هر بایپس یونیک WAF خودشون روی HackerOne راه انداخت. Sylvie و Lachlan با کار شبانهروزی ۵ بایپس متمایز ثبت کردن که شامل باگ پارسینگ regex، وارد کردن path.join برای الحاق رشته، decode بازگشتی JSON، و سوءاستفاده از Error.toString میشد. در کل Vercel برای ۲۳ بایپس یونیک (از ۵ نفر مختلف) پرداخت کرد.
نکات کلیدی:
- پروتکل Flight در React بهدرستی نوع دادهها رو اعتبارسنجی نمیکرد و دسترسی به
Function.constructorممکن بود - فقط Next.js نسخه ۱۵ به بالا با App Router آسیبپذیر بود
- بایپس WAF کلودفلر با پر کردن بدنه درخواست تا زیر آستانه اسکن ممکن شد
- ادعاهای Vercel مبنی بر حفاظت کامل پلتفرم در ابتدا نادرست بود
- PoC جعلی در توییتر باعث سردرگمی و گزارشهای اشتباه در ابزارهای اسکنر شد




