1 poin oleh GN⁺ 4 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 4 jam lalu
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

    • Saya tidak menggunakan kerentanan di produk kami
    • Menurut saya, sejak awal mereka memang tidak bergantung pada kerentanan itu, dan yang penting adalah bahwa dengan memublikasikannya, pihak lain juga jadi tidak bisa memakainya
  • 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

    • Fingerprint web adalah bidang yang diteliti aktif baik dari sisi serangan maupun pertahanan
      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

    • Fingerprinting browser menurut saya lebih mirip efek samping dari fitur-fitur yang disediakan browser
      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
    • Pihak yang membuat browser paling banyak dipakai adalah perusahaan iklan
      Ditambah lagi, perusahaan itu juga membiayai sebagian besar pesaing terbesarnya
      Jadi menurut saya kenyataan seperti ini tidak terlalu mengejutkan
    • Tetap saja rasanya lebih baik daripada aplikasi
      Aplikasi bisa mengakses jauh lebih banyak pengenal dan karakteristik perangkat
      Bahkan di sistem yang relatif terlindungi tanpa Google Play services pun begitu
    • Itu mengingatkan saya pada ponsel seperti Android
      Justru di sisi Apple saya merasa sayang karena hampir tidak ada kontrol yang rinci
    • Menjaga kegunaan web, mencegah fingerprinting, dan tidak membanjiri pengguna dengan puluhan atau ratusan popup izin menurut saya adalah garis yang sangat tipis
      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

    • Baru setelah membaca komentar ini, saya memahami bahwa maksudnya adalah masih ada beberapa perilaku global yang tersisa, sehingga fingerprinting dimungkinkan lewat celah 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

    • Saya merasa bagian yang dikutip artikel ini menjelaskan risikonya dengan baik
      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
    • Cara yang dipakai dalam situasi seperti ini adalah id bridging
      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
    • Banyak pengguna membiarkan browser tetap menyala berbulan-bulan
    • Saya masih meragukan apakah kegunaannya benar-benar turun drastis
      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

    • Dengan ekstensi browser seperti "Local Storage Editor", Anda bisa langsung melihat isi Local Storage situs
      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

    • Ada contoh yang mudah dipahami di halaman itu
      Jika suatu halaman membuat basis data a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p lalu meminta urutannya, berdasarkan pemetaan nama-UUID global ia bisa mendapat hasil seperti g,c,p,a,l,f,n,d,j,b,o,h,e,m,i,k
      Inti 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
    • Isi datanya tentu dibatasi pada cakupan origin
      Kalau tidak, IndexedDB akan menjadi evercookie yang terlalu mudah
    • Yang dibagikan lintas origin di browser bukan isi basis datanya, melainkan pemetaan UUID
      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

    • Sebenarnya, mematikan JavaScript justru membuat fingerprint menjadi jauh lebih menonjol
      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