
بحثي حول CVE-2025-55182
هذا المستودع هو بحثي حول CVE-2025-55182، والذي يُشار إليه أيضًا بثغرة React2Shell. يتكوّن المستودع من جزأين رئيسيين: بيئة الاختبار (stand) والاستغلال (exploit).
بعض المعلومات حول هذا الخلل الأمني:
الثغرة هي في الأساس نقص في التحقق من إدخال المستخدم. لكن الأمر ليس بهذه البساطة =)
يستخدم جزء React Client وجزء React Server بروتوكول React Flight Protocol لتبادل البيانات. إليك محاضرة جيدة حوله، لتتعرف عليه بسرعة.
مثال على أجزاء رسائل React Flight Protocol:
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
يمكن لأجزاء RFP أن تشير إلى بعضها البعض باستخدام عامل $. عندما يتم إلغاء تسلسل هذه الأجزاء لاحقًا على الخادم، يتم حل هذه الروابط. الأمر الأساسي هنا هو أنه يمكننا الوصول إلى النموذج الأولي للكائن (prototype) منه.
من خلال التلاعب بالنموذج الأولي، يمكننا إجبار V8 على انتظار .then() الخاص بنا. قد تبدو الحمولة الناتجة هكذا:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
لن أدخل في تفاصيل عميقة حول كيفية عمل سلسلة الأدوات (gadget chain) هذه فعليًا؛ إذا كنت تريد معرفة المزيد، اقرأ تحليلًا رائعًا هنا من إعداد Moritz Sanft.
يمكنك أيضًا الاطلاع على مقارنة الإصدارات على GitHub، قبل وبعد التصحيح، إذا أردت التعمق أكثر في هذا الخلل.
لقد أنشأت تطبيقًا بسيطًا بـ react/next.js يستخدم (انظر stand/package.json):
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
مجرد صفحة بسيطة تحتوي على نص، تم إنشاؤها باستخدام create-next-app:
لبدء التشغيل، نفّذ الأمر التالي في مجلد stand:
docker compose up --build -d
ثم انتقل إلى http://localhost:3000 في متصفحك.
عملية الاستغلال مباشرة. كل ما نحتاجه هو إرسال أجزاء RFP مُنشأة خصيصًا مع حمولتنا إلى الخادم عبر طلب Post. انظر exploit/src/main.py. يتضمن أيضًا فحصًا بسيطًا لمعرفة ما إذا كان الخادم ثغرة أم لا، حيث يحاول تشغيل أمر whoami، وإذا تجاوز الوقت المحدد، فمن المرجح أن الخادم يستخدم إصدارًا مصححًا.
يمكنك رؤية حمولة RFP في exploit/resource/chunk.json.
قبل تشغيل الاستغلال، لا تنسَ إعداد مستمع netcat وتحديث exploit/resource/config.toml بالمضيف والمنفذ الخاصين بك، للحصول على قشرة عكسية (reverse shell).
استمتع بالاختراق!
احترام كبير لـ Lachlan Davidson، الذي اكتشف الثغرة، وmaple الذي وجد أداة جيدة، وأيضًا Moritz Sanft، الذي شارك إثبات المفهوم الخاص به وكتب تحليلًا رائعًا.
إنتاج I3r1h0n.