900 situs, 125 juta akun, 1 kerentanan
(env.fail)- Satu aturan keamanan Firebase yang salah konfigurasi menyebabkan data pengguna dari ratusan situs terekspos, dengan skala yang terverifikasi saja mencapai sekitar 124,6 juta record
- Investigasi dimulai dengan mencari variabel konfigurasi Firebase di situs web dan bundle JavaScript yang dimuat, lalu ditulis ulang ke Go karena masalah memori pada pemindai Python
- Pemindai pendamping Catalyst secara otomatis memeriksa apakah koleksi Firebase dapat dibaca, lalu memperkirakan jenis dan skala informasi yang terekspos berdasarkan data sampel
- Item yang terekspos dalam agregasi mencakup 84.221.169 nama, 106.266.766 email, 33.559.863 nomor telepon, 20.185.831 kata sandi plaintext, dan 27.487.924 informasi pembayaran
- Tim peneliti mengirim 842 email pelaporan selama 13 hari, tetapi hanya 24% pemilik situs yang memperbaiki konfigurasi, 1% yang membalas, dan hanya 2 situs yang menawarkan bug bounty
Pemindaian eksposur Firebase skala internet
- Setelah kasus pelanggaran Chattr.ai, dimulailah pemindaian skala internet untuk mencari PII yang terekspos melalui instance Firebase yang salah konfigurasi
- Pemindai Python pertama memeriksa variabel konfigurasi Firebase di situs web atau bundle
.jsyang dimuat, tetapi penggunaan memori terus meningkat saat berjalan dengan sekitar 500 thread dan mengalami OOM dalam waktu kurang dari satu jam - Pemindai yang kemudian ditulis ulang dalam Go dijalankan terhadap 5,5 juta domain, dan memerlukan waktu 2–3 minggu, lebih lama dari perkiraan awal sekitar 11 hari
- Hanya dari tinjauan manual awal saja sudah ditemukan 136 situs dan 6,2 juta record, tetapi daftar kandidat yang sangat besar membuat otomasi penuh menjadi perlu
Catalyst dan estimasi skala eksposur
- Catalyst menerima situs kandidat atau bundle JavaScript sebagai input, lalu secara otomatis memeriksa apakah ada akses baca ke koleksi Firebase umum maupun koleksi yang disebut langsung di JavaScript
- Jika menemukan koleksi yang dapat dibaca, alat ini mengumpulkan sampel 100 record untuk mengidentifikasi jenis informasi yang terkandung, lalu mengalikannya dengan ukuran total koleksi untuk memperkirakan dampak
- Sebagai penyimpanan hasil, dipilih Supabase, produk open-source berbasis PostgreSQL yang bersaing dengan Firebase, dan data yang telah dirapikan diunggah ke tabel database privat
- Angka agregatnya adalah sebagai berikut, dan skala eksposur sebenarnya masih mungkin lebih besar daripada angka yang ditampilkan
- Total record: 124.605.664
- Nama: 84.221.169
- Email: 106.266.766
- Nomor telepon: 33.559.863
- Kata sandi: 20.185.831
- Informasi pembayaran: 27.487.924, termasuk informasi bank dan invoice
Situs dengan dampak terbesar
-
Silid LMS
- Sistem manajemen pembelajaran untuk siswa dan guru
- Menjadi kasus terbesar dengan 27 juta record pengguna yang terekspos, termasuk nama, email, dan nomor telepon
-
Jaringan judi online
- Terdiri dari 9 situs yang saling di-reskin
- Beberapa spin dimanipulasi agar peluang menang menjadi 0%
- Detail login lengkap akun bank yang terekspos mencapai 8 juta, yang merupakan jumlah terbesar
- 10 juta kata sandi plaintext juga terekspos, terbesar di antara situs-situs yang terdampak
- Saat mencoba melaporkan masalah tersebut, dukungan pelanggan justru menggoda peneliti di tengah percakapan
-
Lead Carrot
- Layanan pembuatan lead online untuk cold call
- Menempati peringkat ketiga dalam jumlah data pengguna yang terekspos, memengaruhi 22 juta orang
-
MyChefTool
- Aplikasi manajemen bisnis dan aplikasi POS untuk restoran
- Menempati peringkat pertama untuk jumlah nama yang terekspos dan kedua untuk email, masing-masing sebanyak 14 juta dan 13 juta
Respons setelah pelaporan
- Tim peneliti mengirim 842 email selama 13 hari
- 85% berhasil terkirim dan 9% memantul
- 24% pemilik situs memperbaiki konfigurasi yang salah
- Hanya 1% pemilik situs yang membalas
- 2 pemilik situs, setara 0,2%, menawarkan bug bounty
1 komentar
Komentar Hacker News
Saya sudah lama bekerja di Firebase, dan masalah security rules terus menghantui produk ini
Berbagai pendekatan sudah dicoba, seperti aturan bawaan yang kedaluwarsa otomatis dan peningkatan edukasi, tetapi pada akhirnya masih banyak database yang terlihat tidak aman
Alasannya rumit: security rules ala Firebase masih merupakan konsep yang asing, dan pengembang baru yang menambahkan data ke lokasi yang sudah ada sering kali tidak ikut memperbarui aturan agar sesuai dengan perubahan kebutuhan privasi data
Selain itu, “security through obscurity” yang dulu diberikan oleh backend buatan masing-masing jadi hilang, sehingga pemindaian skala besar menjadi mudah
Khususnya, aturan Realtime Database sulit ditulis dan kurang bagus skalabilitasnya, tetapi pemindaian otomatis biasanya hanya mencari data yang terbuka, jadi aturan yang sedikit lebih baik daripada
read write truesaja sudah cukup untuk mencegahnyaSecara teknis, pendekatan Firebase sendiri bukan sesuatu yang salah, tetapi karena ini adalah salah satu dari sangat sedikit backend yang memakai model berpusat pada data tersimpan dan security rules, sistem ini mudah disalahpahami, disalahgunakan, dan rentan terhadap insiden seperti ini
Di backend, validasi dan aturan keamanan terlihat sebagai bagian dari spesifikasi, tetapi security rules Firebase adalah proses terpisah sehingga mudah terlupakan dan perlu dievaluasi ulang setiap kali membuat fitur baru
Rasanya perlu eskalasi cukup tinggi di internal Firebase untuk menarik perhatian orang yang bisa memberi tahu pemilik proyek
Misalnya, apakah template seperti “hanya pemilik konten yang boleh mengakses” atau “akses berbasis atribut/peran” bisa mencakup pola sebagian besar aplikasi, atau apakah benar-benar tetap butuh banyak aturan kustom
Masalah besar dalam menulis security rules adalah hampir semua kesalahan menjadi masalah keamanan, jadi kalau tidak perlu, orang tentu tidak ingin menyentuhnya
Jika aturan terlalu ketat, aplikasi langsung tidak berjalan dan itu langsung terlihat, tetapi jika terlalu longgar, akses berlebihan sering tidak terlihat sampai seseorang benar-benar mengujinya
Terkait itu, mungkin layak juga memaksa pengembang menulis test case contoh penolakan akses untuk setiap security rule
fireplanmenambahkan aturan default"$other": {".read": false, ".write": false}ke semua propertiDengan begitu, field baru harus ditambahkan secara eksplisit, sehingga hampir mustahil nilai baru tanpa sadar “mewarisi” aturan yang sudah ada
Saya sudah memakai Firebase lebih dari 10 tahun, jadi saya tidak tahu apakah alat rules terbaru juga melakukan hal seperti ini
Hal yang benar-benar membantu adalah dukungan bawaan untuk mengganti nama field atau mengubah struktur data saat ada banyak versi klien yang sulit dikendalikan, cara ringan untuk menguji rules tanpa menjalankan database, dan informasi debugging yang lebih baik saat rules gagal di lingkungan produksi
Setiap kali gagal, seharusnya semua nilai yang diakses oleh rules ikut dicatat, agar kegagalan sementara akibat data yang berubah bisa di-debug
Ini adalah model konseptual yang belum dijelaskan dengan cukup baik
Dalam proyek, saya biasanya mengatakan bahwa setiap collection harus punya profil keamanan seperti publik, data pengguna, publik hanya untuk pengguna terautentikasi, atau khusus admin, lalu memaksakan kategori-kategori itu lewat fungsi security rules alih-alih menulis kondisi kustom untuk tiap collection
Jika keamanan dipikirkan pada tingkat collection, bukan tingkat field, kemungkinan tercampurnya niat keamanan yang berbeda dalam satu dokumen bisa dikurangi
Jika sebuah collection bersifat publik, maka ia tidak boleh memuat field yang tidak publik; jika perlu, data bisa disalin dari konteks sensitif ke konteks publik lewat trigger Firestore, tetapi tidak untuk arah sebaliknya
Masalahnya, niat dari aturan itu sendiri harus didokumentasikan di luar rules, sehingga mudah diterapkan secara keliru, dan dulu menulis pengujian juga sangat menyakitkan, walaupun sekarang sudah jauh lebih baik
Ini mengingatkan saya pada “How I pwned half of America’s fast food chains, simultaneously.”: https://mrbruh.com/chattr/
HN: https://news.ycombinator.com/item?id=38933999
After the initial buzz of [pwning Chattr.ai] had settled down, […]Kalau saya tidak salah baca, artinya pada akhir tulisan itu 75% situs yang punya kerentanan seperti ini masih tetap terbuka dan masih bisa di-dump, bukan?
Gila
Kadang saya merasa harus ada lisensi untuk boleh menyentuh komputer
Mereka mengalihdayakan pembuatan situs ke agensi, lalu agensi itu terus mengganti pengembang: awalnya menempatkan pengembang yang bagus, kemudian menyerahkan kontrak ke pengembang yang kurang berpengalaman selama perusahaan klien tidak mengeluh
Email soal kerentanan kemungkinan diabaikan sebagai spam, atau diteruskan lalu dibiarkan, atau masuk ke antrean rapat PM sebagai item yang akan diperbaiki sambil menagih klien semaksimal mungkin
Bahkan di bidang yang mewajibkan lisensi profesional pun banyak pemegang lisensi yang tidak kompeten
Dokter juga punya persyaratan pendidikan dan lisensi yang sangat berat, tetapi dukun medis dan praktisi pengobatan alternatif berlisensi tetap tidak sedikit
Saya sudah berusaha sebaik mungkin dengan mengirim email kustom ke tiap situs, berisi dampak yang mereka alami, cara memperbaikinya, dan cara menghubungi saya
Ini adalah konsekuensi yang nyaris tak terelakkan dari pilihan murah dan cepat dalam segitiga cheap-fast-good milik PM
Sayangnya, kekhawatiran sebagian pelanggan dan pengguna tersisih dari pembahasan, dan data pribadi merekalah yang menjadi biayanya
Dari perusahaan-perusahaan yang tercantum di sini, saya akan berhati-hati terhadap tempat yang membuat keputusan seperti itu tetapi kepemimpinannya tidak berubah
Sudah berkali-kali terbukti bahwa banyak perusahaan tidak cukup peduli untuk melindungi pelanggan, dan sejarah terus berulang
Saya punya pertanyaan yang sangat mendasar tentang Firebase: apakah sebagian besar aplikasi dalam artikel ini dibangun hanya dengan JavaScript sisi klien yang di-host secara statis, tanpa kode server kustom?
Maksud saya, apakah backend-nya 100% berupa konfigurasi Firebase yang di-host oleh Google?
Kalau begitu, saya tidak menyadari bahwa arsitektur seperti ini sudah menjadi begitu umum di situs dengan jutaan pengguna
Kalau Anda memakai model keamanan allow by default di API, hal seperti ini pada akhirnya pasti terjadi
Sayangnya, default yang tidak aman umum ditemukan pada library yang menargetkan developer JavaScript, dan GraphQL juga tampak seperti area yang rawan memunculkan masalah semacam ini
Firebase juga punya Firebase Functions, yaitu fungsi yang bisa dipanggil di cloud, dan kodenya tidak dibuka ke publik
Tetapi Firestore dan Firebase Realtime Database sama-sama mengharuskan pengguna menetapkan aturan keamanan; kalau tidak, siapa pun bisa membaca semua data
Yang penting adalah membuat penulisan aturan otorisasi yang tepat di backend menjadi mudah
Melihat hal seperti ini membuat saya merasa beruntung karena sudah lama memilih password manager dan kartu virtual
Meski begitu, internet jadi terasa semakin menakutkan
Kebanyakan orang sama sekali tidak tahu seberapa rapuh web dan seberapa tereksposnya mereka
AI agent akan bisa menemukan celah dengan jauh lebih efisien daripada bot, jadi rasanya masa depan yang aneh sedang menunggu
Anda perlu memakai alamat email unik untuk setiap layanan yang Anda daftari
Itu membatasi dampak saat terjadi insiden, dan juga mencegah pengumpulan informasi publik dengan mencocokkan data dari layanan lain
Kadang kalau email berbahaya datang ke alamat unik itu, Anda bahkan bisa menyadari adanya kompromi sebelum operator situs mengetahuinya
Apakah ada yang tahu lebih banyak soal bagian “program Python dengan sekitar 500 thread mulai memakan memori seiring waktu”?
Saya juga punya scraper di Python dengan ratusan thread, dan rasanya memang banyak makan memori
Saya penasaran apakah ada solusi sementara, atau satu-satunya jalan keluar adalah menulis ulangnya dalam bahasa lain
Secara pribadi saya lebih suka proses daripada thread, dan memakai worker pool serta message bus alih-alih shared memory
Solusi ini juga punya kekurangan dan sedikit overhead, tetapi Anda jadi jauh lebih jarang perlu mengkhawatirkan masalah memori
Untuk crawler, jumlah prosesnya relatif tetap dan pekerjaan tiap proses independen, jadi model proses tampaknya lebih cocok
import multiprocessing as threadingMenulis ulangnya nyaris merupakan satu-satunya solusi yang praktis
Ini benar-benar use case yang sangat cocok
Bagus
Saya penasaran bagaimana Anda sampai pada kesimpulan bahwa jumlah pengguna yang terdampak kemungkinan sebenarnya lebih besar
Dari kelihatannya, untuk beberapa situs seperti situs judi atau Lead Carrot, mungkin ada banyak data akun palsu yang tercampur
Ini adalah pendekatan yang hanya bekerja baik pada situs berbahasa Inggris
Alasan kami mengatakan jumlahnya mungkin lebih besar adalah karena layanan lain yang tidak ada dalam daftar pemindaian juga bisa saja rentan