FixVibe
Covered by FixVibehigh

Mengamankan Next.js + Supabase: Mencegah Bypass Keamanan Tingkat Baris (RLS)

Aplikasi yang dibangun dengan Next.js dan Supabase sering kali mengandalkan Keamanan Tingkat Baris (RLS) untuk melindungi data. Kegagalan untuk mengaktifkan RLS atau kesalahan konfigurasi klien Supabase dapat menyebabkan paparan database penuh, memungkinkan pengguna yang tidak sah untuk membaca atau mengubah catatan sensitif.

CWE-284

Dampak

Penyerang dapat melewati logika aplikasi untuk membaca, memperbarui, atau menghapus catatan dalam database jika Keamanan Tingkat Baris (RLS) tidak diterapkan dengan benar [S1]. Hal ini sering kali mengakibatkan terbukanya Informasi Identifikasi Pribadi (PII) atau data aplikasi sensitif kepada pengguna yang hanya memiliki akses ke kunci API anonim publik.

Akar Penyebab

Supabase menggunakan Keamanan Tingkat Baris Postgres untuk mengelola akses data di tingkat database, yang merupakan dasar untuk mengamankan data [S1]. Dalam lingkungan Next.js, pengembang harus membuat klien Supabase yang menangani cookie dan sesi dengan benar untuk menjaga keamanan selama rendering sisi server [S2]. Kerentanan biasanya muncul ketika:

  • Tabel dibuat tanpa mengaktifkan RLS, sehingga dapat diakses melalui kunci langsung publik [S1].
  • Klien Supabase salah dikonfigurasi di Next.js, gagal meneruskan token autentikasi pengguna dengan benar ke database [S2].
  • Pengembang secara tidak sengaja menggunakan kunci service_role dalam kode sisi klien, yang melewati semua kebijakan RLS [S1].

Perbaikan Beton

  • Aktifkan RLS: Pastikan Keamanan Tingkat Baris diaktifkan untuk setiap tabel di database Supabase [S1] Anda.
  • Tentukan Kebijakan: Buat kebijakan Postgres khusus untuk operasi SELECT, INSERT, UPDATE, dan DELETE untuk membatasi akses berdasarkan UID [S1] pengguna.
  • Gunakan Klien SSR: Terapkan paket @supabase/ssr untuk membuat klien di Next.js yang mengelola autentikasi sisi server dan persistensi sesi [S2] dengan benar.

Bagaimana FixVibe mengujinya

FixVibe sudah membahas hal ini melalui aplikasi yang diterapkan dan pemeriksaan repo. Modul pasif baas.supabase-rls menemukan URL Supabase dan pasangan kunci langsung dari bundel JavaScript asal yang sama, meminta PostgREST untuk metadata tabel publik, dan melakukan pemilihan hanya baca terbatas untuk mengonfirmasi paparan data anonim tanpa mengubah data pelanggan. Pemindaian repo juga menjalankan repo.supabase.missing-rls untuk menandai migrasi SQL yang membuat tabel publik tanpa ENABLE ROW LEVEL SECURITY, dan pemindaian rahasia mencari paparan kunci peran layanan sebelum mencapai browser.