Canvas Fingerprinting Lebih dari Sekadar Dasar: Mengapa Dua Chrome Identik Merender Piksel yang Berbeda
Dua perangkat dengan Chrome, OS, dan GPU yang sama tetap merender piksel canvas berbeda. Mengapa pipeline rendering non-deterministik, mengapa noise injection justru merugikan, dan posisi canvas dalam detection stack.
Canvas fingerprinting telah digunakan di lingkungan produksi sejak 2012. Idenya sederhana: minta browser merender konten 2D, baca kembali pikselnya, lalu hash. Perangkat yang berbeda menghasilkan piksel yang sedikit berbeda untuk instruksi yang sama, dan perbedaan itu cukup stabil untuk mengidentifikasi sebuah perangkat lintas sesi.
Sejauh itu sudah banyak diketahui. Yang kurang dipahami adalah mengapa teknik ini berhasil — mengapa konfigurasi software yang identik pada hardware yang identik tetap menghasilkan output piksel yang berbeda. Jawabannya terletak pada irisan antara driver GPU, rendering font, dan aritmetika floating-point.
Pipeline rendering tidak deterministik
Ketika JavaScript memanggil context.fillText("Cwm fjord bank glyphs vext quiz", 4, 45), Chrome tidak merender pikselnya sendiri. Ia menghasilkan instruksi untuk Skia — pustaka grafis 2D — yang pada gilirannya mengeluarkan perintah menggambar ke backend berakselerasi GPU (biasanya ANGLE di Windows, Metal di macOS, atau fallback software di dalam container).
Di setiap langkah, perbedaan implementasi kecil terakumulasi:
-
Subsistem font Skia memilih family font. Jika Arial tidak terpasang, ia melakukan fallback — dan fallback tersebut bervariasi tergantung font yang terpasang di sistem.
-
Font yang dipilih dirender pada ukuran yang diminta menggunakan FreeType (di Linux), DirectWrite (di Windows), atau Core Text (di macOS). Setiap pustaka memiliki algoritma hinting yang berbeda.
-
Penempatan subpixel diterapkan. Di sinilah font yang identik mulai menghasilkan piksel yang berbeda — algoritma membulatkan posisi ke offset piksel pecahan, dan aturan pembulatannya berbeda antar platform.
-
Teks yang telah dirasterisasi dikomposit ke atas canvas. Blending dilakukan menggunakan shader GPU pada sistem berakselerasi hardware, dan oleh kode CPU dalam mode fallback.
Setiap langkah ini dapat memperkenalkan perbedaan satu atau dua nilai piksel. Secara individual tidak terlihat. Secara kolektif unik.
Versi driver GPU mendominasi fingerprint
Dua mesin Windows 11 dengan chip Intel UHD Graphics 620 dapat menghasilkan output canvas yang berbeda jika driver GPU-nya berbeda. Intel merilis pembaruan driver beberapa kali dalam setahun, dan setiap pembaruan dapat mengubah filtering subpixel, koreksi gamma, dan anti-aliasing teks.
Ini berarti stabilitas canvas fingerprint dibatasi oleh frekuensi pembaruan driver. Pengguna yang memperbarui driver grafisnya — sering kali secara diam-diam, melalui Windows Update — akan melihat canvas fingerprint-nya berubah.
Sistem deteksi menangani hal ini dengan memperlakukan canvas fingerprint sebagai salah satu dari banyak sinyal, bukan sebagai identifier tunggal. Ketika fingerprint itu berubah tetapi sinyal lain tetap stabil (TLS fingerprint, WebGL renderer, timezone, font yang terpasang), pengunjung tetap dikenali.
Rendering emoji adalah tambang emas
Elemen paling identifikatif dari sebuah canvas fingerprint sering kali bukan teks atau bentuk, melainkan emoji. Rendering emoji bergantung pada font emoji yang disertakan bersama OS — Segoe UI Emoji di Windows, Apple Color Emoji di macOS, Noto Color Emoji di Android.
Bahkan dalam satu OS, rendering emoji berubah antar versi. Cara Windows 10 merender emoji pelangi berbeda dengan Windows 11. Wajah menyeringai di iOS 16 memiliki anti-aliasing yang berbeda dengan di iOS 17.
Skrip canvas fingerprinting modern secara khusus merender rangkaian emoji termasuk tambahan baru pada Unicode. Pengunjung yang mengaku menjalankan Safari iPhone tetapi tidak dapat merender emoji yang ditambahkan di iOS 17 sebenarnya menjalankan iOS yang lebih lama — atau berbohong soal platform-nya.
Framework otomasi menghasilkan fingerprint yang khas
Chrome headless, yang berjalan di dalam container Docker tanpa GPU, menggunakan SwiftShader untuk rendering. SwiftShader menghasilkan output canvas yang konsisten secara internal tetapi berbeda dari Chrome berakselerasi hardware mana pun.
Signature-nya dapat dikenali: anti-aliasing yang luar biasa bersih, nilai warna tertentu pada area gradien, dan tepi teks yang tidak cocok dengan driver GPU mana pun yang dikenal. Canvas fingerprint yang cocok dengan SwiftShader pada Chrome 124 di dalam container Linux hampir pasti adalah otomasi — tidak ada pengguna asli yang menjalankan browser dengan cara seperti ini.
Puppeteer-extra-stealth berupaya memalsukan output canvas dengan mencegat toDataURL() dan mengembalikan data yang telah dimodifikasi. Namun modifikasi tersebut sering kali memunculkan artefaknya sendiri — pola noise yang berulang lintas sesi, yang secara paradoks membuat upaya anti-fingerprinting justru lebih mudah dideteksi ketimbang tidak melakukan apa-apa.
Mengapa noise injection tidak bekerja dengan baik
Browser yang berfokus pada privasi seperti Brave menyuntikkan noise ke output canvas untuk mencegah pelacakan. Idenya adalah menambahkan variasi acak kecil pada nilai piksel sehingga perangkat yang sama menghasilkan fingerprint yang berbeda setiap sesi.
Dalam praktiknya, noise injection memiliki tiga masalah:
1. Noise itu sendiri adalah fingerprint. Pengunjung yang output canvas-nya berubah pada setiap pemuatan, tetapi sinyal lainnya tetap identik, dapat dikenali sebagai browser yang menyuntikkan noise. Hal itu sendiri sudah bersifat identifikatif.
2. Algoritma noise-nya stabil. Implementasi Brave menghasilkan pola noise tertentu yang tidak cocok dengan varians alami rendering GPU. Sistem deteksi dapat membedakan output canvas yang tampak disuntik noise dengan yang tampak alami.
3. Sistem canggih menggabungkan sampel. Beberapa render pada halaman yang sama, atau lintas sesi, dapat dirata-ratakan. Jika noise-nya kecil, rata-ratanya konvergen ke fingerprint deterministik yang mendasarinya.
Apa yang ditangkap canvas fingerprinting
Selain output visual yang jelas, canvas fingerprinting dapat mengekstrak beberapa atribut perangkat sebagai efek samping:
Waktu rendering — berapa lama canvas dirender mengungkap kemampuan GPU. Desktop 4K dengan GPU diskret merender lebih cepat daripada laptop kelas menengah.
Metrik teks — measureText() mengembalikan lebar piksel yang persis, yang bervariasi tergantung rendering font. Lebar teks dapat digunakan sebagai fingerprint bahkan tanpa merender.
Dukungan operasi komposit — beberapa browser atau konfigurasi GPU mendukung mode komposit yang diperluas. Menguji dukungannya mengungkap batas kemampuan.
Efek filter — filter bergaya CSS yang diterapkan pada canvas menghasilkan output berbeda antar GPU, terutama filter blur dan drop-shadow.
Posisi canvas fingerprinting dalam detection stack
Berdiri sendiri, canvas fingerprinting bukanlah identifier yang tangguh. Driver berubah. Pengguna berganti browser. Noise injection lazim di kalangan audiens yang berfokus pada privasi.
Kekuatan sejatinya adalah sebagai cross-check. Ketika sebuah sesi mengaku sebagai pengguna lama berdasarkan cookie atau login akun, canvas fingerprint bertindak sebagai sinyal kedua — kecocokan dengan fingerprint historis menegaskan klaim tersebut, ketidakcocokan menandai account takeover atau session hijacking.
Untuk bot detection, canvas fingerprinting unggul dalam menangkap otomasi dalam container. Pengguna asli memiliki GPU asli. GPU asli menghasilkan signature rendering yang dapat dikenali. Apa pun yang merender seperti SwiftShader, atau seperti canvas yang dipalsukan dengan buruk, masuk ke keranjang hampir pasti bot.
Teknik dari 2012 masih bekerja di 2026 karena alasan yang sama: rendering bersifat deterministik per lingkungan tetapi hampir mustahil dipalsukan sepenuhnya. Setiap upaya untuk bersembunyi meninggalkan jejak dari upaya itu sendiri.