Canvas fingerprinting za hranicí základů: proč dva identické Chromy vykreslí odlišné pixely
Dvě zařízení se stejným Chromem, OS i GPU stejně vykreslí odlišné pixely canvasu. Proč je vykreslovací pipeline nedeterministická, proč se injektování šumu vrací jako bumerang a kam canvas patří v moderní detekční sadě.
Canvas fingerprinting se v produkci používá už od roku 2012. Myšlenka je přímočará: požádat prohlížeč o vykreslení 2D obsahu, načíst zpět pixely a zahašovat je. Různá zařízení produkují pro stejné instrukce mírně odlišné pixely a tyto rozdíly jsou dostatečně stabilní, aby identifikovaly zařízení napříč relacemi.
To je dobře známé. Méně se chápe, proč technika funguje — proč identické softwarové konfigurace na identickém hardwaru stále produkují odlišné pixelové výstupy. Odpověď leží na průsečíku GPU ovladačů, vykreslování písma a aritmetiky s plovoucí desetinnou čárkou.
Vykreslovací pipeline není deterministická
Když JavaScript zavolá context.fillText("Cwm fjord bank glyphs vext quiz", 4, 45), Chrome pixely nevykresluje sám. Vygeneruje instrukce pro Skii — 2D grafickou knihovnu — která zase vydá vykreslovací příkazy GPU-akcelerovanému backendu (obvykle ANGLE na Windows, Metal na macOS nebo softwarový fallback v kontejnerech).
V každém kroku se hromadí drobné rozdíly v implementaci:
-
Fontový subsystém Skii vybírá rodinu písma. Pokud Arial není nainstalovaný, přejde na náhradu — a ta se liší podle písem nainstalovaných v systému.
-
Vybrané písmo se vykreslí v požadované velikosti pomocí FreeType (na Linuxu), DirectWrite (na Windows) nebo Core Text (na macOS). Každá knihovna má jiné hintovací algoritmy.
-
Aplikuje se subpixelové polohování. Zde začínají identická písma produkovat odlišné pixely — algoritmus zaokrouhluje pozice na zlomkové pixelové odchylky a pravidla zaokrouhlování se mezi platformami liší.
-
Rasterizovaný text se kompozituje na canvas. Prolínání se na hardwarově akcelerovaných systémech provádí pomocí GPU shaderů a ve fallback režimu pomocí CPU kódu.
Každý z těchto kroků může vnést rozdíly o jednu či dvě pixelové hodnoty. Jednotlivě neviditelné. Dohromady jedinečné.
Verze GPU ovladačů dominují fingerprintu
Dva stroje s Windows 11 a čipy Intel UHD Graphics 620 mohou produkovat odlišné výstupy canvasu, pokud se jejich GPU ovladače liší. Intel vydává aktualizace ovladačů několikrát ročně a každá může změnit subpixelové filtrování, gamma korekci a antialiasing textu.
To znamená, že stabilita canvas fingerprintu je omezena frekvencí aktualizací ovladačů. Uživatel, který aktualizuje svůj grafický ovladač — často tiše, přes Windows Update — uvidí, že se jeho canvas fingerprint změnil.
Detekční systémy to řeší tak, že canvas fingerprint berou jako jeden z mnoha signálů, ne jako samostatný identifikátor. Když se změní, ale ostatní signály zůstanou stabilní (TLS fingerprint, WebGL renderer, časové pásmo, nainstalovaná písma), návštěvník je stále rozpoznán.
Vykreslování emoji je zlatý důl
Nejvíce identifikujícím prvkem canvas fingerprintu často není text ani tvary, ale emoji. Vykreslování emoji závisí na emoji fontu dodávaném s OS — Segoe UI Emoji na Windows, Apple Color Emoji na macOS, Noto Color Emoji na Androidu.
I v rámci jediného OS se vykreslování emoji mění napříč verzemi. Vykreslení duhového emoji ve Windows 10 se liší od Windows 11. Usmívající se obličej v iOS 16 má jiný antialiasing než v iOS 17.
Moderní skripty pro canvas fingerprinting cíleně vykreslují sekvence emoji včetně nových přírůstků do Unicode. Návštěvník, který tvrdí, že běží na iPhone Safari, ale nedokáže vykreslit emoji přidané v iOS 17, běží na starším iOS — nebo o platformě lže.
Automatizační frameworky produkují charakteristické fingerprinty
Headless Chrome běžící v Docker kontejneru bez GPU používá k vykreslování SwiftShader. SwiftShader produkuje výstupy canvasu, které jsou vnitřně konzistentní, ale odlišné od jakéhokoli hardwarově akcelerovaného Chromu.
Signatura je rozpoznatelná: neobvykle čistý antialiasing, specifické hodnoty barev v oblastech přechodů a hrany textu, které neodpovídají žádnému známému GPU ovladači. Canvas fingerprint, který odpovídá SwiftShaderu v Chromu 124 v Linuxovém kontejneru, je téměř jistě automatizace — žádný reálný uživatel prohlížeč takto neprovozuje.
Puppeteer-extra-stealth se pokouší podvrhnout výstup canvasu tím, že zachytí toDataURL() a vrátí upravená data. Ale úprava často vnáší vlastní artefakty — vzory šumu, které se opakují napříč relacemi, což paradoxně činí snahu o anti-fingerprinting detekovatelnější, než kdyby se nedělalo nic.
Proč injektování šumu nefunguje dobře
Prohlížeče zaměřené na soukromí jako Brave vkládají do výstupu canvasu šum, aby zabránily sledování. Cílem je přidat k hodnotám pixelů malé náhodné variace, aby stejné zařízení produkovalo v každé relaci jiný fingerprint.
V praxi má injektování šumu tři problémy:
1. Samotný šum je fingerprint. Návštěvník, jehož výstup canvasu se mění při každém načtení, ale jehož ostatní signály zůstávají identické, je rozpoznatelný jako prohlížeč injektující šum. A to samo o sobě identifikuje.
2. Algoritmus šumu je stabilní. Implementace Brave produkuje specifické vzory šumu, které neodpovídají přirozené variabilitě GPU vykreslování. Detekční systémy dokážou rozlišit výstupy canvasu, které vypadají jako s injektovaným šumem, od těch, které vypadají přirozeně.
3. Sofistikované systémy kombinují vzorky. Více vykreslení na téže stránce nebo napříč relacemi lze zprůměrovat. Pokud je šum malý, průměr konverguje k základnímu deterministickému fingerprintu.
Co canvas fingerprinting zachycuje
Kromě zřejmého vizuálního výstupu dokáže canvas fingerprinting jako vedlejší efekt extrahovat několik atributů zařízení:
Doba vykreslování — jak dlouho canvasu trvá vykreslení, prozrazuje výkon GPU. 4K desktop s diskrétní grafickou kartou vykresluje rychleji než laptop střední třídy.
Metriky textu — measureText() vrací přesné pixelové šířky, které se liší podle vykreslování písma. Šířku textu lze použít jako fingerprint i bez vykreslování.
Podpora kompozitních operací — některé prohlížeče nebo konfigurace GPU podporují rozšířené kompozitní režimy. Testování podpory odhaluje hranice schopností.
Efekty filtrů — filtry ve stylu CSS aplikované na canvas produkují napříč GPU odlišné výstupy, zejména filtry rozostření a vržený stín.
Kam canvas fingerprinting patří v detekční sadě
Samo o sobě není canvas fingerprinting robustním identifikátorem. Ovladače se mění. Uživatelé přepínají prohlížeče. Injektování šumu je u publika zaměřeného na soukromí běžné.
Jeho skutečná síla spočívá v roli křížové kontroly. Když relace na základě cookies nebo přihlášení k účtu tvrdí, že jde o vracejícího se uživatele, canvas fingerprint slouží jako druhý signál — shoda s historickým fingerprintem tvrzení potvrzuje, neshoda signalizuje převzetí účtu nebo únos relace.
Pro bot detekci vyniká canvas fingerprinting v odhalování kontejnerizované automatizace. Reální uživatelé mají reálné GPU. Reálné GPU produkují rozpoznatelné vykreslovací signatury. Cokoli, co vykresluje jako SwiftShader nebo jako špatně podvržený canvas, spadá do kategorie téměř jistě bot.
Technika z roku 2012 funguje v roce 2026 ze stejného důvodu: vykreslování je deterministické pro dané prostředí, ale téměř nemožné plně podvrhnout. Každý pokus se skrýt zanechává stopy po samotném pokusu.