Temel Seviyenin Ötesinde Canvas Fingerprinting: Neden Aynı İki Chrome Farklı Pikseller Üretir
Aynı Chrome, işletim sistemi ve GPU'ya sahip iki cihaz yine farklı canvas pikselleri üretir. Render hattı neden deterministik değil, gizlilik amaçlı gürültü eklemek neden ters teper ve canvas modern tespit yığınında nereye oturur.
Canvas fingerprinting 2012'den beri üretimde kullanılıyor. Fikir basit: tarayıcıdan 2D içerik render etmesini iste, pikselleri geri oku ve hash'le. Aynı komutlar için farklı cihazlar hafifçe farklı pikseller üretir ve bu farklar, bir cihazı oturumlar boyunca tanımlayacak kadar kararlıdır.
Bu kadarı iyi biliniyor. Daha az anlaşılan şey, tekniğin neden işe yaradığı — özdeş donanım üzerindeki özdeş yazılım yapılandırmalarının neden hâlâ farklı piksel çıktıları ürettiği. Yanıt, GPU sürücüleri, font render'ı ve kayan nokta aritmetiğinin kesişiminde yatıyor.
Render hattı deterministik değildir
JavaScript context.fillText("Cwm fjord bank glyphs vext quiz", 4, 45) çağrısını yaptığında, Chrome pikselleri kendi render etmez. Skia için — 2D grafik kütüphanesi — komutlar üretir; o da GPU hızlandırmalı bir arka uca (Windows'ta genellikle ANGLE, macOS'ta Metal veya container'larda yazılım fallback'i) çizim komutları gönderir.
Her adımda küçük uygulama farkları birikir:
-
Skia'nın font alt sistemi bir font ailesi seçer. Arial kurulu değilse geri düşer (fallback) — ve bu fallback, sistemde kurulu fontlara göre değişir.
-
Seçilen font, istenen boyutta FreeType (Linux'ta), DirectWrite (Windows'ta) veya Core Text (macOS'ta) kullanılarak render edilir. Her kütüphanenin farklı hinting algoritmaları vardır.
-
Subpixel konumlandırma uygulanır. Özdeş fontların farklı pikseller üretmeye başladığı yer burasıdır — algoritma konumları kesirli piksel ofsetlerine yuvarlar ve yuvarlama kuralları platformlar arasında farklıdır.
-
Rasterize edilmiş metin canvas üzerine kompozit edilir. Blending işlemi, donanım hızlandırmalı sistemlerde GPU shader'larıyla, fallback modunda ise CPU koduyla yapılır.
Bu adımların her biri bir veya iki piksel değerlik fark ortaya çıkarabilir. Tek tek görünmez. Toplu halde benzersiz.
GPU sürücü sürümleri fingerprint'e hâkimdir
Intel UHD Graphics 620 çipli iki Windows 11 makinesi, GPU sürücüleri farklıysa farklı canvas çıktıları üretebilir. Intel yılda birkaç kez sürücü güncellemesi yayımlar ve her güncelleme subpixel filtrelemeyi, gama düzeltmesini ve metin anti-aliasing'ini değiştirebilir.
Bu, canvas fingerprint kararlılığının sürücü güncelleme sıklığıyla sınırlı olduğu anlamına gelir. Grafik sürücüsünü — çoğu zaman Windows Update aracılığıyla sessizce — yükselten bir kullanıcı, canvas fingerprint'inin değiştiğini görecektir.
Tespit sistemleri bunu, canvas fingerprint'i tek başına bir tanımlayıcı değil, birçok sinyalden biri olarak ele alarak çözer. Fingerprint değişirken diğer sinyaller (TLS fingerprint, WebGL renderer, saat dilimi, kurulu fontlar) kararlı kaldığında ziyaretçi yine tanınır.
Emoji render'ı bir altın madenidir
Bir canvas fingerprint'inin en ayırt edici öğesi çoğu zaman metin veya şekiller değil, emojidir. Emoji render'ı, işletim sistemiyle birlikte gelen emoji fontuna bağlıdır — Windows'ta Segoe UI Emoji, macOS'ta Apple Color Emoji, Android'de Noto Color Emoji.
Tek bir işletim sistemi içinde bile emoji render'ı sürümler arasında değişir. Windows 10'un gökkuşağı emojisini render etme biçimi, Windows 11'inkinden farklıdır. iOS 16'nın sırıtan yüzü, iOS 17'ninkinden farklı anti-aliasing'e sahiptir.
Modern canvas fingerprinting script'leri özellikle Unicode'a yeni eklenenleri de içeren emoji dizileri render eder. iPhone Safari çalıştırdığını iddia eden ancak iOS 17'de eklenmiş bir emojiyi render edemeyen bir ziyaretçi ya daha eski bir iOS çalıştırıyordur ya da platform konusunda yalan söylüyordur.
Otomasyon çerçeveleri kendine özgü fingerprint'ler üretir
GPU'suz bir Docker container'ında çalışan headless Chrome, render için SwiftShader kullanır. SwiftShader, kendi içinde tutarlı ancak donanım hızlandırmalı herhangi bir Chrome'dan farklı canvas çıktıları üretir.
İmza tanınabilirdir: alışılmadık derecede temiz anti-aliasing, gradyan bölgelerinde belirli renk değerleri ve bilinen hiçbir GPU sürücüsüyle eşleşmeyen metin kenarları. Linux container'ında Chrome 124'te SwiftShader ile eşleşen bir canvas fingerprint'i neredeyse kesinlikle otomasyondur — hiçbir gerçek kullanıcı tarayıcıyı bu şekilde çalıştırmaz.
Puppeteer-extra-stealth, toDataURL() çağrısını yakalayıp değiştirilmiş veri döndürerek canvas çıktısını taklit etmeye çalışır. Ancak bu değişiklik çoğu zaman kendi artefaktlarını ortaya çıkarır — oturumlar boyunca tekrar eden gürültü desenleri; bu da paradoksal biçimde anti-fingerprinting çabasını, hiçbir şey yapmamaktan daha kolay tespit edilir hale getirir.
Gürültü enjeksiyonu neden iyi çalışmaz
Brave gibi gizlilik odaklı tarayıcılar, izlemeyi önlemek için canvas çıktısına gürültü enjekte eder. Fikir, aynı cihazın her oturumda farklı fingerprint üretmesi için piksel değerlerine küçük rastgele varyasyonlar eklemektir.
Pratikte gürültü enjeksiyonunun üç sorunu vardır:
1. Gürültünün kendisi bir fingerprint'tir. Canvas çıktısı her yüklemede değişen ancak diğer sinyalleri özdeş kalan bir ziyaretçi, gürültü enjekte eden bir tarayıcı olarak tanınabilir. Bunun kendisi ayırt edicidir.
2. Gürültü algoritması kararlıdır. Brave'in uygulaması, GPU render'ının doğal varyansıyla eşleşmeyen belirli gürültü desenleri üretir. Tespit sistemleri, gürültü enjekte edilmiş görünen canvas çıktılarını doğal görünenlerden ayırt edebilir.
3. Gelişmiş sistemler örnekleri birleştirir. Aynı sayfadaki birden çok render veya oturumlar boyunca alınanlar ortalanabilir. Gürültü küçükse, ortalama altta yatan deterministik fingerprint'e yakınsar.
Canvas fingerprinting neyi yakalar
Bariz görsel çıktının ötesinde, canvas fingerprinting bir yan etki olarak çeşitli cihaz özniteliklerini çıkarabilir:
Render süresi — canvas'ın render edilme süresi GPU yeteneğini açığa vurur. Ayrık GPU'lu 4K bir masaüstü, orta seviye bir dizüstünden daha hızlı render eder.
Metin metrikleri — measureText() font render'ına göre değişen kesin piksel genişlikleri döndürür. Metin genişliği, render yapmadan bile fingerprint olarak kullanılabilir.
Kompozit işlem desteği — bazı tarayıcılar veya GPU yapılandırmaları genişletilmiş kompozit modlarını destekler. Desteği test etmek yetenek sınırlarını açığa çıkarır.
Filtre efektleri — canvas'a uygulanan CSS tarzı filtreler, özellikle blur ve drop-shadow filtreleri, GPU'lar arasında farklı çıktılar üretir.
Canvas fingerprinting bir tespit yığınında nereye oturur
Tek başına canvas fingerprinting sağlam bir tanımlayıcı değildir. Sürücüler değişir. Kullanıcılar tarayıcı değiştirir. Gizlilik odaklı kitlelerde gürültü enjeksiyonu yaygındır.
Gerçek gücü bir çapraz kontrol olarak ortaya çıkar. Bir oturum, çerezlere veya hesap girişine dayanarak geri dönen bir kullanıcı olduğunu iddia ettiğinde, canvas fingerprint'i ikinci bir sinyal olarak işlev görür — geçmiş fingerprint'le eşleşmesi iddiayı doğrular, eşleşmemesi ise hesap ele geçirme veya oturum hijacking'i işaret eder.
Bot tespiti için canvas fingerprinting, container tabanlı otomasyonu yakalamada başarılıdır. Gerçek kullanıcıların gerçek GPU'ları vardır. Gerçek GPU'lar tanınabilir render imzaları üretir. SwiftShader gibi veya kötü taklit edilmiş bir canvas gibi render eden her şey, neredeyse kesinlikle bot kovasında yer alır.
2012 tekniği 2026'da hâlâ aynı nedenle işe yarıyor: render işlemi ortam başına deterministiktir ancak tümüyle taklit edilmesi neredeyse imkânsızdır. Gizlenmeye yönelik her girişim, girişimin kendisine dair izler bırakır.