Safari 17’nin Gelişmiş Ses Parmak İzi Korumasını Aşmak
(fingerprint.com)- Safari 17, gizli modda Audio API örneği başına rastgele gürültü ekleyerek ses parmak izini oynatıyor; FingerprintJS ise bunu azaltan yeni bir parmak izi algoritmasıyla karşılık verdi
- Mevcut yöntem, 500 ses örneğinin toplamını tanımlayıcı olarak kullandığı için Safari’nin gürültü aralığı tarayıcılar arasındaki farktan daha büyük hâle geliyor ve kararlılığını kaybediyor
- Yeni yöntem, aynı ses örneğinin gürültülü kopyalarını büyük miktarda oluşturuyor ve
(min+max)/2ile anlamlı basamak yuvarlaması kullanarak değerdeki dalgalanmayı azaltıyor - square
OscillatorNode,DynamicsCompressorNodeveBiquadFilterNodebağlanarak tarayıcılar arası fark büyütüldü; seçilen tarayıcıların 3396. örneğindeki minimum fark0.0014%seviyesine çıkarıldı - Yeni algoritma, FingerprintJS 4.2.0 sürümünden itibaren eski ses parmak izinin yerini aldı; hesaplama süresi 1,5~2 kat artsa da düşük donanımlı cihazlarda bile kısa sürede tamamlanıyor
Safari 17’nin ses parmak izini oynatma biçimi
- Ses parmak izi çıkarma, tarayıcının Audio API ve OfflineAudioContext ile ses sinyalini render ettikten sonra örnekleri toplayıp tek bir tanımlayıcı sayıya dönüştürme yöntemidir
- Bu tanımlayıcı, çerezler silinse veya gizli moda geçilse bile değişmeyen bir kararlılığa sahiptir; ancak çok sayıda kullanıcı aynı değeri paylaşabildiği için benzersizliği yüksek değildir
- Safari 17’nin gelişmiş parmak izi koruması varsayılan olarak gizli modda açık, normal modda kapalıdır ve hem masaüstü hem mobilde uygulanır
- Koruma özelliği Screen API ve Canvas API’yi de etkiler; ancak burada yalnızca Audio API ele alınır
- Koruma özelliği açıldığında Safari, her ses örneğini ayrı bir rastgele gürültüyle çarpar
- Gürültü uygulanmış örnek
sample*(1-magnitude)ilesample*(1+magnitude)arasındadır - Dağılım uniform dağılımdır
- Safari geliştirmesi devam ettiğinden uygulama ayrıntıları zamanla değişebilir
- Gürültü uygulanmış örnek
Gürültünün uygulandığı Audio API noktaları
- Safari, ses sinyalinin okunabildiği çeşitli arayüzlerde gürültü uygular
- AudioWorkletNode: magnitude
0.001 - AudioBuffer::getChannelData: magnitude
0.001 - AudioBuffer::copyFromChannel: magnitude
0.001 - RealtimeAnalyser::getFloatFrequencyData: magnitude
0.25
- AudioWorkletNode: magnitude
- Gürültü her uygulandığında değiştiği için Safari 17 gizli modunda ses parmak izi her hesaplamada değişir
- M1 MacBook Air’de Safari 17 ile parmak izi
124.03516~124.04545arasında dalgalanır; fark yaklaşık0.008%’dir - Tarayıcılara göre mevcut ses parmak izi farkları arasındaki en küçük değer
0.0000023%olup Safari’nin gürültü aralığından çok daha küçüktür - Gürültüyü ortadan kaldırmak için ondalıkta bir basamak düzeyinde yuvarlama gerekir; ancak 6 basamaktan az bırakıldığında bazı tarayıcıları ayırt etmek zorlaşır ve benzersizlik düşer
Yeni algoritmanın 3 aşaması
- FingerprintJS’in yeni ses parmak izi algoritması, Safari’nin eklediği gürültüyü azaltmak için üç aşamadan geçer
- Gürültünün varyansını azaltır
- Tarayıcı tanımlayıcı sayıları arasındaki mesafeyi artırır
- Kalan gürültüyü yuvarlamayla kaldırır
- Mevcut ses parmak izi 500 ses örneğinin toplamı olduğundan, her örneğe uniform dağılımlı gürültü eklendiğinde toplam parmak izi gürültüsü normal dağılıma yaklaşır
- Normal dağılımın ortalamasını çok sayıda örneğin ortalamasıyla tahmin etmek gerekir; uniform dağılımın ortalaması ise
minvemaxkullanılarak(min+max)/2ile daha az örnekten hassas biçimde tahmin edilebilir - Deney kodunda aynı hassasiyet koşulunda normal dağılım için
524,288örnek gerekirken, uniform dağılım için4,096örnek yeterli oldu - Yeni yöntem, toplam parmak izi yerine yalnızca tek bir ses örneği toplayacak şekilde değiştirilerek uniform dağılımlı gürültüyü ele alıyor
- Bu değişiklik nedeniyle yeni parmak izi eski parmak iziyle uyumlu değildir; ziyaretçi tanımlayıcılarını kaybetmeden geçiş yapmak için ayrı bir yaklaşım gerekir
Aynı ses örneğinin gürültülü kopyalarını oluşturmak
- Bir
AudioBufferinstance’ındagetChannelData’yı birden çok kez çağırma yöntemi çalışmaz- Gürültü her
AudioBufferinstance’ı için bir kez uygulanır - Aynı instance’ın
getChannelDataçağrısı aynı sinyali döndürür
- Gürültü her
- Tüm ses sinyali oluşturma süreci birden çok kez çalıştırılırsa çok sayıda
AudioBufferinstance’ı oluşturulabilir; ancak parmak izi hesaplaması için bu çok yavaştır- 6.000 gürültülü örnek için M1 MacBook’taki en hızlı süre 7 saniyeydi
- 60.000 örnekte Safari işi tamamlayamadı
- Daha iyi yöntem, aynı ses sinyalini tekrarlayan bir
AudioBufferinstance’ı oluşturmaktır- İlk ses sinyalini render edin, ancak
getChannelDataçağırmayın - Daha uzun ikinci bir OfflineAudioContext oluşturun ve kaynak sinyali AudioBufferSourceNode olarak kullanın
loop,loopStart,loopEndile kaynak sinyalin bir bölümünü tekrarlayın- Tekrardan sonra Safari gürültü eklediği için aynı ses örneğine farklı gürültü uygulanmış kopyalar elde edilir
- İlk ses sinyalini render edin, ancak
- Bu yöntem, yalnızca 2 ses render işlemiyle gerekli sayıda gürültülü kopya oluşturabilir
- Gürültü tamamen yok olmaz, ancak varyansı kaynak ses örneğine göre küçülür
8,192kopya: 100 çalıştırma sonucunda aralık0.000387%, M1 MacBook’ta2.6ms65,536kopya:0.0000123%,4.1ms262,144kopya:0%,7.5ms
Tarayıcılar arasındaki ses örneği farkını büyütmek
- Kopya sayısını azaltmak performansı iyileştirir; ancak sonuç varyansı büyüdüğü için tarayıcılar arasındaki ses örneği farkını artırmak amacıyla temel sinyal değiştirildi
- Birden çok yerleşik ses düğümüyle yapılan denemeler sonucunda, tarayıcılar arası örnek farkını büyüten sinyal üretim zinciri şöyle oldu
- square OscillatorNode
- DynamicsCompressorNode
allpasstipinde BiquadFilterNode
- Ses sinyalinin 3396. örneği tarayıcılar arasında en büyük farkı gösterdi; bu değer, çeşitli tarayıcılardaki tüm örnekler karşılaştırılarak bulundu
- Seçilen tarayıcı örnekleminde bu yeni örneğin en küçük farkı
0.0014%oldu- Mevcut parmak izinin en küçük farkı olan
0.0000023%’ten daha büyük - Bu sayede daha kaba gürültü giderme ve yuvarlama uygulanabiliyor
- Mevcut parmak izinin en küçük farkı olan
Yuvarlamayla parmak izini kararlı hâle getirmek
- Tek örneğin gürültü aralığı küçülse bile değer hâlâ dalgalandığından, son parmak izi olarak kullanılabilmesi için yuvarlama gerekir
- Gürültü mutlak değere değil, ses örneği değerine göre göreli uygulandığı için yuvarlama ondalık basamak sayısına değil anlamlı basamaklara göre yapılır
- Seçilen tarayıcıları ayırt etmek için 5 anlamlı basamak yeterliydi; ancak tüm tarayıcılar ve gelecekteki değişimler doğrulanamadığından daha fazla basamak kullanıldı
- Safari 17 gizli modunda yuvarlama hassasiyetine göre kararlılık için gereken kopya sayıları şöyledir
- 6 anlamlı basamak:
15,000kopya, Safari 17 on M1 MacBook warm bazında3ms - 7 anlamlı basamak, ancak son basamak 5’in katına yuvarlanır:
30,000kopya,4ms - 7 anlamlı basamak, ancak son basamak en yakın çift sayıya yuvarlanır:
70,000kopya,6ms - 7 veya daha fazla anlamlı basamak:
400,000kopya,12ms
- 6 anlamlı basamak:
- Son seçim 7 anlamlı basamak, ancak son basamağı
0veya5yapacak yöntem oldu; kararlılığı artırmak için kopya sayısı40,000’e çıkarıldı - Bu şekilde yuvarlanan sayı, Safari 17 gelişmiş parmak izi koruması açık olsa bile değişmeyen yeni ses parmak izi hâline gelir
- Yeni parmak izinin mevcut ses parmak iziyle aynı benzersizliğe sahip olduğu değerlendirildi
Performans ve çalıştırma kısıtları
- Boş sayfada warm tarayıcı bazında yeni algoritma genel olarak eskisinden daha yavaştır
- MacBook Air 2020 Safari 17.3: eski
2ms, yeni yöntem4ms - MacBook Air 2020 Chrome 120: eski
5ms, yeni yöntem8ms - iPhone 13 mini Safari 17.3: eski
8ms, yeni yöntem12ms - Galaxy J7 Prime Chrome 120: eski
33ms, yeni yöntem45ms - BrowserStack Windows 11 Firefox 121: eski
10ms, yeni yöntem18ms
- MacBook Air 2020 Safari 17.3: eski
- Yeni algoritmanın performansı eskiye göre 1,5~2 kat kötüleşiyor; ancak düşük donanımlı cihazlarda bile hesaplama süresi kısa
- Tarayıcı bazı işleri
OfflineAudioRenderthread’ine devrettiği için, ses parmak izi hesaplamasının büyük bölümünde sayfa yanıt vermeyi sürdürür - Web Audio API web workers içinde kullanılamadığından ses parmak izi worker’da hesaplanamaz
- Performansı iyileştirmek için kullanıcı aracısı dizesiyle Safari 17 veya üzeri olup olmadığı kontrol edilip yeni algoritma yalnızca Safari 17 ve üzeri için kullanılabilir; diğer tarayıcılarda mevcut algoritma korunabilir
Tor ve Brave’in farkı
- Tor, Web Audio API’yi tamamen devre dışı bıraktığı için ses parmak izi çıkarma mümkün değildir
- Brave, Safari 17 gibi ses sinyaline gürültü ekler; ancak yöntemi farklıdır
- Safari her ses örneğini ayrı bir rastgele değerle çarpar
- Brave,
fudge factoradlı rastgele bir çarpanı bir kez oluşturur ve tüm ses örneklerini aynı değerle çarpar- Bu değer sayfa içinde korunur
- Yalnızca yeni normal oturumda veya gizli oturumda değişir
- Brave’de ne kadar çok ses örneği kopyası oluşturulursa oluşturulsun, tüm kopyalara aynı gürültü uygulandığı için Safari’ye yönelik matematiksel gürültü giderme yöntemi çalışmaz
- Bununla birlikte önceki Brave gürültü giderme yöntemi çalışmaya devam eder; tarayıcılar arası parmak izi farkını büyüten yeni sinyal oluşturma yöntemi ise hata toleransını artırabilir
FingerprintJS uygulaması
- Yeni ses parmak izi algoritması FingerprintJS’te eski yöntemin yerini aldı ve ilk kez 4.2.0 sürümünde yayımlandı
- Tam uygulama kodu FingerprintJS’in GitHub deposunda bulunuyor
- Ses parmak izi, açık kaynak kütüphanenin tarayıcı parmak izi oluştururken kullandığı çeşitli sinyallerden biridir
- FingerprintJS, tarayıcıdan elde edilebilen tüm sinyalleri koşulsuz dahil etmez; her sinyalin kararlılığını ve benzersizliğini ayrı ayrı analiz ederek parmak izi doğruluğuna etkisini değerlendirir
- Ses parmak izi benzersizliğe yalnızca az katkı sağlasa da kararlılığı yüksek olduğu için genel parmak izi doğruluğunu biraz artıran bir sinyal olarak değerlendiriliyor
1 yorum
Hacker News görüşleri
Kullanıcıları internette tanımlamak için bir başka ilginç teknik de GPU parmak izi çıkarma; bu yöntem 2022'de "DrawnApart" kod adıyla tanıtılmıştı
WebGL ile GPU yürütme birimlerinin sayısı ve hızı sayılıyor, tepe noktası işleme tamamlanma süresi ve stall fonksiyonu işleme gibi değerler ölçülüyor
Bugünlerde özellikle yan kanal saldırıları konusundaki ilgiye bakınca, verinin sızdığı değere tekdüze gürültü ekleme yaklaşımının neredeyse kesin olarak işe yaramayacağı görülüyor
Çünkü daha fazla örnek toplanarak gürültü temizlenebilir. Safari'nin bunu neden eklediğini bilmiyorum. Parmak izi çıkarmayı daha uğraştırıcı hale getirebilir ama bu yazıda olduğu gibi sonuçta genelde bir şekilde aşılabilir görünüyor
Teknik olarak etkili olmalarından çok, halka kulağa hoş gelen bir hikâye anlatabilmek daha önemli hale gelmiş; bir tür gizlilik tiyatrosu gibi hissettiriyor
En başta sonucun neden değiştiğini biri açıklayabilir mi? Örneğin ses parmak izi çıkarmanın neden mümkün olduğunu merak ediyorum
Web Audio API ile küçük bir sinyal üretirseniz tüm tarayıcılar neredeyse aynı sonucu verir, ancak çok küçük farklar kullanılarak bunlar birbirinden ayırt edilebilir
Tarayıcı geliştiricilerinin bunu önlemek için ses arabelleği işlemeye gürültü eklemek zorunda kalması üzücü
Özetle, aynı kod tabanı içinde bile farklı kod yolları, örneğin SIMD varyantları, hafifçe farklı kayan nokta sonuçları üretebilir. Bu da kayan nokta işlemlerinin işlem sırası gibi etkenlere beklenenden daha duyarlı olmasıyla ilgili görünüyor
Aynı algoritma ve aynı formül doğru biçimde uygulanmış olsa bile sonuçlar biraz farklı çıkabilir
Yanlışsam düzeltin. Burada parmak izi çıkarma korumasının aşılabilmesinin nedeni, Web Audio API spesifikasyonunun OscillatorNode'un anti-aliasing işlemini bu kadar açık bırakmış olması gibi görünüyor
"Bu aliasing'i önlemek için uygulamaların benimseyebileceği çeşitli pratik yaklaşımlar vardır. Yaklaşım ne olursa olsun, ideal ayrık zamanlı dijital ses sinyali matematiksel olarak iyi tanımlanmıştır. Uygulamanın ödünleşimi, CPU kullanımı açısından uygulama maliyeti ile bu ideale ne kadar sadık kalındığı arasındadır. Uygulamaların bu ideale ulaşmak için belli bir özen göstermesi beklenir, ancak düşük özellikli donanımlarda daha düşük kaliteli ve daha düşük maliyetli yaklaşımların değerlendirilmesi makuldür."
Bana göre bu, burada kötüye kullanılan OscillatorNode çıktısının tarayıcılar arasında, hatta aynı tarayıcıda farklı donanımlar üzerinde bile neredeyse kesin olarak deterministik olmadığı anlamına geliyor. Deterministik olmama durumu, tarayıcının seçtiği anti-aliasing yöntemine veya donanıma göre aynı tarayıcı içinde seçilen farklı yollara dayanıyor. Buna aynı anti-aliasing algoritmasındaki değişiklikler ya da düzeltmeler de dahil
Anti-aliasing'in neden tarayıcıya bırakıldığını tam anlayamıyorum. Yüksek kaliteli ses uygulamaları veya kütüphaneleri, ürettikleri sinyalde aliasing'den kaçınma yöntemini tamamen kontrol etmek ister ve varsayılan osilatörü kullanmazdı. Öte yandan, rastgele bir anti-aliasing algoritmasını ve buna bağlı tarayıcı farklılıklarını kabullenecek bir web uygulamasıysa, algoritmanın sabit kodlanmış SIMD komutları mı yoksa 20 MB'lık bir JavaScript Web Audio yardımcı çerçevesi mi olduğuna muhtemelen çok aldırmaz
1: https://webaudio.github.io/web-audio-api/#OscillatorNode
HTML5 ayrıştırıcısını standartlaştırırken Hixie'nin kullandığı türden bir çözümün burada uygulanıp uygulanamayacağını da merak ediyorum. Belirli alan uzmanlarının yeterince iyi çalışan, tam ve deterministik bir anti-aliasing algoritması tanımlaması ve sonrasında tüm tarayıcıların bunu kullanması gibi. Ölçülebilir performans kaybı ancak varsayılan anti-aliasing osilatörüyle sinyal üretmeyi gösteren Web Audio API eğitimlerinde fark edilir gibi duruyor
Bu yüzden uygulamanın, mevcut işlem kaynaklarına, bataryaya vb. göre ne kadar harcama yapacağına karar verebilmesini istemeleri normal
Tarayıcıya düğüm grafiği ses API'si koymak aptalcaydı. Sadece AudioWorklet olmalıydı
https://web.archive.org/web/20120505042746/https://developer...
İğrenç.
En başta ses API’sinin neden web sitesi izni olmadan kullanılabildiğini anlamıyorum. "Bu site ses aygıtını kullanmak istiyor" gibi basit bir iletişim kutusuyla kolayca düzeltilebilecek gibi görünüyor.
İnternetin bugünkü hali, kişisel bilişim hayalinin büyük kısmını mahvetti. Çünkü şirketler ve devletler bireylere kıyasla fazlasıyla asimetrik biçimde güçlü. Teknolojimin, açık onayım olmadan bir sunucuya veri gönderebilmesi gerçekten mümkün olmalı mı?
Öte yandan tarayıcı önbelleğini temizleyip VPN’i açınca beni yeni ziyaretçi sanarak yanlış tanımladı. Yine de iş modeli alçakça.
En iyimser yorumla bile, bu tür araştırmaları yayımlayıp görünür kılmanın büyük değeri var. Belirli markaya ait yeşil bir sırt çantasının hırsızlığa yardımcı olduğunu anlatan bir yazı çıkınca herkesin daha çok çalacağından endişe etmektense, mağazaların bu yöntemi daha iyi fark etmeyi öğreneceği ihtimaline daha çok ağırlık veririm.
Her örneğe rastgele değer eklemek yerine, Safari saat başı değişen bir anahtara dayalı deterministik gürültü de ekleyebilir gibi görünüyor.
Bunu ses örneği ile anahtarın bir fonksiyonu olarak üretirse, aynı oturumda gürültü aynı kalır ama bir saat sonra takip için işe yaramaz.
Bunu düzeltmek için bilgi sızıntısının kendisini ortadan kaldırmak gerekir; sadece rastgele sapma katmanıyla üstünü örtmek yetmez.
Mesela
RNG_SEED = HMAC_SHA256(PERSISTENT_SECRET,Location.origin)gibi bir yöntem.Artık gerçekten JavaScript’i kapatıp web’e bakan "o kişi" olmaya hazırım.
Başka yerlerden birkaç bit daha toplanırsa benzersiz şekilde tanımlanabilirsiniz. Yine de bana kalırsa bu insanlar reklam teknolojisi sektörünün geri kalanıyla birlikte Golgafrinchan Ark B’ye bindirilip gönderilebilir.
Yakın zamanda ziyaret ettiğim bir site işaretleme kullanıyordu ama bunu HTML’ye derleyip statik olarak sunmak yerine istemci tarafı JavaScript ile render ediyordu. WTF.
Sadece Cloudflare gibi DDoS kontrolleri değil, artık sayfa HTML’sinin içinde olması gereken şeyler bile JavaScript ile yükleniyor.
İnternet giderek daha düşmanca hale geldikçe, bu tercih de giderek daha doğru görünüyor.
Bu yöntemin birkaç binden fazla benzersiz kombinasyon üretebilmesini pek anlayamıyorum.
Tarayıcı türü × tarayıcı sürümü × işletim sistemi sürümü × hızlandırıcı sürümü × … başka ne var? Uzaktan bakınca benzersiz sayılacak kadar varyasyon varmış gibi gelmiyor.
Bu teknik, ses işlemede donanım, sürücü ve işletim sistemi farklarına göre mi parmak izi çıkarıyor, yoksa sadece tarayıcı yazılımına mı bakıyor?
Alttaki grafik aygıtındaki farkları ortaya çıkaran benzer teknikler vardı ya da hâlâ vardır diye düşünüyorum.
Yazıda verilen örneklerden biri hızlı Fourier dönüşümüydü (FFT). Her işletim sisteminde bu işlevin bir sürümü vardır ama zamanla optimize edilme eğilimindedir ve kullanılabilen SIMD komutlarına bağlı olarak çoğu zaman CPU’ya göre farklı davranır.