Kullanıcının tüm özel Tor kimliklerini birbirine bağlayan kalıcı bir Firefox tanımlayıcısı keşfettik
(fingerprint.com)- Yalnızca
indexedDB.databases()dönüş sırası ile Firefox tabanlı tarayıcılarda süreç ömrü boyunca korunan kalıcı bir tanımlayıcı üretmek mümkün - Bu tanımlayıcı origin kapsamını aşarak paylaşılır; bu yüzden birbiriyle ilgisiz siteler bile aynı tarayıcı çalışma zamanında aynı değeri gözlemleyebilir ve bunu cross-origin izleme için kullanabilir
- Firefox Private Browsing modunda, tüm özel pencereler kapatıldıktan sonra bile süreç yaşamaya devam ediyorsa tanımlayıcı korunur; Tor Browser'da New Identity sonrasında da varlığını sürdürür
- Bunun nedeni, Gecko'nun IndexedDB uygulamasında özel veritabanı adlarını UUID tabanlı dosya adlarına eşlemesi ve sonucu sıralamadan dışarıya açmasıdır
- Mozilla, düzeltmeyi Firefox 150 ve ESR 140.10.0 ile yayımladı; dahili depolama sırasını dışarıya göstermeyen bir tasarım, gizliliğin korunması açısından önemlidir
Güvenlik açığına genel bakış
- Tüm Firefox tabanlı tarayıcılarda,
indexedDB.databases()tarafından döndürülen öğelerin sırası üzerinden süreç ömrü boyunca korunan bir tanımlayıcı çıkarılabiliyor- Bir web sitesi birden fazla IndexedDB veritabanı oluşturup dönüş sırasını kontrol ettiğinde, çalışan tarayıcı süreci için benzersiz ve deterministik bir tanımlayıcı üretebiliyor
- Bu davranış origin düzeyinde değil, süreç düzeyinde ortaya çıkıyor; birbirleriyle ilgisiz siteler de aynı tarayıcı çalışma zamanı içinde aynı tanımlayıcıyı gözlemleyebiliyor
- Firefox Private Browsing modunda, tüm özel pencereler kapatıldıktan sonra bile Firefox süreci çalışmaya devam ediyorsa tanımlayıcı korunuyor
- Tor Browser'da çerezleri ve geçmişi temizleyip yeni bir Tor devresi kullanan New Identity sonrasında da bu kalıcı tanımlayıcı korunuyor
- Bu durum, sonraki tarayıcı etkinliğinin önceki etkinlikle bağlanmaması gerektiği beklentisiyle çelişiyor ve kullanıcıların güvendiği bağlantısızlık garantisini zayıflatıyor
- Mozilla ve Tor Project'e sorumlu bildirim yapıldı
- Mozilla, düzeltmeyi Firefox 150 ve ESR 140.10.0 ile yayımladı
- Yama Mozilla Bug 2024220 altında takip ediliyor; kök neden Gecko'nun IndexedDB uygulamasında olduğundan Tor Browser ve diğer Firefox tabanlı tarayıcılarla da ilgili
- Düzeltme ilkesi basit
- Tarayıcı, süreç kapsamındaki dahili depolama sırasını dışarıya açmamalı
- Sonuçlar normalize edilerek veya sıralanarak döndürülürse entropi kaldırılabilir ve kalıcı tanımlayıcının kötüye kullanımı engellenebilir
Neden önemli
- Özel tarama modu ve gizlilik odaklı tarayıcılar, farklı bağlamlarda kullanıcıyı tanımlamayı zorlaştırma amacı taşır
- Genel beklenti 1: Ortak depolama ya da açık kimlik mekanizmaları yoksa, birbiriyle ilgisiz siteler aynı tarayıcı örneğiyle etkileşime girip girmediğini anlayamamalı
- Genel beklenti 2: Özel oturum bittiğinde, o oturumla ilişkili bilgiler de ortadan kalkmalı
- Bu davranış her iki beklentiyi de bozuyor
- Siteler, çerezler, localStorage veya açık siteler arası kanallar olmadan da yalnızca tarayıcının dahili depolama davranışından tanımlayıcı türetebiliyor
- API'nin döndürdüğü veritabanı adı sırasından yüksek kapasiteli bir tanımlama sinyali elde edilebiliyor
- Geliştirici açısından çıkarılacak dersler var
- Gizlilik açıkları yalnızca tanımlayıcı verilere doğrudan erişimden kaynaklanmaz
- Dahili uygulama ayrıntıları deterministik olarak açığa çıktığında da gizlilik sızıntısı yaşanabilir
- Güvenlik ve ürün perspektifinden kilit nokta
- Görünüşte zararsız bir API bile kalıcı süreç düzeyi durumu sızdırıyorsa siteler arası izleme vektörüne dönüşebilir
IndexedDB ve indexedDB.databases()
- IndexedDB, istemci tarafında yapılandırılmış veri depolamak için kullanılan bir tarayıcı API'sidir
- Web uygulamaları bunu çevrimdışı destek, önbellekleme, oturum durumu ve diğer yerel depolama amaçları için kullanır
- Her origin, bir veya daha fazla adlı veritabanı oluşturabilir; object store ve büyük hacimli veriler depolanabilir
indexedDB.databases(), geçerli origin'in görebildiği veritabanı metadata'sını döndürür- Geliştiriciler bunu mevcut veritabanlarını kontrol etmek, depolama kullanımını debug etmek ve uygulama durumunu yönetmek için kullanabilir
- Normal gizlilik beklentileri altında bu API'nin dönüş sırası başlı başına tanımlayıcı bilgi taşımamalıdır
- Veritabanı metadata'sının nötr ya da normalize edilmiş biçimde sunulması gerekir
- Asıl sorun, Firefox tabanlı tarayıcılarda dönüş sırasının hiç de nötr olmamasıydı
indexedDB.databases() nasıl kalıcı bir tanımlayıcıya dönüştü
- Firefox Private Browsing modunda
indexedDB.databases(), metadata'yı veritabanı oluşturma sırasına göre değil, dahili depolama yapısından türeyen bir sırayla döndürüyor- İlgili uygulama konumu
dom/indexedDB/ActorsParent.cpp
- İlgili uygulama konumu
- Private Browsing modunda veritabanı adları doğrudan disk tanımlayıcısı olarak kullanılmıyor
- Bunun yerine genel hash tablosu
StorageDatabaseNameHashtable = nsTHashMap<nsString, nsString>üzerinden UUID tabanlı dosya adı tabanına eşleniyor - Bu eşleme
OpenDatabaseOp::DoDatabaseWork()içindekiGetDatabaseFilenameBase()içinde yapılıyor
- Bunun yerine genel hash tablosu
aIsPrivatetrue olduğunda, sitenin verdiği veritabanı adı oluşturulan bir UUID ile değiştirilip genelStorageDatabaseNameHashtableiçinde saklanıyor- Anahtar olarak yalnızca veritabanı adı string'i kullanılıyor
- IndexedDB QuotaClient ömrü boyunca korunuyor
- Tüm origin'ler arasında paylaşılıyor
- Yalnızca Firefox tamamen yeniden başlatıldığında sıfırlanıyor
- Daha sonra
indexedDB.databases()çağrıldığında Firefox,GetDatabasesOp::DoDatabaseWork()içindeQuotaClient::GetDatabaseFilenames(...)aracılığıyla veritabanı dosya adlarını topluyor- Veritabanı taban adları bir
nsTHashSetiçine ekleniyor - Yinelemeden önce herhangi bir sıralama yapılmıyor
- Veritabanı taban adları bir
- Nihai sonuç sırası, hash set'in dahili bucket yerleşiminin dolaşılmasına göre belirleniyor
- UUID eşlemesi Firefox sürecinin ömrü boyunca kararlı kaldığı için, dönüş sırası da üretilen UUID değerlerinin, hash fonksiyonu davranışının, hash tablosu kapasitesinin ve ekleme geçmişinin deterministik bir fonksiyonu olarak korunuyor
- Bu sıra sekmeler ve özel pencereler arasında korunuyor ve yalnızca Firefox tamamen yeniden başlatıldığında sıfırlanıyor
- Hem UUID eşlemesi hem de hash set dolaşımı origin düzeyinde değil, süreç düzeyinde
Yeniden üretim yöntemi
- Basit bir PoC ile davranış gösterilebiliyor
- Farklı iki origin aynı script'i barındırıyor
- Her script sabit bir veritabanı adı kümesi oluşturuyor,
indexedDB.databases()çağırıyor, dönüş sırasını çıkarıyor ve ekrana yazdırıyor
- Etkilenen Firefox Private Browsing ve Tor Browser derlemelerinde bu iki origin, aynı tarayıcı sürecinin ömrü boyunca aynı permütasyonu gözlemliyor
- Tarayıcı yeniden başlatıldığında permütasyon değişiyor
- Kavramsal çıktı örneği
- Oluşturma sırası:
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p - Dönüş sırası:
g,c,p,a,l,f,n,d,j,b,o,h,e,m,i,k
- Oluşturma sırası:
- Kritik nokta tam sıranın ne olduğu değil
- Orijinal oluşturma sırasından farklı olması
- Birbiriyle ilgisiz origin'lerde aynı sıranın görünmesi
- Yenilemede, yeni özel pencerede ve tüm özel pencereler kapatıldıktan sonra bile korunması
- Yalnızca tarayıcının tamamen yeniden başlatılmasıyla yeni bir sıranın oluşması
- Böylece gizlilik açısından istenmeyen özellik doğrudan doğrulanabiliyor
Gizlilik etkisi
- Bu açık, tek bir tarayıcı çalışma zamanı içinde hem cross-origin izlemeyi hem de same-origin izlemeyi mümkün kılıyor
-
cross-origin etkisi
- Birbiriyle ilgisiz web siteleri aynı tanımlayıcıyı bağımsız olarak türetip aynı çalışan Firefox veya Tor Browser süreciyle etkileşime girdiklerini çıkarabiliyor
- Çerezler veya başka ortak depolama olmadan da alan adları arasındaki etkinlik bağlanabiliyor
-
same-origin etkisi
- Firefox Private Browsing modunda, Firefox süreci çalışmaya devam ettiği sürece tüm özel pencereler kapatılsa bile tanımlayıcı korunuyor
- Bir site, görünüşte yeni bir özel oturum gibi duran sonraki ziyaretleri yeniden tanıyabiliyor
- Tor Browser'da kalıcı tanımlayıcı, çalışan tarayıcı süreci içinde New Identity yalıtımını fiilen etkisizleştiriyor
- Tamamen ayrık olması gereken oturumlar arasında bağlantı kurulmasına izin veriyor
-
Neden özellikle Tor Browser'da daha ciddi
- Tor Browser, siteler arası bağlanabilirliği azaltmak ve tarayıcı örneği düzeyinde tanımlamayı en aza indirmek üzere tasarlanmıştır
- Süreç ömrü boyunca korunan kalıcı bir tanımlayıcı bu tasarım hedefiyle doğrudan çelişir
- Yalnızca tüm süreç yeniden başlatılana kadar yaşasa bile, yoğun kullanım sırasında bağlantısızlığı zayıflatmak için yeterlidir
Entropi ve fingerprinting kapasitesi
- Bu sinyal yalnızca kalıcı değil, aynı zamanda yüksek kapasiteli
- Bir site
Nadet veritabanı adını kontrol edebiliyorsa gözlemlenebilir permütasyon sayısıN!olur - Teorik entropi
log2(N!)
- Bir site
- Kontrol edilebilen 16 ad varsa teorik alan yaklaşık 44 bit eder
- Gerçek ortamlardaki eşzamanlı tarayıcı örneklerini ayırt etmek için yeterli bir düzeydir
- Dahili hash tablosu davranışı nedeniyle gerçekte erişilebilir permütasyon sayısı biraz daha düşük olabilir
- Ancak güvenlik açısından temel nokta değişmez
- Açığa çıkan sıra, güçlü bir tanımlayıcı olarak çalışacak kadar entropi sağlamaya devam eder
Nasıl düzeltildi
- Doğru düzeltme, dahili depolama yerleşiminden türeyen entropi sızıntısını durdurmaktır
- En temiz azaltım yöntemi, sonuçları sözlük sırası gibi kanonik bir sırada döndürmektir
- Bu, geliştiriciler için API'nin kullanışlılığını korurken fingerprinting sinyalini ortadan kaldırabilir
- Her çağrıda çıktıyı rastgeleleştirmek de kararlı sırayı gizleyebilir
- Ancak sıralama daha basit, daha öngörülebilir ve geliştiricilerin anlaması açısından daha iyi bir seçenektir
- Güvenlik mühendisliği açısından ideal düzeltme koşulları
- Düşük kavramsal karmaşıklık
- Minimum uyumluluk riski
- Gizlilik sızıntısını doğrudan ortadan kaldırma
Sorumlu bildirim
- Mozilla ve Tor Project'e sorumlu bildirim yapıldı
- Mozilla, düzeltmeyi Firefox 150 ve ESR 140.10.0 ile yayımladı
- Yama Mozilla Bug 2024220 altında takip ediliyor
- Davranışın kaynağı Gecko'nun IndexedDB uygulamasıdır
- Tor Browser dahil Gecko tabanlı türev tarayıcılar, kendi azaltım önlemleri yoksa etkilenebilir
Gizlilik odaklı tasarım
- Küçük uygulama ayrıntıları bile anlamlı gizlilik sorunlarına yol açabilir
- Birbiriyle ilgisiz web siteleri aynı tarayıcı çalışma zamanı boyunca origin sınırlarını aşarak etkinliği bağlayabilir
- Tanımlayıcı, kullanıcı beklentisinden daha uzun süre yaşayarak özel oturum sınırlarını zayıflatabilir
- Olumlu tarafı, düzeltmenin basit ve etkili olmasıdır
- Çıktıyı döndürmeden önce normalize etmek bu entropi kaynağını ortadan kaldırabilir
- Beklenen gizlilik sınırları geri yüklenebilir
- Gözden kaçması kolay ama etkisi büyük olan ve gizlilik açısından hassas özellikler geliştirilirken dikkat edilmesi gereken bir açık türü
1 yorum
Hacker News yorumları
Bu araştırmanın gerçekten etkileyici olduğunu ve yazının da çok iyi kaleme alındığını düşündüm
Sonunda bir ürün reklamı çıkacak sandım ama çıkmaması daha da şaşırttı
Yine de bu şirketin ürünü fingerprinting yapıyorsa, bu zafiyeti neden Mozilla’ya bildirdiğini merak ediyorum
Etik dışı olsa bile, rakiplerden ayrışmak istiyorlarsa bunu gizli tutmak ticari açıdan daha mantıklı olmaz mıydı diye düşünüyorum
Tehdit aktörlerinin sorumlu açıklama uğruna kendi zero-day’lerini yaktığını pek görmedim
Yazıda dendiği gibi tanımlayıcı, Firefox süreci çalıştığı sürece kalabiliyorsa, Tor Browser oturum bitince mutlaka tamamen kapatılmalı
Tek bir oturum içinde farklı kullanım amaçlarını karıştırmamak da önemli
OP’nin verdiği bağlantı benim Tor ortamımda zaman aşımına uğradı ama Wayback sürümü sorunsuz açıldı
Ayrıca bu konuyu çalışan akademik araştırmacılar olup olmadığını merak ediyorum
EFF gibi kuruluşların çalışmalarını biliyorum ama ben daha çok STK aktivistlerinden ziyade üniversite hocaları ya da MSR, PARC gibi saf araştırma laboratuvarlarını arıyorum
Gizliliğe çok önem veren biri olarak noscript, ublock origin ve firefox containers şeklindeki kişisel holy trinity ile güvenliği epey toparlayabiliyorum ama anonimlik fingerprinting yüzünden sürekli parmaklarımın arasından kayıp gidiyor gibi geliyor
Buna stylometry’yi de geniş anlamda fingerprinting sayarsak durum daha da öyle
Örnek olarak PETS gibi konferanslara bakmak faydalı olabilir
Benim asıl garip bulduğum, web sitelerinin kullanıcıya sormadan ya da haber vermeden bu tür bilgilere erişebilmesi
Neden tarayıcılar, telefonlardaki gibi, sunucu ya da uygulama böyle bilgilere erişirken izin onayı istemiyor diye merak ediyorum
Tarayıcı sürümünü söyleyen user agent da bir yere kadar makul; sistemde hangi fontların olduğunu sormak da yazı tipi desteği açısından tamamen kaldırılamıyor
Saat dilimi, dil, klavye düzeni, ekran boyutu ve pencere boyutu da normal web işleyişi için gerekli
Video ya da ses oynatıcının hangi formatları desteklediğini bilmek, uygun medyayı sunmak için doğal olarak gerekiyor
JavaScript zamanı okuyabildiği sürece, bunu sunucu saatiyle karşılaştırıp sistem saatindeki sapmayı bulmak da kolay
Bunlar tek tek birikince neredeyse her tarayıcı sonunda benzersiz şekilde ayırt edilebilir hâle geliyor
Üstelik o şirket, en büyük rakibinin finansmanının da önemli bir kısmını sağlıyor
O yüzden bu durum bana şaşırtıcı gelmiyor
Uygulamalar tanımlayıcılara ve cihaz özelliklerine çok daha fazla erişebiliyor
Google Play services olmayan, görece daha iyi korunmuş sistemlerde bile durum böyle
Hatta Apple tarafında neredeyse hiç ince ayarlı kontrol olmaması daha da can sıkıcı
Tarayıcılar artık işletim sistemi kadar karmaşık olduğundan, sistemin herhangi bir parçası istemeden açığa çıkıp kötüye kullanılabilir
Yazıdaki process-scoped ifadesi bana biraz kafa karıştırıcı geldi
Mozilla’nın 2021’de Firefox için deneysel one-process-per-site özelliğini tanıtırken, masaüstü Firefox’ta tüm siteler arasında işletim sistemi süreci düzeyinde sınırlar oluşturduğunu anlattığını hatırlıyorum
İlgili yazı: Introducing Site Isolation in Firefox
Bu yüzden bu özelliğin hâlâ tam olarak dağıtılmadığını mı, yoksa dağıtılıp IndexedDB’nin bu izolasyonun dışında mı kaldığını merak ediyorum
Öyleyse bu epey ilginç bir açıklama gibi geliyor
Bu anlatıma göre tarayıcı yeniden başlatılınca kalıcı olmuyor gibi duruyor; öyleyse saldırgan açısından faydası epey azalmaz mı diye düşünüyorum
Firefox Private Browsing’de tüm özel pencereler kapatılsa bile, Firefox süreci yaşamaya devam ederse tanımlayıcı kalabiliyor
Tor Browser’da ise çerezleri ve geçmişi temizleyip yeni Tor devresi kullanan tam sıfırlama amaçlı New Identity kullanılsa bile kararlı tanımlayıcının korunduğunu anlıyorum
Önce web sitesi tarayıcıyı fingerprint ediyor ve çereze bir ID ile fingerprint’i kaydediyor
Sonraki oturumda yeniden fingerprint yapıp bunu çerezle karşılaştırıyor; değer değişmişse eski fingerprint ile yenisini sunucuya birlikte bildirip birbirine bağlıyor
Devlet kurumlarının zaten birçok düğümü biliyor ya da izleyebiliyor olması muhtemel; ayrıca çeşitli meta verileri çapraz bağlayarak insanları epey isabetli biçimde tanımlayabileceklerini düşünüyorum
Bunun her zaman yüzde 100 doğru olması da gerekmiyor; yakın çevre bilgisi ya da duvarın ötesinden gelen veriler gibi hedefin kendisi dışındaki dolaylı bilgilerden çokça toplamak da yeterli olabilir
Bunu, bir tür vekil bilgi üzerinden kimlik tespiti yapmak gibi görüyorum
Açıkçası birçok Web Standardı, gerçek işlevden çok fingerprinting için kullanılıyor gibi görünüyor
IndexedDB’yi de gerçek depolama amacıyla kullanan site sayısı az gibi; kim gerçekten buna mecbur ki diye düşünüyorum
Bu yüzden web standartlarını durmadan genişletme yönünün baştan hatalı olduğunu düşünüyorum
Tarayıcı, cihazla etkileşim için yalnızca asgari API’leri sunmalı; IndexedDB gibi şeyler de değerli verileri sızdırmayacak WebAssembly kütüphaneleriyle uygulanabilir
Örneğin canvas, platforma özgü kütüphaneleri çağıran çizim rutinleri yerine yalnızca resim tamponuna erişim verseydi fingerprinting değeri çok daha düşük olurdu diye düşünüyorum
Benim şimdiye kadar gördüğüm örneklerde bunun gmail gibi yerlerde uzun ömürlü görselleri önbelleğe almak ya da çerez yerine oturum durumunu korumanın başka bir yolu olarak kullanıldığı oldu
Burada biraz kafam karıştı
IndexedDB’nin UUID’si tüm origin’ler arasında paylaşılıyorsa, o zaman sıralama yerine veritabanı içeriğinin kendisiyle tarayıcıyı tanımlamak gerekmez miydi diye düşündüm
Bir sayfa
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,padlı veritabanlarını oluşturup sıralarını sorguladığında, genel ad-UUID eşlemesine göre örneğing,c,p,a,l,f,n,d,j,b,o,h,e,m,i,kgibi bir sonuç alabiliyorTemel zafiyet, Firefox süreci yaşadığı sürece hangi web sitesi aynı ad kümesine sahip veritabanlarını oluşturursa oluştursun, içerikten bağımsız olarak tam olarak aynı sıralamayı görmesidir
Bu yüzden bu, zaman boyunca sabit kalan, yüksek entropili bir tanımlayıcı yani bir fingerprint oluyor
Origin’ler arasında paylaşılıyor ve site verileri silindikten sonra bile aynı adlarla yeniden oluşturulunca sıralama üzerinden fingerprint tekrar elde edilebiliyor
Aksi hâlde IndexedDB çok kolay bir evercookie olurdu
Her origin’e yalnızca o origin’le ilişkili veritabanı alt kümesinin gösterildiğini anlıyorum
Tor Browser’ın hâlâ varsayılan olarak JavaScript’e izin verip vermediğini merak ettim
Benim anladığım kadarıyla JavaScript çalıştırmayı engellemek bu zafiyetten de etkilenmemek anlamına gelir gibi
JS’yi kapatan kullanıcı çok az olduğu için hemen çok daha küçük bir gruba düşüyorsunuz ve o grubun içinde benzersiz olmanız kolaylaşıyor
Elbette JS olmayınca ayrıntılı bilgi toplama seçenekleri azalıyor ama aynı nedenle daha az bilgiyle de ayırt edilmeniz kolaylaşıyor
Ayrıca Tor Browser garip biçimde
navigator.platformdeğerini hiç spoof etmiyor; bu yüzden User-Agent Windows gibi görünse bile site hâlâ Linux kullanıp kullanmadığınızı görebiliyor