
إثبات مفهوم لاستغلال 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)، ثم تأكد أولاً من اتصال الجهازين الافتراضيين: