CVE-2026-126187 RCE pada Component React Server dan Mitigasinya

CVE-2026-126187 RCE pada Component React Server dan Mitigasinya

CVE-2026-126187 merupakan kerentanan pada React Server Components (RSC) yang, dalam kondisi aplikasi tertentu, dapat memungkinkan remote code execution (RCE) tanpa login. Isunya melibatkan cara React mengirim dan membaca ulang data melalui protokol Flight, khususnya ketika fitur caching dipakai bersama typed array yang berbagi ArrayBuffer.

Tim Ethic Ninja mereproduksi perilaku tersebut dalam Docker lab dengan Next.js 16.4.0 dan React 19.3.0. Pada konfigurasi lab, request HTTP GET tanpa cookie berhasil memicu Server Action dan menjalankan perintah di dalam container sebagai user node. Pengujian pembanding menggunakan Next.js 16.4.1 tidak menunjukkan perilaku yang sama.

Hasil ini tidak berarti setiap website Next.js dapat langsung dieksploitasi. Jalur yang kami uji memerlukan kombinasi pola cache, struktur data tertentu, input yang dapat dikontrol pengguna, dan Server Action yang dapat di-resolve. 

Gambar 1. Gambaran konseptual alur kerentanan dari data cache hingga pemanggilan Server Action.

Mengapa masalah ini bisa muncul?

React Server Components memungkinkan sebagian pekerjaan rendering dilakukan di server. Data hasil rendering dikirim ke browser lewat format bernama Flight. Format ini tidak hanya berisi teks atau HTML, tetapi juga dapat membawa data biner, referensi komponen, dan informasi lain yang akan diproses kembali oleh React.

Pada Next.js 16, fitur Cache Components dan directive `use cache` dapat menyimpan hasil fungsi server. Ketika cache digunakan kembali, data Flight tersebut di-deserialize. Artinya, server bukan sekadar menampilkan data cache, melainkan menafsirkannya kembali sebagai struktur data yang memiliki makna bagi runtime.

Masalah utama muncul ketika dua typed array merujuk ke ArrayBuffer yang sama. Pada jalur yang rentan, serialisasi array pertama dapat menyebabkan backing buffer ter-detach. Akan tetapi, ukuran payload array berikutnya masih tercatat seolah-olah seluruh datanya tersedia. Saat data cache dibaca ulang, parser dapat membaca melewati batas payload yang semestinya dan menginterpretasikan byte berikutnya sebagai bagian dari stream Flight.

Jika byte lanjutan tersebut dikendalikan pihak luar dan cocok dengan struktur yang diharapkan parser, nilai yang semestinya hanya menjadi data dapat memengaruhi pemrosesan Server Action. Inilah alasan masalah serialisasi yang tampak sederhana bisa berkembang menjadi RCE pada aplikasi dengan prasyarat yang tepat.

Lingkungan pengujian

Pengujian menggunakan satu container berbasis Node.js 22 Bookworm Slim, Next.js 16.4.0, dan React 19.3.0. Aplikasi lab sengaja dibuat minimal: tidak membutuhkan database, Redis, atau external cache handler. Sebuah halaman menampilkan hasil fungsi `use cache` yang mengembalikan dua typed array dan satu nilai annotation.

Untuk pembanding, konfigurasi serupa dijalankan menggunakan Next.js 16.4.1. Dengan pendekatan ini, perbedaan perilaku dapat diamati tanpa bergantung pada konfigurasi sistem yang kompleks.

Gambar 2. Tampilan aplikasi lab sebelum input pengujian diberikan.

Sebelum masuk ke pembuktian RCE, ada indikasi masalah pada proses read-back cache. Di versi rentan, endpoint diagnostik gagal memproses kembali data yang sudah diserialisasi, meskipun belum diberi input eksploitasi.

Gambar 3. Pada versi 16.4.0, endpoint diagnostik menunjukkan kesalahan saat membaca cache.

Gambar 4. Pada versi patched 16.4.1, kedua typed array kembali dibaca dengan ukuran dan isi yang sesuai.

Hasil pengujian

Tahap berikutnya menguji apakah kesalahan pembacaan data dapat memengaruhi pemanggilan Server Action. Di lab, request tanpa autentikasi berhasil menyebabkan aplikasi menjalankan Server Action dengan argumen yang tidak berasal dari alur UI normal.

Output sistem menunjukkan perintah dijalankan di lingkungan container sebagai user `node` (UID 1000). Ini membuktikan eksekusi kode pada konteks proses aplikasi yang diuji; bukan bukti bahwa penyerang otomatis mendapatkan akses root pada host Docker.

Gambar 5. Bukti lab: Server Action terpanggil dan perintah dieksekusi pada container versi rentan.

Tim kemudian memeriksa hasilnya melalui halaman aplikasi. Nilai yang tampil bukan sekadar input yang dikirim pengguna, tetapi mencerminkan output dari tindakan yang berjalan di sisi server.

Gambar 6. Halaman aplikasi menunjukkan perubahan nilai setelah Server Action dieksekusi.

Pengujian lanjutan menunjukkan bahwa argumen yang diterima action dapat memengaruhi operasi server. Untuk memastikan bahwa hasilnya bukan hanya manipulasi tampilan, tim juga melakukan pemeriksaan out-of-band: efek pengujian tercatat sebagai file pada filesystem container.

Gambar 7. Hasil pengujian memperlihatkan Server Action memproses argumen dari jalur yang tidak semestinya.

Gambar 8. Bukti out-of-band berupa perubahan pada filesystem container.

Apakah patch memperbaiki masalahnya?

Pengujian pembanding dilakukan pada Next.js 16.4.1. Input uji yang sama tidak lagi menyebabkan data dibaca sebagai struktur Flight tambahan. Pada konfigurasi patched, data tetap diperlakukan sebagai nilai biner, dan Server Action tidak dieksekusi melalui jalur tersebut.

Gambar 9. Input pengujian tidak menghasilkan eksekusi pada versi 16.4.1.

Gambar 10. Tampilan aplikasi patched tetap menampilkan data sebagai nilai biasa.

Tim juga membandingkan penanda perubahan pada bundle React Server Components yang disertakan Next.js. Temuan ini mendukung adanya perbedaan implementasi antara kedua build, tetapi keberadaan satu nama fungsi tidak sebaiknya digunakan sebagai satu-satunya indikator keamanan untuk semua versi dan konfigurasi.

Gambar 11. Perbandingan marker perubahan pada bundle versi rentan dan patched.

Dampak dan syarat agar kerentanan bisa dieksploitasi

Dampak potensialnya serius: ketika alur yang rentan dapat dicapai dan Server Action yang tersedia memiliki kemampuan berbahaya, penyerang dapat memicu eksekusi kode dari jarak jauh (RCE). Akan tetapi, hasil pengujian kami juga menunjukkan adanya prasyarat khusus. Aplikasi harus menggunakan alur caching dan struktur data yang relevan, sementara runtime perlu dapat me-resolve Server Action yang menjadi sasaran.

Karena itu, RCE tanpa autentikasi di lab tidak dapat digeneralisasi menjadi klaim bahwa semua deployment React atau Next.js memiliki jalur eksploitasi yang identik. Lingkup produk, versi terdampak, dan rekomendasi upgrade perlu mengikuti advisory React dan Next.js, termasuk kemungkinan jalur terdampak lain yang tidak dicakup oleh reproduksi ini.

Dokumen awal mencatat CVSS v4 9.5 (Critical), serta versi perbaikan React 19.0.9, 19.1.10, 19.2.9, 19.3.1 dan Next.js 16.4.1. Pastikan daftar versi ini dibandingkan kembali dengan advisory vendor sebelum dipublikasikan atau digunakan dalam inventarisasi produksi.

Mitigasi dan langkah pemeriksaan

  • Prioritaskan upgrade Next.js dan paket react-server-dom-* sesuai jalur versi yang direkomendasikan vendor. Setelah update dependency, build ulang dan redeploy image/container; jangan hanya mengubah package.json.
  • Periksa versi yang benar-benar berjalan di production, termasuk dependensi yang telah di-bundle oleh framework. Lockfile repository saja tidak selalu mencerminkan isi image yang ter-deploy.
  • Audit Server Actions yang dapat dipanggil dari aplikasi. Terapkan autentikasi dan authorization di dalam action, bukan hanya pada tombol atau halaman UI yang memanggilnya.
  • Batasi kemampuan proses Node.js: jalankan sebagai non-root, kurangi izin filesystem, hindari secret yang tidak perlu, dan batasi koneksi keluar apabila memungkinkan.
  • Pantau log request yang tidak wajar pada endpoint cache serta aktivitas child process dan perubahan filesystem yang tidak diharapkan. Parameter panjang bukan bukti eksploitasi dengan sendirinya.
  • Jika aplikasi pernah terekspos dalam kondisi rentan dan ada indikator kompromi, lakukan incident review: periksa deployment, secret, log akses, aktivitas proses, dan rotasi kredensial sesuai hasil investigasi.

Menonaktifkan satu fitur atau menambahkan filter input tidak boleh dianggap sebagai pengganti patch resmi. Bila upgrade belum dapat dilakukan, pembatasan exposure dan monitoring hanya mengurangi risiko sementara.

Pelajaran bagi pengembang aplikasi

Kasus ini menunjukkan bahwa boundary antara data dan instruksi tidak hanya penting saat memproses input pengguna secara langsung. Data yang sudah diserialisasi, disimpan di cache, lalu dibaca kembali juga harus diperlakukan secara hati-hati. Ketika parser salah mengenali batas data, informasi yang semestinya pasif bisa mendapat makna baru di dalam runtime.

Hal lain yang tidak kalah penting adalah desain Server Action. Fitur ini mempermudah pengembangan, tetapi setiap action tetap harus memiliki kontrol akses dan validasi argumen sendiri. Keamanan tidak boleh bergantung pada asumsi bahwa pengguna hanya dapat memanggil action melalui UI yang disediakan.

Untuk penelitian ini, screenshot dan output lab mendukung adanya eksekusi perintah pada konfigurasi yang diuji. Namun, validasi independen terhadap source code PoC, raw log, dan build artifacts masih diperlukan jika hasil tersebut hendak diklaim sebagai reproduksi yang dapat diaudit sepenuhnya.

Referensi

Catatan editorial: Artikel ini mengulas hasil reproduksi yang tercantum dalam dokumen laboratorium Ethic Ninja. Rincian konstruksi payload sengaja tidak dijabarkan karena tidak diperlukan untuk memahami akar masalah, dampak, atau mitigasinya.

Leave a Reply 0

Your email address will not be published. Required fields are marked *