- Hanya dari urutan pengembalian
indexedDB.databases(), dimungkinkan membuat pengenal stabil pada browser berbasis Firefox yang bertahan selama masa hidup proses
- Pengenal ini dibagikan melampaui cakupan origin, sehingga situs yang tidak saling terkait pun dapat mengamati nilai yang sama dalam runtime browser yang sama dan memakainya untuk pelacakan lintas-origin
- Di Private Browsing Firefox, pengenal tetap bertahan selama proses masih hidup bahkan setelah semua jendela privat ditutup, dan di Tor Browser juga tetap ada setelah New Identity
- Penyebabnya ada pada implementasi IndexedDB di Gecko yang memetakan nama basis data privat ke nama file berbasis UUID lalu mengekspos hasilnya tanpa pengurutan
- Mozilla telah merilis perbaikan di Firefox 150 dan ESR 140.10.0, dan desain yang tidak mengungkap urutan penyimpanan internal ke luar penting untuk perlindungan privasi
Ringkasan kerentanan
- Di semua browser berbasis Firefox, dimungkinkan mengekstrak pengenal yang bertahan selama masa hidup proses melalui urutan item yang dikembalikan oleh
indexedDB.databases()
- Jika sebuah situs membuat beberapa basis data IndexedDB lalu memeriksa urutan pengembaliannya, situs itu dapat membuat pengenal unik dan deterministik untuk proses browser yang sedang berjalan
- Perilaku ini muncul pada cakupan proses, bukan cakupan origin, sehingga situs yang sama sekali tidak terkait pun dapat mengamati pengenal yang sama dalam runtime browser yang sama
- Di Private Browsing Firefox, pengenal tetap bertahan jika proses Firefox masih berjalan walaupun semua jendela privat telah ditutup
- Di Tor Browser, pengenal stabil tetap bertahan bahkan setelah New Identity, yang menghapus cookie dan riwayat kunjungan serta menggunakan sirkuit Tor baru
- Ini bertentangan dengan harapan bahwa aktivitas browser setelahnya tidak boleh bisa dihubungkan dengan aktivitas sebelumnya, sehingga melemahkan jaminan keterputusan yang diandalkan pengguna
- Pengungkapan yang bertanggung jawab dilakukan kepada Mozilla dan Tor Project
- Mozilla telah merilis perbaikan di Firefox 150 dan ESR 140.10.0
- Patch dilacak di Mozilla Bug 2024220, dan akar masalahnya ada pada implementasi IndexedDB di Gecko sehingga juga relevan bagi Tor Browser dan browser berbasis Firefox lain
- Prinsip perbaikannya sederhana
- Browser tidak boleh mengekspos urutan penyimpanan internal pada cakupan proses ke luar
- Jika hasil dinormalisasi atau diurutkan sebelum dikembalikan, entropi dapat dihilangkan dan penyalahgunaan pengenal stabil dapat dicegah
Mengapa ini penting
- Mode private browsing dan browser yang berfokus pada privasi bertujuan membuat pengguna lebih sulit diidentifikasi di berbagai konteks
- Harapan umum 1: tanpa penyimpanan bersama atau mekanisme identitas eksplisit, situs yang tidak saling terkait seharusnya tidak dapat mengetahui apakah mereka berinteraksi dengan instance browser yang sama
- Harapan umum 2: ketika sesi privat berakhir, informasi yang terkait dengan sesi tersebut juga seharusnya ikut hilang
- Perilaku ini melanggar kedua harapan itu
- Situs dapat menurunkan pengenal hanya dari perilaku penyimpanan internal browser, tanpa cookie, localStorage, atau kanal lintas-situs eksplisit
- Sinyal pengenal berkapasitas tinggi dapat diperoleh dari urutan nama basis data yang dikembalikan API
- Ada pelajaran penting dari sudut pandang pengembang
- Kerentanan privasi tidak hanya muncul dari akses langsung ke data identitas
- Kebocoran privasi juga dapat terjadi saat detail implementasi internal terekspos secara deterministik
- Poin inti dari sudut pandang keamanan dan produk
- API yang tampak tidak berbahaya pun bisa berubah menjadi vektor pelacakan lintas-situs jika membocorkan status stabil tingkat proses
IndexedDB dan indexedDB.databases()
- IndexedDB adalah API browser untuk penyimpanan data terstruktur di sisi klien
- Aplikasi web memakainya untuk dukungan offline, caching, status sesi, dan tujuan penyimpanan lokal lainnya
- Setiap origin dapat membuat satu atau lebih basis data bernama, dengan object store dan penyimpanan data berukuran besar
indexedDB.databases() mengembalikan metadata basis data yang dapat dilihat oleh origin saat ini
- Pengembang dapat memakainya untuk memeriksa basis data yang ada, men-debug penggunaan penyimpanan, dan mengelola status aplikasi
- Dalam ekspektasi privasi yang wajar, urutan pengembalian API ini sendiri tidak boleh memuat informasi pengenal
- Representasi metadata basis data seharusnya netral atau sudah dinormalisasi
- Masalah nyatanya adalah bahwa pada browser berbasis Firefox, urutan pengembalian ini sama sekali tidak netral
Bagaimana indexedDB.databases() menjadi pengenal stabil
- Di Firefox Private Browsing,
indexedDB.databases() mengembalikan metadata dalam urutan yang diturunkan dari struktur penyimpanan internal, bukan dari urutan pembuatan basis data
- Lokasi implementasi terkait ada di
dom/indexedDB/ActorsParent.cpp
- Dalam Private Browsing, nama basis data tidak dipakai langsung sebagai pengenal di disk
- Sebagai gantinya, nama itu dipetakan ke basis nama file berbasis UUID melalui hash table global
StorageDatabaseNameHashtable = nsTHashMap<nsString, nsString>
- Pemetaan ini dilakukan di
GetDatabaseFilenameBase() dalam OpenDatabaseOp::DoDatabaseWork()
- Saat
aIsPrivate bernilai true, nama basis data yang diberikan situs diganti dengan UUID yang dihasilkan lalu disimpan dalam StorageDatabaseNameHashtable global
- Kuncinya hanya memakai string nama basis data
- Bertahan selama masa hidup IndexedDB QuotaClient
- Dibagikan di semua origin
- Hanya diinisialisasi ulang saat Firefox benar-benar direstart
- Ketika
indexedDB.databases() dipanggil kemudian, Firefox mengumpulkan nama file basis data melalui QuotaClient::GetDatabaseFilenames(...) di GetDatabasesOp::DoDatabaseWork()
- Basis nama basis data dimasukkan ke dalam
nsTHashSet
- Tidak ada pengurutan apa pun yang dilakukan sebelum iterasi
- Urutan hasil akhir ditentukan oleh hasil penelusuran layout bucket internal hash set
- Karena pemetaan UUID tetap stabil selama masa hidup proses Firefox, urutan pengembalian juga tetap menjadi fungsi deterministik dari nilai UUID yang dihasilkan, perilaku fungsi hash, kapasitas hash table, dan riwayat penyisipan
- Urutan ini bertahan di seluruh tab dan jendela privat, dan hanya direset saat seluruh Firefox direstart
- Baik pemetaan UUID maupun iterasi hash set berada pada cakupan proses, bukan cakupan origin
Cara reproduksi
- Perilaku ini dapat dibuktikan hanya dengan PoC sederhana
- Dua origin berbeda meng-host skrip yang sama
- Tiap skrip membuat basis data dengan himpunan nama tetap, memanggil
indexedDB.databases(), lalu mengekstrak dan menampilkan urutan pengembaliannya
- Pada build Firefox Private Browsing dan Tor Browser yang terdampak, kedua origin mengamati permutasi yang sama selama masa hidup proses browser yang sama
- Jika browser direstart, permutasinya berubah
- Contoh keluaran konseptual
- Urutan pembuatan:
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p
- Urutan pengembalian:
g,c,p,a,l,f,n,d,j,b,o,h,e,m,i,k
- Yang penting bukan urutan tepatnya
- Urutannya berbeda dari urutan pembuatan semula
- Urutan yang sama muncul di origin yang tidak terkait
- Tetap bertahan setelah refresh, jendela privat baru, dan bahkan setelah semua jendela privat ditutup
- Hanya restart browser penuh yang menghasilkan urutan baru
- Ini secara langsung menunjukkan sifat yang tidak diinginkan dari sudut pandang privasi
Dampak terhadap privasi
- Kerentanan ini memungkinkan pelacakan cross-origin maupun same-origin dalam satu runtime browser
-
Dampak cross-origin
- Situs web yang tidak saling terkait dapat secara independen menurunkan pengenal yang sama dan menyimpulkan bahwa mereka sedang berinteraksi dengan proses Firefox atau Tor Browser yang sama
- Aktivitas lintas domain dapat dihubungkan tanpa cookie atau penyimpanan bersama lain
-
Dampak same-origin
- Di Firefox Private Browsing, pengenal tetap bertahan setelah semua jendela privat ditutup selama proses Firefox masih berjalan
- Situs dapat mengenali kembali kunjungan berikutnya yang tampak seperti sesi privat baru
- Di Tor Browser, pengenal stabil ini secara efektif meniadakan isolasi New Identity dalam proses browser yang sedang berjalan
- Ini memungkinkan keterhubungan antara sesi yang seharusnya benar-benar terpisah
-
Mengapa ini sangat serius di Tor Browser
- Tor Browser dirancang untuk mengurangi kemungkinan keterhubungan lintas-situs dan meminimalkan pengenal pada tingkat instance browser
- Pengenal stabil yang bertahan selama masa hidup proses bertentangan langsung dengan tujuan desain tersebut
- Bahkan jika hanya bertahan sampai proses direstart penuh, itu sudah cukup untuk melemahkan keterputusan selama penggunaan aktif
Entropi dan kapasitas fingerprinting
- Sinyal ini bukan hanya stabil, tetapi juga berkapasitas tinggi
- Jika situs mengendalikan
N nama basis data, jumlah permutasi yang dapat diamati adalah N!
- Entropi teoretisnya adalah
log2(N!)
- Dengan 16 nama yang dapat dikendalikan, ruang teoretisnya sekitar 44 bit
- Cukup untuk membedakan instance browser yang berjalan bersamaan di lingkungan nyata
- Karena perilaku hash table internal, jumlah permutasi yang benar-benar dapat dicapai mungkin sedikit lebih rendah
- Namun inti keamanannya tidak berubah
- Urutan yang terekspos tetap menyediakan entropi yang cukup untuk berfungsi sebagai pengenal yang kuat
Cara memperbaiki
- Perbaikan yang tepat adalah menghentikan paparan entropi yang berasal dari layout penyimpanan internal
- Mitigasi paling bersih adalah mengembalikan hasil dalam urutan kanonis, seperti pengurutan leksikografis
- Ini mempertahankan kegunaan API bagi pengembang sambil menghilangkan sinyal fingerprinting
- Pendekatan yang mengacak keluaran pada setiap pemanggilan juga dapat menyembunyikan urutan stabil
- Namun pengurutan lebih sederhana, lebih dapat diprediksi, dan lebih mudah dipahami pengembang
- Syarat perbaikan ideal dari sudut pandang rekayasa keamanan
- Kompleksitas konseptual rendah
- Risiko kompatibilitas minimal
- Secara langsung menghilangkan kebocoran privasi
Pengungkapan yang bertanggung jawab
- Pengungkapan yang bertanggung jawab dilakukan kepada Mozilla dan Tor Project
- Mozilla telah merilis perbaikan di Firefox 150 dan ESR 140.10.0
- Patch dilacak di Mozilla Bug 2024220
- Akar perilaku ini ada pada implementasi IndexedDB di Gecko
- Browser turunan berbasis Gecko, termasuk Tor Browser, juga terdampak jika tidak memiliki mitigasi sendiri
Desain yang berpusat pada privasi
- Detail implementasi kecil pun dapat berkembang menjadi masalah privasi yang berarti
- Situs web yang tidak saling terkait dapat menghubungkan aktivitas melampaui origin selama runtime browser yang sama
- Pengenal bertahan lebih lama daripada yang diharapkan pengguna, sehingga melemahkan batas sesi privat
- Sisi positifnya, perbaikannya sederhana dan efektif
- Menormalisasi keluaran sebelum dikembalikan dapat menghilangkan sumber entropi ini
- Batas privasi yang diharapkan dapat dipulihkan
- Ini jenis kerentanan yang mudah terlewat namun berdampak besar, dan layak diperhatikan saat membangun fitur yang sensitif terhadap privasi
1 komentar
Komentar Hacker News
Riset ini terasa sangat mengesankan dan tulisannya juga sangat bagus
Saya malah terkejut karena di bagian akhir tidak muncul iklan produk seperti yang saya kira
Namun, kalau produk perusahaan ini memang melakukan fingerprinting, saya penasaran kenapa mereka melaporkan kerentanan ini ke Mozilla
Meski tidak etis, bukankah secara bisnis lebih menguntungkan jika mereka menyimpannya secara privat untuk membedakan diri dari pesaing
Saya hampir tidak pernah melihat pelaku ancaman membakar zero-day mereka sendiri lewat responsible disclosure
Seperti yang tertulis di artikel, pengenal itu bisa bertahan selama proses Firefox masih hidup, jadi Tor Browser harus benar-benar ditutup sepenuhnya setelah sesi berakhir
Penting juga untuk tidak mencampur penggunaan dengan tujuan berbeda dalam satu sesi
Tautan yang dipasang OP timeout di lingkungan Tor saya, tetapi versi Wayback terbuka tanpa masalah
Dan saya juga penasaran apakah ada peneliti akademik yang membahas topik ini
Saya tahu ada aktivitas dari organisasi seperti EFF, tetapi saya lebih mencari profesor universitas atau lembaga riset murni seperti MSR atau PARC daripada aktivis NGO
Sebagai orang yang sangat peduli privasi, saya merasa dengan holy trinity pribadi berupa noscript, ublock origin, dan firefox containers, keamanan bisa cukup terjaga, tetapi anonimitas terus terasa lolos di sela-sela jari karena fingerprinting
Jika stylometry juga dilihat sebagai fingerprinting dalam arti luas, rasanya makin begitu
Sebagai contoh, mencari konferensi seperti PETS mungkin akan membantu
Saya mempertanyakan fakta bahwa situs web bisa mengakses informasi seperti ini tanpa meminta atau bahkan memberi tahu pengguna
Saya penasaran kenapa browser tidak dibuat seperti ponsel, yang meminta izin akses saat server atau aplikasi ingin mengakses informasi semacam ini
User agent yang memberi tahu versi browser masih cukup masuk akal, dan kemampuan menanyakan font apa yang ada di sistem juga sulit dihilangkan sepenuhnya karena dukungan huruf
Zona waktu, bahasa, layout keyboard, ukuran layar, dan ukuran jendela juga diperlukan agar web berfungsi normal
Wajar juga bahwa pemutar video atau audio perlu tahu format apa yang didukung agar bisa menyajikan media yang sesuai
Selama JavaScript bisa membaca waktu, mudah juga mengetahui selisih jam sistem dengan membandingkannya terhadap waktu server
Jika semua itu ditumpuk satu per satu, pada akhirnya hampir setiap browser bisa diidentifikasi secara unik
Ditambah lagi, perusahaan itu juga membiayai sebagian besar pesaing terbesarnya
Jadi menurut saya kenyataan seperti ini tidak terlalu mengejutkan
Aplikasi bisa mengakses jauh lebih banyak pengenal dan karakteristik perangkat
Bahkan di sistem yang relatif terlindungi tanpa Google Play services pun begitu
Justru di sisi Apple saya merasa sayang karena hampir tidak ada kontrol yang rinci
Karena browser kini sudah punya kompleksitas setara OS, bagian mana pun dari sistem bisa tanpa sengaja terekspos dan disalahgunakan
Istilah process-scoped di tulisan itu agak membingungkan bagi saya
Saya ingat pada 2021 Mozilla menjelaskan bahwa saat mereka memperkenalkan one-process-per-site eksperimental untuk Firefox, mereka membuat batas pada tingkat proses sistem operasi antar semua situs di Firefox desktop
Tulisan terkaitnya adalah Introducing Site Isolation in Firefox
Jadi saya penasaran apakah fitur ini memang belum sepenuhnya diluncurkan, atau sudah diluncurkan tetapi IndexedDB berada di luar isolasi itu
Kalau begitu, penjelasannya terasa cukup menarik
Dari penjelasan ini, terdengar seolah-olah itu tidak bertahan setelah browser di-restart; kalau begitu, bukankah kegunaannya bagi penyerang jadi jauh berkurang
Di Firefox Private Browsing, pengenal itu bisa tetap bertahan bahkan setelah semua jendela privat ditutup, selama proses Firefox masih tetap hidup
Di Tor Browser, saya memahaminya sebagai pengenal stabil yang tetap bertahan bahkan saat memakai New Identity, yang dimaksudkan sebagai reset total dengan menghapus cookie dan riwayat lalu memakai sirkuit Tor baru
Mula-mula situs web melakukan fingerprinting pada browser lalu menyimpan ID dan fingerprint di cookie
Pada sesi berikutnya, browser di-fingerprint lagi dan dibandingkan dengan cookie; jika nilainya berubah, fingerprint lama dan baru dikirim bersama ke server agar bisa dihubungkan
Lembaga negara mungkin sudah mengetahui atau bisa melacak banyak node, dan dengan menghubungkan silang berbagai metadata, menurut saya orang bisa diidentifikasi dengan cukup akurat
Tidak harus selalu 100 persen akurat, dan bahkan cukup mengumpulkan banyak informasi tidak langsung di luar target itu sendiri, seperti informasi area sekitar atau hal-hal yang diperoleh dari balik dinding
Saya merasa ini semacam cara mengidentifikasi dengan informasi proxy
Terus terang, banyak standar Web tampak lebih sering dipakai untuk fingerprinting daripada untuk fungsi nyatanya
IndexedDB pun tampaknya hanya dipakai segelintir situs untuk penyimpanan sungguhan, jadi saya bertanya-tanya siapa yang benar-benar membutuhkannya
Karena itu saya merasa arah memperluas standar web terus-menerus itu sendiri keliru
Browser seharusnya hanya menyediakan API minimum untuk berinteraksi dengan perangkat, dan fitur seperti IndexedDB bisa diimplementasikan sebagai pustaka WebAssembly yang tidak membocorkan data berharga
Sebagai contoh, kalau canvas hanya menyediakan akses ke buffer gambar tanpa rutin menggambar yang memanggil pustaka berbeda di tiap platform, nilainya untuk fingerprinting akan jauh berkurang
Dari kasus yang pernah saya lihat sejauh ini, ada penggunaan seperti di gmail untuk menyimpan cache gambar jangka panjang, atau sebagai cara lain untuk mempertahankan status login selain cookie
Saya agak bingung di bagian ini
Jika UUID IndexedDB dibagikan ke semua origin, bukankah browser bisa diidentifikasi dari isi basis datanya sendiri, bukan dari urutannya
Jika suatu halaman membuat basis data
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,plalu meminta urutannya, berdasarkan pemetaan nama-UUID global ia bisa mendapat hasil sepertig,c,p,a,l,f,n,d,j,b,o,h,e,m,i,kInti kerentanannya adalah bahwa selama proses Firefox masih hidup, situs web mana pun yang membuat kumpulan basis data dengan nama yang sama akan melihat urutan yang persis sama, tanpa memedulikan isinya
Karena itu, ini menjadi pengenal yang stabil dan berentropi tinggi yang bertahan seiring waktu, yaitu sebuah fingerprint
Ini dibagikan lintas origin, dan bahkan setelah data situs dihapus, fingerprint bisa diperoleh lagi lewat urutan itu hanya dengan membuat ulang nama-nama yang sama
Kalau tidak, IndexedDB akan menjadi evercookie yang terlalu mudah
Saya memahaminya bahwa tiap origin hanya bisa melihat subset basis data yang terkait dengan origin tersebut
Saya penasaran apakah Tor Browser sampai sekarang masih mengizinkan JavaScript secara default
Dari pemahaman saya, jika eksekusi JavaScript diblokir, kerentanan ini seharusnya juga tidak berpengaruh
Tidak banyak pengguna yang mematikan JS, jadi Anda langsung masuk ke kelompok yang jauh lebih kecil dan lebih mudah menjadi unik di dalamnya
Memang tanpa JS pilihan untuk mengumpulkan detail jadi lebih sedikit, tetapi justru karena itu pembedaan bisa dilakukan dengan informasi yang lebih sedikit
Selain itu, Tor Browser anehnya sama sekali tidak melakukan spoof pada
navigator.platform, sehingga meskipun User-Agent menyamar sebagai Windows, situs masih bisa melihat apakah Anda sebenarnya pengguna Linux