1 puan yazan GN⁺ 2024-03-11 | 1 yorum | WhatsApp'ta paylaş
  • 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)/2 ile anlamlı basamak yuvarlaması kullanarak değerdeki dalgalanmayı azaltıyor
  • square OscillatorNode, DynamicsCompressorNode ve BiquadFilterNode bağlanarak tarayıcılar arası fark büyütüldü; seçilen tarayıcıların 3396. örneğindeki minimum fark 0.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) ile sample*(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ünün uygulandığı Audio API noktaları

  • Safari, ses sinyalinin okunabildiği çeşitli arayüzlerde gürültü uygular
  • 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.04545 arasında dalgalanır; fark yaklaşık 0.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 min ve max kullanılarak (min+max)/2 ile 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çin 4,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 AudioBuffer instance’ında getChannelData’yı birden çok kez çağırma yöntemi çalışmaz
    • Gürültü her AudioBuffer instance’ı için bir kez uygulanır
    • Aynı instance’ın getChannelData çağrısı aynı sinyali döndürür
  • Tüm ses sinyali oluşturma süreci birden çok kez çalıştırılırsa çok sayıda AudioBuffer instance’ı 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 AudioBuffer instance’ı 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, loopEnd ile 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
  • 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,192 kopya: 100 çalıştırma sonucunda aralık 0.000387%, M1 MacBook’ta 2.6ms
    • 65,536 kopya: 0.0000123%, 4.1ms
    • 262,144 kopya: 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
  • 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

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,000 kopya, Safari 17 on M1 MacBook warm bazında 3ms
    • 7 anlamlı basamak, ancak son basamak 5’in katına yuvarlanır: 30,000 kopya, 4ms
    • 7 anlamlı basamak, ancak son basamak en yakın çift sayıya yuvarlanır: 70,000 kopya, 6ms
    • 7 veya daha fazla anlamlı basamak: 400,000 kopya, 12ms
  • Son seçim 7 anlamlı basamak, ancak son basamağı 0 veya 5 yapacak 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öntem 4ms
    • MacBook Air 2020 Chrome 120: eski 5ms, yeni yöntem 8ms
    • iPhone 13 mini Safari 17.3: eski 8ms, yeni yöntem 12ms
    • Galaxy J7 Prime Chrome 120: eski 33ms, yeni yöntem 45ms
    • BrowserStack Windows 11 Firefox 121: eski 10ms, yeni yöntem 18ms
  • 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 OfflineAudioRender thread’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 factor adlı 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

 
GN⁺ 2024-03-11
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

    1. https://www.bleepingcomputer.com/news/security/researchers-u...
    • Tarayıcı varsayılan olarak yazılım oluşturucu kullanmalı ve donanımsal GPU render yolunu açarken site, mikrofon veya kamerada olduğu gibi kullanıcıdan izin istemeli
  • 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

    • Apple'ın son dönemdeki gizlilik özelliklerinin önemli bir kısmı bana daha çok pazarlama gibi geliyor
      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

    • Ana fikir şu gibi görünüyor: Web Audio API içinde çok sayıda matematik işlemi yapan algoritmalar var, bunların uygulaması tarayıcıya göre biraz değişiyor ve tam sonuçlar işletim sistemi ile CPU'ya da bağlı oluyor
      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
    • Bunu, WebGL'de kullanılan benzer tekniklerde PC'nin ekran kartı sürücüsü ve donanımın kendisinden çok fazla entropi çıkmasına benzetiyorum
      Tarayıcı geliştiricilerinin bunu önlemek için ses arabelleği işlemeye gürültü eklemek zorunda kalması üzücü
    • Benim de ilk düşüncem buydu ve burada daha ayrıntılı anlatılıyor: https://fingerprint.com/blog/audio-fingerprinting/#why-the-a...
      Ö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
    • Büyük olasılıkla uygulama ayrıntıları ve derleyici optimizasyonları yüzünden. Örneğin kayan nokta toplama işleminde değişme özelliği geçerli değildir
      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

    • Yüksek kaliteli anti-aliasing maliyetlidir
      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ı

  • İğrenç.

    • Ben de aynen böyle düşünüyorum. İlginç ama iğ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.
    • İnsana mevcut ağ yığınını önümüzdeki 100 yıl boyunca kullanmamız gerekip gerekmediğini sorduruyor.
      İ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ı?
    • Evet. Bu insanların bununla gurur duymasına inanamıyorum.
      Ö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.
    • fingerprint.com olduğu için bunun bir ölçüde ironik olduğunu düşündüm. Bir vergi açığını kitlelere anlatan bir web sitesinin ortaya çıkıp dünyanın da buna tiksinerek o açığı kapatmasına benziyor.
      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.

    • Böyle 10 örneğin ortalamasını alırsanız, sonunda aygıtın gerçek değerine yaklaşılır. Örnek sayısı arttıkça daha da yaklaşılır.
      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.
    • Eklenen gürültü origin (kaynak) temelinde deterministik olsa yardımcı olmaz mı? O zaman aşırı örneklemeyle ortalama alınsa bile ortadan kaldırılamaz.
      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.

    • Sorun şu ki sadece böyle "o kişi" olmak bile kimliğinize 10 bitten fazla bilgi sızdırabilir.
      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.
    • Bol şans. Bugünün web’inde düzgün eski usul HTML’nin ne kadar az olduğuna şaşırırsınız.
      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.
    • Bize katıl, gerçekten yapılabilir. uMatrix diye harika bir Firefox eklentisi var; bununla JavaScript’i site bazında, hatta alt alan adı bazında kolayca kapatabiliyor, JavaScript olmadan bozulan sitelerde de tekrar açabiliyorsun.
    • Bol şans. Bu mücadeleden yakın zamanda vazgeçtim. Çünkü ziyaret ettiğim neredeyse her sitede içeriği görebilmek için JavaScript’i yeniden açmam gerekiyordu.
      Sadece Cloudflare gibi DDoS kontrolleri değil, artık sayfa HTML’sinin içinde olması gereken şeyler bile JavaScript ile yükleniyor.
    • Tam da bu yüzden Tor Browser JavaScript’i kapatıyor.
      İ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.

    • Kombinatorik acımasız bir efendidir.
  • 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.

    • Benzer bir yaklaşım. Ses algoritmaları sık sık işletim sistemi işlevlerini çağırır ve CPU optimizasyonlarından yararlanır.
      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.