- Mulai Chrome 148,
Math.tanhdi V8 memanggilstd::tanhmilik host alih-alih fdlibm bawaan, sehingga input yang sama mengembalikan bit terakhir yang berbeda pada glibc di Linux,libsystem_mdi macOS, dan UCRT di Windows Math.tanh(0.8)menjadi0.6640367702678491di Linux,0.664036770267849di macOS, dan0.6640367702678489di Windows, sehingga tiga OS dapat dibedakan dengan satu panggilan; jika hasilnya berbeda dari OS yang diklaim User-Agent, penyamaran akan terungkap- Jalur kebocoran berbeda di tiap engine: pada
Math.*V8 hanyatanhyang memakai pustaka matematika host, tetapi seluruh fungsi trigonometri CSS di Blink dan sebagian operasi Web Audio juga melewati pustaka khusus OS - Jika nilai digoyang secara acak, hasilnya tidak cocok dengan OS nyata mana pun dan bahkan merusak determinisme; karena itu koefisien, tabel, reduksi rentang, dan perilaku FMA pustaka target harus direproduksi bit demi bit, atau kode UCRT asli harus dipetakan langsung
- Scrapfly memverifikasi kecocokan bit
Math.tanhdan 7 fungsi trigonometri CSS terhadap Mac nyata dan Chrome pada 871.000 input di setiap rilis, serta menyamakan bukan hanya akurasi, tetapi juga perbedaan arsitektur dan waktu eksekusi hingga setara browser nyata
OS yang diungkap oleh Math.tanh
- Hasil
Math.tanh(0.8)berubah tergantung pustaka matematika host- glibc pada Chrome Linux:
0.6640367702678491 libsystem_mpada Chrome macOS:0.664036770267849- UCRT pada Chrome Windows:
0.6640367702678489
- glibc pada Chrome Linux:
- Apple dan glibc umumnya berbeda 1 ULP pada sekitar seperempat dari seluruh input, sedangkan Windows UCRT berbeda dari kedua pustaka tersebut pada beberapa persen input
- ULP (unit in the last place) adalah jarak antara dua angka floating-point berurutan yang dapat direpresentasikan pada besaran tertentu; 1 ULP adalah selisih terkecil yang dapat ditunjukkan oleh
double
- ULP (unit in the last place) adalah jarak antara dua angka floating-point berurutan yang dapat direpresentasikan pada besaran tertentu; 1 ULP adalah selisih terkecil yang dapat ditunjukkan oleh
- Jika Chrome 150 nyata diukur melalui DevTools Protocol pada Linux, macOS 26 berbasis Apple Silicon, dan Windows 11, daya klasifikasinya berbeda tergantung input
tanh(0.5)sama di ketiga OS, yaitu0.46211715726000974, sehingga tidak bisa dipakai untuk deteksitanh(0.7)hanya Linux yang berbeda 1 ULPtanh(0.8)berbeda di ketiga OS, dengan rentang total 2 ULPtanh(0.9)hanya Windows yang berbeda 1 ULP
- Pada sekitar tiga perempat input, ketiga OS menghasilkan hasil yang sama, tetapi satu input yang tepat sudah cukup untuk mendapatkan tanda tangan per OS
- Jika mengklaim macOS tetapi mengembalikan bit matematika Linux, hasil
Math.tanhbertentangan dengan User-Agent
Perubahan yang muncul di Chrome 148
- Hingga Chrome 147, V8 menghitung
Math.tanhdengan menyertakan port fdlibm, implementasi matematika portabel, sehingga semua OS mengembalikan bit yang sama - Commit V8
c1486295ae5mengganti implementasi bawaan denganstd::tanhdari platform- Perubahan ini pertama kali masuk di V8 14.8.57 dan Chrome 148
- Chrome 148, 149, dan 150 mengekspos perbedaan
libmhost, tetapi Chrome 147 ke bawah tidak membocorkan OS lewat jalur ini
- IEEE 754 mendefinisikan cara penyimpanan
double, tetapi tidak mewajibkan fungsi transendental sepertisin,cos,tanh, danexpselalu dibulatkan dengan benar - Pustaka matematika (libm) di tiap OS menukar performa dengan galat ULP, dan memakai koefisien polinomial aproksimasi minimaks, tabel lookup, serta konstanta reduksi rentang yang berbeda-beda
- Linux memakai glibc
- macOS memakai Apple
libsystem_m - Windows memakai
ucrtbase.dlldari UCRT
- Detektor tidak perlu menganalisis operasi matematika itu sendiri; cukup membandingkan nilai dengan tabel hasil per input dari Chrome nyata
Empat jebakan yang menyulitkan reproduksi
-
Hanya sebagian fungsi V8 yang bocor
- V8 menautkan sebagian besar implementasi matematika secara statis, sehingga hasilnya sama tanpa bergantung OS
Math.exp,Math.pow,Math.atan, dan lainnya memakai implementasi llvm-libc bawaanMath.sindanMath.cosmemakai rutindbl-64bawaan yang berasal dari glibc- Setelah Chrome 148, hanya
Math.tanhyang memakaistd::tanhplatform dan membocorkan OS di antaraMath.* - Jika fungsi yang tidak bocor juga dipalsukan seolah-olah dari OS target, hasilnya tidak selaras dengan struktur panggilan V8 nyata; asimetri bahwa hanya
tanhyang berbeda juga dapat diperiksa
-
JavaScript dan CSS memakai jalur berbeda
sin(),cos(), danatan2()di CSS tidak berbagi kode denganMath.sinJavaScript- Engine layout Blink mereduksi sudut dalam satuan derajat, lalu memanggil
std::sinplatform dan sejenisnya pada nilai yang sudah direduksi - Hasilnya berbeda dari menghitung input radian secara langsung, dan seluruh 7 fungsi trigonometri CSS membocorkan OS melalui
libmhost - Reproduksi bit demi bit harus mencakup bukan hanya fungsi matematika akhir, tetapi juga reduksi rentang berbasis derajat serta proses konversi radian–derajat
-
Di dalam macOS ada dua pustaka yang berbeda
- Apple Silicon memiliki
libsystem_mskalar dan rutin vektor Accelerate sepertivvsindanvvtanh, dan kedua implementasi ini tidak sama - Pada 1 juta input, hasilnya berbeda 10–89% tergantung fungsi
cos(0)tepat bernilai1.0pada implementasi skalar- Accelerate mengembalikan
0.9999999999999999 - Chrome di Mac nyata diukur melalui protokol debugging untuk membedakan pustaka per titik panggilan
Math.tanh, fungsi trigonometri CSS, dan fungsi transendental per sampel pada kompresor audio memakailibsystem_mskalar- Web Audio DSP, FFT, matematika vektor, dan filter biquad di Mac memakai Accelerate
- Jalur Chromium terkait mencakup
fft_frame_mac.cc,vector_math_mac.h,biquad.cc, danBUILDFLAG(IS_MAC) - Jika pustaka Apple yang dipilih tidak sesuai dengan titik panggilan, sebagian besar input dapat meleset 1 ULP
- Apple Silicon memiliki
-
Arsitektur CPU juga ikut memengaruhi hasil
- ARM dan x86 berbeda dalam fused multiply-add (FMA) serta propagasi tanda NaN
- Meskipun prosedur matematisnya benar, jika compiler menggabungkan perkalian dan penjumlahan hanya pada satu arsitektur, bit hasil dapat berubah
Jalur kebocoran menurut engine dan fitur
Math.*V8 di JavaScript hampir semuanya memakai implementasi bawaan, dan hanyaMath.tanhyang terhubung kelibmhostsin,cos,tan,asin,acos,atan,atan2,exp,log,log2,log10,powmemakai implementasi bawaan V8sqrt,abs, dan operasi aritmetika dasar adalah operasi hardware
- Fungsi matematika pada
calc()CSS dipanggil langsung oleh Blink ke pustaka platformsin,cos,tan,asin,acos,atan,atan2,exp,log,log2,log10,powmemakailibmhost- CSS tidak memiliki jalur
tanhyang sesuai
- Web Audio mencampur beberapa implementasi tergantung titik panggilan
- Oscillator FFT, penjumlahan/perkalian/skala vektor, dan FFT di Mac memakai
vDSPdari Accelerate - Fungsi transendental per sampel seperti
sin,exp,log10f, danpowfpada DynamicsCompressor memakailibsystem_mskalar - Satu graf audio dapat melintasi tiga pustaka: matematika bawaan V8, pustaka skalar, dan Accelerate
- Oscillator FFT, penjumlahan/perkalian/skala vektor, dan FFT di Mac memakai
- WebAssembly tidak memiliki instruksi fungsi transendental
- Hasil
sindan sejenisnya ditentukan olehlibmyang disertakan dalam modul - Aritmetika seperti
f64.sqrtdanf64.muldijalankan di hardware, sehingga sama antar-OS - Sumbu fingerprint yang tersisa adalah normalisasi NaN antara ARM dan x86 serta sebagian perbedaan pembulatan SIMD
- Hasil
- Sinyal deteksi berfokus pada
Math.tanh, seluruh fungsi trigonometri CSS, dan Web Audio- Accelerate FFT pada Web Audio mengungkap arsitektur CPU
libsystem_mskalar pada kompresor mengungkap OS
Mereproduksi secara tepat, bukan menggoyang nilai
-
Mengapa noise gagal
- Jika noise ditambahkan ke hasil, nilainya bisa tidak cocok dengan nilai OS nyata mana pun dalam tabel acuan
- Jika nilai acak berubah di setiap panggilan, determinisme rusak, dan fenomena itu sendiri menjadi sinyal deteksi terpisah
- Tujuannya bukan nilai yang mirip, melainkan hasil yang sama bit demi bit dengan nilai yang dikembalikan OS yang diklaim
-
Memulihkan semua elemen algoritme target
- Koefisien aproksimasi minimaks, tabel eksponen, dan konstanta reduksi rentang dari
libmtarget dipulihkan lalu dipindahkan ke kode C portabel - Bahkan input yang dibulatkan ke arah yang salah oleh pustaka target harus dicocokkan apa adanya
- Reproduksi
sinApple memakai pola bit tepat dari koefisien yang diekstrak darilibsystem_mdan pemanggilanfma()eksplisit - Jika koefisien dipindahkan sebagai desimal, nilainya dapat dibulatkan lagi selama transkripsi, jadi koefisien dipertahankan sebagai nilai floating-point heksadesimal
- Setiap operasi perkalian-penjumlahan yang digabungkan Apple juga digabungkan secara eksplisit di kode
- Koefisien aproksimasi minimaks, tabel eksponen, dan konstanta reduksi rentang dari
-
Mengunci FMA secara deterministik
- Compile dengan
-ffp-contract=offagar compiler tidak menambah atau menghapus FMA secara sembarang - Hanya
fma()yang tertulis eksplisit di kode yang dijalankan pada posisi yang sama dengan Apple, sehingga bit yang sama bisa diperoleh bahkan saat meniru ARM tetapi berjalan di server x86 - FMA hardware dan FMA software yang dibulatkan dengan benar mengembalikan bit yang sama
- Compile dengan
Menggunakan kode sumber Windows UCRT
- Windows UCRT memakai ISA x86-64 yang sama dengan server Linux dan bersifat position-independent, sehingga
ucrtbase.dllasli dapat dipetakan ke memori runtime dan ekspor fungsi matematikanya dipanggil langsung - Karena menjalankan kode asli, bit UCRT nyata bisa diperoleh tanpa reverse engineering algoritme matematika terpisah
- Perbedaan antara ABI System V Linux dan ABI Windows x64 harus ditangani
- Pada Windows x64, callee memakai shadow space 32 byte di atas alamat return
- Himpunan register callee-saved juga berbeda dari System V
- Jika function pointer tidak dideklarasikan sebagai
ms_abi, penulisan shadow-space akan merusak stack frame clang dan indirect call dapat berpindah ke alamat yang salah
- Kode DLL yang dipetakan bukan target indirect call yang terdaftar di CFI
-fsanitize=cfi-icalldi produksi dapat memicu trap#UDdanSIGILLpada setiap panggilan- Wrapper yang memanggil function pointer memerlukan
clang::no_sanitize("cfi-icall")
- Fungsi matematika UCRT membaca flag dispatch CPU dengan
mov eax, [rip+disp32]di bagian awal untuk memilih jalur skalar atau FMA/AVX2- Pada DLL yang baru dipetakan, flag bernilai 0 sehingga jalur skalar lambat dipilih
- Hasil jalur ini berbeda bit dari hasil sistem Windows modern
- Alamat flag pada prolog
tanhharus ditemukan dan dipaksa ke jalur FMA sebelum panggilan pertama agar cocok bit demi bit dengan Windows nyata
Lokasi patch dan batasan performa
- Hook dilakukan pada satu bottleneck tempat engine memanggil
libm, lalu jalur dipilih sesuai OS yang diklaim browser- Jika mengklaim Linux, glibc dipertahankan
- Jika mengklaim macOS, implementasi reproduksi Apple dipakai
- Meski hasilnya akurat, perbedaan waktu eksekusi dari browser nyata tetap dapat dideteksi
- Build pertama menurunkan semua
fma()menjadi panggilan software karena baseline x86 default lebih tua daripada FMA hardware, sehingga 2,5–6 kali lebih lambat daripada native - Membandingkan rasio waktu loop berulang
Math.tanhdanMath.sindapat mengungkap pola performa yang tidak ada pada browser nyata - Setelah FMA hardware diaktifkan, setiap operasi gabungan menjadi satu instruksi dan sekitar 6 kali lebih cepat; bit hasil tetap identik sekalipun lebih cepat daripada glibc
Verifikasi dengan 871.000 input
- Harness verifikasi menjalankan 871.000 input pada setiap rilis, melintasi semua cabang dan domain
- Grid input rapat
- Batas interval
- Subnormal
- Nol bertanda
- Tak hingga
- NaN
- Dua jenis lingkungan nyata dipakai sebagai nilai acuan
- Mac nyata menghitung hasil skalar dan Accelerate untuk semua input, masing-masing, guna menemukan titik ketika kedua implementasi berbeda
- Chrome pada Mac nyata dijalankan melalui protokol debugging untuk mengumpulkan hasil presisi penuh dari
Math.tanhdan seluruh fungsi trigonometri CSS
Math.tanhsertasin,cos,tan,asin,acos,atan,atan2di CSS cocok bit demi bit dengan Chrome Mac nyata- Juga diverifikasi apakah implementasi reproduksi berperilaku sama dengan machine code nyata di dalam binary distribusi
- Pascaproses browser pada batas domain juga harus dicocokkan
- Pada Mac nyata, CSS
asin(2)berada di luar domain sehingga menjadi NaN, lalu CSS membatasi NaN menjadi 0; nilai akhirnya0 - Implementasi reproduksi sederhana bisa keliru mengembalikannya sebagai 90 derajat
- Pada Mac nyata, CSS
Mengapa matematika penting dalam penyamaran browser
- Hasil matematika deterministik dan murah diperiksa, tetapi untuk menyamar secara akurat perlu memahami internal
libmvendor dan jalur panggilan per engine - Agar cocok dengan browser nyata, perlu mengetahui pustaka matematika mana yang dipilih V8, Blink, dan Web Audio pada setiap titik panggilan, lalu menyamakan bit terakhir, perilaku spesifik arsitektur, dan waktu eksekusi
- Scrapium dari Scrapfly dikonfigurasi agar ketika diminta tampil sebagai macOS, bit pembulatan kosinusnya pun cocok dengan traffic macOS nyata
1 komentar
Komentar Hacker News
Penjelasan bahwa hasil satu kali pemanggilan
tanhdengan input yang tepat menjadi tanda tangan per sistem operasi melewatkan kemungkinan untuk mengidentifikasi rentang versi browserKebanyakan orang tidak memalsukan sistem operasi pada User-Agent, dan fingerprinting lebih tertarik pada kombinasi karakteristik semi-unik daripada sistem operasi itu sendiri. Temuannya menarik, tetapi tulisannya terlalu terasa dibuat dengan LLM sehingga mengurangi kepercayaan
Dengan begitu mereka bisa lebih mudah lolos dari deteksi bot dan menjual data yang dikumpulkan dari situs web lain kepada pelanggan
Fakta bahwa tulisan ini dibuat dengan LLM sudah diungkapkan di artikel dan blog, bukan disembunyikan atau berpura-pura ditulis manusia. Karena keterbatasan waktu, kalau tidak begitu tulisan ini tidak akan pernah diterbitkan, dan saya siap bertanggung jawab atas pilihan itu
Browser terus menambahkan fitur dan memperbaiki bug, dan sebagian besar di antaranya dapat dideteksi dengan JavaScript
Strategi yang cerdas: menganalisis semua teknik fingerprinting dengan AI lalu memublikasikannya, memicu kontroversi hingga browser terdorong memblokirnya, sehingga bisnis scraping mereka sendiri bisa menghasilkan lebih banyak uang
Kalau perusahaan seperti ini tidak ada, browser fingerprinting tidak akan semerajalela sekarang dan internet akan lebih baik. Saya malah lebih suka tulisan dari pihak lawan yang kepentingannya jelas, seperti fingerprint.js
Ini memberi satu alasan lagi untuk mendorong fungsi transendental dengan pembulatan tepat
Baru-baru ini saya mengetahui bahwa masalah ini pada dasarnya sudah terselesaikan. Lihat keynote kedua di https://arith2026.org/program.html
libmyang dibulatkan secara tepat memang bagus, tetapi jangan sampai performa kasus terburuknya mengerikan sepertipowdi glibc duluJalur cadangan presisi tinggi yang dipakai saat dekat dengan batas pembulatan bisa di-SLP-vectorize secara manual untuk memperbaiki performa kasus terburuk, tetapi ini sudah cukup untuk sebagian besar penggunaan. Agak mengejutkan mesin JavaScript tidak terus memakai
fdlibmyang direkomendasikan spesifikasi ECMAScript, dan kalauMath.tanhmenjadi jalur bottleneck di JavaScript, itu kode yang cukup anehDi rekayasa, fixed-point sering digunakan karena berjalan pada perangkat keras yang jauh lebih sederhana dan galatnya mudah dimodelkan secara matematis. Floating-point IEEE 754 pun secara teori terasa meragukan, dan dalam hal kehilangan presisi, bilangan bulat yang lebih kecil dari mantissa—yaitu integer di bawah 24-bit—kadang bisa lebih baik daripada floating-point 32-bit
Saya berharap teknik ini ditambahkan ke https://coveryourtracks.eff.org/ agar saya bisa melihat seberapa unik hasil fungsi matematika saya dalam populasi yang lebih besar
Entah benar atau tidak, tetapi sepertinya sinyal yang digunakan coveryourtracks.eff.org hanya sekitar 25
Tulisan ini terasa ditulis oleh Claude
Jika menekan tautan Claude, prompt yang dikirim adalah
summarize+this+article+and+explain+how+scrapfly+helps+me+scrape+any+website+at+scale+and+bypass+anti-bot+systems+for+my+use+case:+[https://scrapfly.dev/posts/browser-math-os-fingerprint/](<https://scrapfly.dev/posts/browser-math-os-fingerprint/>)Tor Browser dan Mullvad Browser pada akhirnya juga menyerah menyembunyikan sistem operasi, tetapi mungkin seharusnya tidak begitu
Tampaknya memang ada terlalu banyak jalur fingerprinting
Terlalu banyak perbedaan perilaku menurut sistem operasi, baik di dalam maupun di luar browser, sehingga sulit menangani semuanya. Meski ekstraksi canvas diblokir atau diberi noise, perbedaan rendering tetap bisa bocor; pengembang Tor Browser juga mengonfirmasi bahwa mereka bahkan tidak bisa menyembunyikan perbedaan antara X11 dan Wayland, apalagi sistem operasi yang sepenuhnya berbeda. https://forum.torproject.org/t/linux-is-it-alright-to-run-th...
navigator.platform, jadi sangat mudah mengetahui lingkungan yang bukan WindowsCukup sisipkan kode berikut dengan plugin injeksi JavaScript favorit Anda:
let oldTanh = Math.tanh; Math.tanh = x => oldTanh(x) + Math.random()/10000000;Math.tanh = Math.random;glibc terbaru menggunakan
tanhdari CORE-MATH yang dibulatkan secara tepat, sehingga mengembalikan hasil yang berbeda dari nilai yang dikutip di artikelMasih belum jelas apakah fungsi transendental lain juga bisa diimplementasikan dengan pembulatan tepat dan performa yang wajar, sehingga tiap fungsi meninggalkan fingerprint uniknya sendiri
Chrome memiliki executable code ratusan MB, jadi saya kira sekitar separuh library user-space sudah ditautkan secara statis
Selain itu, saya mengira
tanhbukan pemanggilan fungsi, melainkan operasi bawaan yang dipancarkan JIT JavaScript sebagai instruksi CPU; jadi aneh jika harus bercabang melalui fungsidlsym()untuk operasi matematika. Instruksi CPU itu sendiri memang juga bisa di-fingerprintMicrocode tidak mendapat manfaat seperti branch prediction, sehingga dalam praktiknya lebih lambat daripada implementasi perangkat lunak
Saya ragu apakah pertarungan ini bisa dimenangkan
Jika cukup banyak fungsi dijalankan, rasio waktu eksekusi dan hasil pembulatan bisa digabungkan untuk memperkirakan bukan hanya sistem operasi dan model perangkat yang tepat, tetapi juga pekerjaan lain yang sedang berjalan di perangkat yang sama. Tampaknya yang bisa dilakukan hanya membuatnya sedikit lebih sulit, bukan memblokir sepenuhnya
Pada akhirnya masyarakat dan hukum harus mengejar. Seperti kunci pintu tidak sepenuhnya mencegah penyusupan tetapi dilengkapi kecaman sosial dan hukuman pidana, pelacakan individu dengan cara seperti ini harus dibuat ilegal, dan perusahaan serta karyawan yang memanfaatkan keuntungannya harus dikucilkan secara sosial
Di tempat seperti Rusia, Myanmar, atau Korea Utara, supremasi hukum tidak berjalan, dan otoritas lokal bahkan secara aktif melindungi penjahat yang menipu orang asing, sehingga analogi kunci pintu tidak berlaku