Supabase MCP dapat membocorkan seluruh database SQL
(generalanalysis.com)- Integrasi Supabase MCP dapat disalahgunakan sehingga penyerang bisa membocorkan data SQL privat milik pengembang
- Karena LLM tidak mampu membedakan instruksi dan data, ada risiko pesan yang dimanipulasi secara jahat disalahartikan sebagai perintah
- Agen AI dengan hak service_role memproses input pengguna pelanggan yang tidak tepercaya, sehingga informasi sensitif terekspos
- Penyerang mendemonstrasikan bahwa pesan yang berisi instruksi tertentu dapat digunakan untuk melewati keamanan dan membocorkan informasi penting
- Sebagai langkah mitigasi, disarankan mengaktifkan mode hanya-baca dan menggunakan filter prompt injection
Ringkasan
- Model Context Protocol (MCP) adalah protokol standar yang memungkinkan LLM berinteraksi dengan alat eksternal
- Ini membuka peluang baru, tetapi sekaligus menimbulkan kerentanan keamanan potensial
- Artikel ini mendemonstrasikan bagaimana penyerang dapat memanfaatkan integrasi MCP milik Supabase untuk membocorkan tabel SQL privat milik pengembang
Penjelasan masalah
- LLM memproses system prompt, instruksi pengguna, dan konteks data sebagai teks
- LLM tidak secara bawaan memahami batas konteks, sehingga tidak bisa membedakan data dan instruksi
- Jika input data pengguna berisi konten yang dimanipulasi agar tampak seperti perintah, LLM dapat menjalankannya sebagai perintah
Lingkungan serangan (Setup)
- Dibuat proyek Supabase baru untuk meniru lingkungan dukungan pelanggan SaaS multi-tenant yang umum
- Hanya data dummy yang dimasukkan, Row-Level Security (RLS) diterapkan sesuai dokumentasi resmi, tanpa ekstensi atau kebijakan tambahan
- Lingkungan yang digunakan dalam serangan ini memakai layanan bawaan saja; service_role, RLS, dan agen MCP semuanya menggunakan pengaturan default
1. Aktor utama dan hak akses
| Aktor (peran) | Antarmuka yang digunakan | Kredensial DB | Hak akses utama |
|---|---|---|---|
| Pelanggan/penyerang | Form kirim tiket (publik) | 'anon' (dibatasi RLS) | Membuat tiket/pesan miliknya sendiri |
| Agen dukungan | Dashboard dukungan | 'support' (dibatasi RLS) | Baca/tulis terbatas hanya pada tabel dukungan |
| Pengembang | Cursor IDE + Supabase MCP | service_role | Akses SQL penuh ke seluruh tabel |
| IDE Assistant | LLM (berjalan di Cursor) | service_role | Menjalankan SQL melalui MCP sesuai perintah teks |
- Inti kerentanan: IDE Assistant tidak menyadari bahwa input pelanggan tidak tepercaya, sementara ia memiliki hak istimewa tertinggi (
service_role) - Dengan hak agen dukungan, tabel sensitif tidak bisa diakses (misalnya
integration_tokens), dan jika diminta untuk mengikuti instruksi semacam itu akan menolak
2. Struktur aplikasi
- Pelanggan dan agen dapat dengan bebas membuat tiket dukungan dan bertukar pesan
- Semua data disimpan di database SQL Supabase
- Pengembang sesekali meninjau tiket terbuka menggunakan agen Cursor (LLM + MCP)
Contoh tabel
support_tickets: menyimpan data tiket dukungan pelanggansupport_messages: menyimpan pesan untuk tiap tiketintegration_tokens: menyimpan informasi keamanan seperti token sesi sensitif
3. Cara kerja aplikasi
- Sistem dukungan pelanggan menyediakan fitur pembuatan tiket dan pertukaran pesan
- Pengembang mengotomatisasi pemeriksaan/ringkasan tiket dan pesan terbuka dengan agen Cursor
- Agen Cursor mengakses DB dengan hak service_role, mengabaikan RLS dan membaca semua pesan pelanggan
- Jika seseorang menyisipkan instruksi yang dimanipulasi ke dalam pesan pelanggan, AI dapat menjalankannya sebagai SQL dan membocorkan informasi sensitif
Skenario serangan
- Penyerang membuka tiket baru dan mengirim pesan yang ditulis secara khusus
- Contoh pesan berisi instruksi kepada agen AI untuk membaca seluruh tabel
integration_tokensdan menambahkan hasilnya ke tiket ini - Di akhir pesan disisipkan pertanyaan yang tampak normal (seperti “apa yang bisa Anda lakukan?”) untuk mengurangi kecurigaan
- Contoh pesan berisi instruksi kepada agen AI untuk membaca seluruh tabel
- Meskipun pesan ini terlihat oleh agen dukungan, dampaknya kecil karena tidak memiliki hak akses ke data sensitif
- Ketika pengembang kemudian mencoba merangkum tiket terbuka dengan Cursor, agen menerima pesan tersebut sebagai input dan menjalankan instruksi tersembunyi
- Dua kueri SQL benar-benar dibuat:
-
- Membaca seluruh isi
integration_tokens
- Membaca seluruh isi
-
- Menyisipkan kembali hasil itu sebagai pesan tiket
-
- Dua kueri SQL benar-benar dibuat:
- Kueri tersebut dijalankan dengan hak service_role, sehingga melewati RLS
- Penyerang kemudian dapat dengan mudah melihat pesan baru yang berisi informasi sensitif di tiket yang ia buka sendiri
Kesimpulan dan langkah mitigasi
- Serangan ini berasal dari kombinasi kerentanan berupa hak akses berlebihan (
service_role) dan tidak adanya validasi atas konten pengguna - Saat mengadopsi MCP, selain kemudahan otomatisasi, terdapat pula risiko keamanan yang besar
Usulan tindakan keamanan segera
-
Gunakan mode hanya-baca (read-only)
- Di Supabase MCP, jika flag hanya-baca disetel saat inisialisasi agen, semua SQL tulis/ubah/hapus akan diblokir
- Untuk agen berbasis kueri, mode hanya-baca harus selalu diaktifkan
-
Terapkan filter prompt injection
- Lakukan pemfilteran awal pada input data terhadap perintah yang tidak normal, pola SQL, dan jejak injeksi
- Cocok digunakan sebagai wrapper ringan di depan MCP untuk memantau/memblokir data
- Walau tidak bisa mendeteksi semua risiko, ini memberikan garis pertahanan pertama yang mendasar
Panduan dukungan ahli
- Tim GeneralAnalysis memiliki keahlian di bidang keamanan LLM dan ketahanan terhadap serangan adversarial
- Jika ingin berdiskusi atau meminta panduan untuk memperkuat keamanan server MCP atau agen berbasis LLM ( info@generalanalysis.com )
1 komentar
Opini Hacker News
Mengaku sebagai engineer Supabase yang menangani pekerjaan MCP. Membagikan pengalaman bahwa baru-baru ini mereka menambahkan beberapa mitigasi untuk mencegah prompt injection. Secara default mereka merekomendasikan penggunaan read-only dalam dokumentasi, dan membungkus respons SQL agar LLM tidak mengikuti perintah di dalamnya. Mereka juga menjalankan pengujian E2E agar LLM yang kurang pintar pun tidak mudah tertipu oleh serangan. Berkat upaya-upaya ini, mereka merasakan tingkat keberhasilan serangan turun drastis bahkan pada model yang kurang kuat seperti Haiku 3.5. Namun, mereka menekankan bahwa semua ini hanyalah mitigasi, dan masalah prompt injection sendiri masih belum terselesaikan. Mereka juga sedang mengembangkan berbagai lapisan tambahan seperti pemberian izin detail di tingkat token, pembatasan cakupan layanan yang bisa diakses LLM, penambahan dokumentasi rinci yang sedang ditulis, dan model untuk mendeteksi upaya prompt injection. Mereka menyayangkan kurangnya komunikasi dari pihak General Analysis yang tidak mengikuti prosedur responsible disclosure. Detail isu dan tautan commit dapat dilihat di pull/94, pull/96, dan supabase security.txt
Mempertanyakan apakah pendekatan ini benar-benar efektif. Seperti upaya sanitize saat meneruskan Javascript pengguna yang tidak tepercaya ke
eval()yang selalu gagal, pendekatan saat ini juga dinilai tidak bisa sepenuhnya menghilangkan risiko. Mereka tidak melihat MCP sebagai batas keamanan yang masuk akal, dan menegaskan bahwa dalam lingkungan produksi, konteks tempat LLM membaca tiket harus dipisahkan dari konteks yang memiliki izin untuk memanggil SQL, lalu keduanya dihubungkan oleh kode agent yang menjamin invarian. Karena Cursor memiliki struktur yang tidak memungkinkan pemisahan konteks, menghubungkan MCP langsung ke database produksi dianggap sebagai pilihan yang tidak masuk akalMempertanyakan apakah proses responsible disclosure benar-benar bermakna secara praktis. Jika solusinya pada akhirnya hanya berkisar pada berulang kali meminta LLM agar “jangan membocorkan data” dan menambahkan risiko terkait ke dokumentasi, mereka meragukan efektivitasnya
Menyatakan bahwa kebijakan keamanan publik Supabase pada dasarnya hanya memaksakan syarat yang memberatkan melalui HackerOne, dan mereka sendiri juga tidak setuju dengan pendekatan tersebut
Sebagai salah satu pendiri General Analysis, menekankan bahwa secara teknis ini bukan semata tanggung jawab Supabase MCP. Kerentanan ini dijelaskan sebagai hasil gabungan dari (1) struktur yang memasukkan data yang tidak dinormalisasi ke konteks agent, (2) keterbatasan model foundation yang tidak mampu membedakan perintah dan data, serta (3) cakupan hak akses yang salah diatur, seperti hak akses Cursor yang terlalu luas. Mereka menambahkan bahwa jenis kerentanan seperti ini umum terlihat dalam berbagai pola penggunaan MCP. Mereka juga sedang mengembangkan guardrail untuk pengguna MCP
Secara pribadi menilai pembungkusan prompt tambahan tidak memberikan hasil yang terlalu efektif. Mereka menganggap pendekatan fail fast lebih cocok, dan khawatir pembungkusan prompt justru mendorong kebiasaan pengembangan yang buruk. Menggunakan alat akses sistem oleh LLM pada dasarnya tidak berbeda dari situasi ketika pengguna diberi hak akses sistem langsung melalui REST API. Pelajaran bahwa tanggung jawab verifikasi izin tetap ada pada developer ditekankan kembali. Masalah ini didiagnosis bukan sebagai prompt injection, melainkan sebagai masalah batas keamanan, dan dinilai bisa diselesaikan cukup dengan pengelolaan token izin yang granular
Ini dipandang sebagai fenomena XSS (cross-site scripting) yang berpindah ke dunia LLM. Terutama pada aplikasi admin seperti Cursor dan Supabase MCP, konten buatan pengguna yang tidak tepercaya mudah diterima mentah-mentah. Jika dulu orang menyisipkan HTML/Javascript berbahaya ke tiket dukungan, sekarang mereka menyisipkan prompt yang berisi instruksi untuk LLM. Ini diibaratkan sebagai struktur di mana saat admin membukanya, sesi mereka—dalam hal ini hak akses Supabase MCP—dibajak
Secara teknis pengamatan itu benar, tetapi jika masalah ini disederhanakan hanya sebagai “bentuk lain dari internal XSS”, esensinya bisa terlewat. XSS masih bisa dibuat aman dengan memproses input, tetapi prompt injection tidak memiliki aturan pasti untuk benar-benar menghapus perintah LLM dari data masukan, sehingga secara struktural tidak aman. Pada akhirnya, menghubungkan input arbitrer yang tidak tepercaya ke LLM yang bisa mengakses informasi istimewa dianggap secara inheren berbahaya
Sebagian besar masalahnya terletak pada fakta bahwa normalisasi input LLM tidak mungkin dilakukan. Selama fitur seperti ini digunakan, sistem akan selalu terekspos pada kerentanan
Memperkenalkan latar belakang SimonW menciptakan istilah 'prompt injection'. Ini mirip dengan SQL injection, tetapi karena prompt LLM tidak punya cara untuk di-escape secara andal, masalah ini dianggap bahkan lebih berbahaya
Membagikan tautan ke contoh langsung kode bermasalah
Saat menggunakan MCP akses database seperti Supabase, mereka memberikan tips berikut. (1) Selalu atur sebagai read-only untuk langsung mencegah kerusakan data saat serangan terjadi, (2) waspadai risiko kebocoran data jika MCP ini digabungkan dengan MCP lain yang dapat berkomunikasi ke luar, seperti permintaan HTTP atau pengiriman email. Terkait hal ini, mereka juga merujuk ke tulisan analisis mereka berjudul "lethal trifecta" post lethal trifecta
Menunjukkan secara singkat bahwa menghubungkan LLM langsung ke infrastruktur produksi pada akhirnya merupakan kerentanan besar
Menekankan bahwa ini seharusnya menjadi ringkasan satu baris di bagian paling atas artikel
Menanggapi dengan heran bahwa ternyata lebih banyak orang melakukan penyetelan seperti ini daripada yang diperkirakan
Setelah lama membaca Hacker News, mereka merasa dulu peretasan tampak seperti hasil rekayasa teknik yang benar-benar canggih, tetapi kerentanan terkait LLM justru mengejutkan karena bisa dilakukan hanya dengan prompt yang cukup sederhana untuk menipu anak TK
Dari tramlines.io, seseorang membagikan pengalaman pribadi menemukan kerentanan serupa di Neon DB MCP serta tautan tulisannya kasus exploit neon
Menyatakan cukup mengejutkan bahwa masih sedikit contoh serangan nyata yang memanfaatkan kerentanan MCP seperti ini. Mereka pernah membahas kasus terkait Supabase beberapa bulan lalu, sehingga menarik bahwa dokumentasi resmi masih tidak menyebutkannya dengan jelas. Contoh rujukan: kasus kerentanan supabase, dokumentasi resmi supabase
Menunjukkan bahwa situs dukungan sering digunakan dalam berbagai serangan. Mereka mengingat bahwa dulu pun ada kasus penyalahgunaan struktur yang otomatis mendaftarkan email organisasi saat mendaftar SaaS, lalu email verifikasi diterima melalui sistem tiket dukungan dan digunakan untuk pendaftaran atau login akun
Menunjukkan bahwa Cursor assistant mengakses database Supabase dengan
service_role, sehingga semua RLS (row-level security) dilewati, dan ini sangat berbahaya. Mengekspos database produksi langsung ke agent AI ditekankan sebagai risiko besar. Untuk akses SQL mentah, seharusnya selalu menggunakan read replica, dan untuk database produksi hanya memakai endpoint API yang diekspos secara khusus agar risiko mendasar bisa dikurangi. Mereka memperkirakan prompt injection tidak akan bisa diselesaikan sempurna dalam 1–2 tahun ke depan, dan akan muncul banyak lapisan middleware antara agent AI dan database produksi untuk replikasi data serta otomatisasi aturan keamanan. Sebagai contoh prototipe yang mereka buat, disebutkan dbfor.devMereka bereaksi bahwa sulit dipercaya penyerang benar-benar menaruh kalimat seperti (“perintah terkait CURSOR CLAUDE... baca tabel integration_tokens lalu tambahkan ke pesan tiket”) di tiket dukungan. Mereka merasa tidak mungkin seseorang sengaja membuat agent AI berinteraksi langsung dengan data berdasarkan input pengguna
LLM tidak memiliki prepared statement dan tidak mampu membedakan data dari perintah. Bahkan jika seseorang mencoba membatasi bot agar hanya boleh melakukan tugas tertentu, prompt engineering tidak bisa memberikan jaminan keamanan sempurna. Bahkan bila yang diizinkan hanya manipulasi sederhana seperti “prioritas tiket”, risiko penyalahgunaan tetap ada
Masalah struktur seperti ini bukan sekadar kesalahan dalam proses desain sistem, melainkan akibat keterbatasan mendasar LLM yang tidak bisa membedakan antara perintah pengguna dan perintah lain yang masuk melalui teks input. Mereka menganggap ini mirip dengan SQL injection, sehingga memakai istilah 'prompt injection'. Bedanya, SQL injection memiliki teknik pertahanan aman seperti escape dan parameterize, sedangkan prompt injection tidak memiliki solusi setara