- ตั้งแต่ Chrome 148 เป็นต้นไป
Math.tanhของ V8 จะเรียกstd::tanhของโฮสต์แทน fdlibm ที่ฝังมาในตัว ทำให้แม้ใช้อินพุตเดียวกันก็คืนค่า บิตสุดท้ายต่างกัน ระหว่าง glibc บน Linux,libsystem_mบน macOS และ UCRT บน Windows Math.tanh(0.8)ให้ค่า0.6640367702678491บน Linux,0.664036770267849บน macOS, และ0.6640367702678489บน Windows ทำให้ แยกสามระบบปฏิบัติการได้ด้วยการเรียกเพียงครั้งเดียว และหากผลลัพธ์ไม่ตรงกับ OS ที่ User-Agent อ้างไว้ก็จะเผยการปลอมตัว- แต่ละเอนจินมีเส้นทางการรั่วไหลต่างกัน โดยใน
Math.*ของ V8 มีเพียงtanhที่ใช้ไลบรารีคณิตศาสตร์ของโฮสต์ แต่ ฟังก์ชันตรีโกณมิติทั้งหมดของ CSS ใน Blink และการคำนวณบางส่วนของ Web Audio ก็ผ่านไลบรารีตาม OS เช่นกัน - การใส่ noise แบบสุ่มลงในค่าจะทำให้ไม่ตรงกับ OS จริงใดเลยและยังทำลายความเป็น deterministic ดังนั้นต้อง จำลองระดับบิต ของค่าสัมประสิทธิ์ ตาราง การย่อช่วง และพฤติกรรม FMA ของไลบรารีเป้าหมาย หรือแม็ปโค้ด UCRT ต้นฉบับมาใช้โดยตรง
- Scrapfly ตรวจสอบความตรงระดับบิตของ
Math.tanhและฟังก์ชันตรีโกณมิติ CSS ทั้ง 7 ตัวในทุกรีลีสด้วยอินพุต 871,000 ค่าเทียบกับ Mac จริงและ Chrome จริง พร้อมปรับให้เหมือนเบราว์เซอร์จริงทั้งด้านความแม่นยำ ความต่างของสถาปัตยกรรมและเวลาในการรัน
OS ที่ Math.tanh เปิดเผย
- ผลของ
Math.tanh(0.8)ต่างกันตามไลบรารีคณิตศาสตร์ของโฮสต์- glibc ของ Chrome บน Linux:
0.6640367702678491 libsystem_mของ Chrome บน macOS:0.664036770267849- UCRT ของ Chrome บน Windows:
0.6640367702678489
- glibc ของ Chrome บน Linux:
- Apple และ glibc ต่างกันราว หนึ่งในสี่ ของอินพุตทั้งหมด โดยส่วนใหญ่ต่างกัน 1 ULP ส่วน Windows UCRT ต่างจากอีกสองไลบรารีในอินพุตเพียงไม่กี่เปอร์เซ็นต์
- ULP (unit in the last place) คือระยะห่างระหว่างจำนวน floating-point ที่ต่อเนื่องกันและแทนค่าได้ในขนาดหนึ่ง ๆ และ 1 ULP คือความต่างที่เล็กที่สุดที่
doubleแสดงได้
- ULP (unit in the last place) คือระยะห่างระหว่างจำนวน floating-point ที่ต่อเนื่องกันและแทนค่าได้ในขนาดหนึ่ง ๆ และ 1 ULP คือความต่างที่เล็กที่สุดที่
- เมื่อตรวจวัด Chrome 150 จริงผ่าน DevTools Protocol บน Linux, macOS 26 ที่ใช้ Apple Silicon และ Windows 11 ความสามารถในการจำแนกขึ้นอยู่กับอินพุต
tanh(0.5)ให้ค่า0.46211715726000974เหมือนกันทั้งสาม OS จึงใช้ตรวจจับไม่ได้tanh(0.7)ต่าง 1 ULP เฉพาะ Linuxtanh(0.8)ต่างกันครบทั้งสาม OS และมีช่วงรวม 2 ULPtanh(0.9)ต่าง 1 ULP เฉพาะ Windows
- ราวสามในสี่ของอินพุตจะให้ผลเหมือนกันทั้งสาม OS แต่ถ้าเลือกอินพุตเหมาะ ๆ เพียงค่าเดียวก็ได้ ลายเซ็นเฉพาะของแต่ละ OS
- หากอ้างว่าเป็น macOS แต่คืนค่าบิตคณิตศาสตร์แบบ Linux ผลของ
Math.tanhก็จะขัดแย้งกับ User-Agent
การเปลี่ยนแปลงที่เกิดขึ้นใน Chrome 148
- จนถึง Chrome 147, V8 ฝังพอร์ตของ fdlibm ซึ่งเป็น implementation คณิตศาสตร์แบบพกพาไว้ใช้คำนวณ
Math.tanhจึงคืนค่าบิตเหมือนกันทุก OS - คอมมิตของ V8
c1486295ae5เปลี่ยนจาก implementation ที่ฝังมาในตัวไปใช้std::tanhของแพลตฟอร์ม- การเปลี่ยนแปลงนี้รวมเข้ามาครั้งแรกใน V8 14.8.57 และ Chrome 148
- Chrome 148, 149, 150 เผยความต่างของ
libmบนโฮสต์ แต่ Chrome 147 และก่อนหน้านั้นไม่รั่วไหล OS ผ่านเส้นทางนี้
- IEEE 754 กำหนดรูปแบบการเก็บของ
doubleแต่ไม่ได้บังคับให้ฟังก์ชัน transcendental เช่นsin,cos,tanh,expต้องปัดเศษได้ถูกต้องเสมอ - ไลบรารีคณิตศาสตร์ (libm) ของแต่ละ OS จึงประนีประนอมระหว่างประสิทธิภาพกับความคลาดเคลื่อนระดับ ULP และใช้ค่าสัมประสิทธิ์พหุนามแบบ minimax, ตาราง lookup และค่าคงที่สำหรับ range reduction ที่ต่างกัน
- Linux ใช้ glibc
- macOS ใช้ Apple
libsystem_m - Windows ใช้
ucrtbase.dllของ UCRT
- ตัวตรวจจับไม่จำเป็นต้องวิเคราะห์ตัวการคำนวณเอง แค่เทียบค่ากับตารางผลลัพธ์ของ Chrome จริงสำหรับแต่ละอินพุตก็พอ
กับดักสี่อย่างที่ทำให้การจำลองยาก
-
มีเพียงบางฟังก์ชันของ V8 ที่รั่วไหล
- V8 ลิงก์ implementation คณิตศาสตร์ส่วนใหญ่แบบ static จึงให้ผลเหมือนกันโดยไม่ขึ้นกับ OS
Math.exp,Math.pow,Math.atanเป็นต้น ใช้ implementationllvm-libcที่ฝังมาในตัวMath.sinและMath.cosใช้รูทีนdbl-64ที่ฝังมาในตัวและมีที่มาจาก glibc- หลัง Chrome 148 มีเพียง
Math.tanhที่ใช้std::tanhของแพลตฟอร์มและรั่วไหล OS ในกลุ่มMath.* - ถ้าปลอมแม้แต่ฟังก์ชันที่ไม่รั่วให้ดูเหมือน OS เป้าหมาย ก็จะขัดกับโครงสร้างการเรียกจริงของ V8 และแม้แต่ความไม่สมมาตรที่มีแค่
tanhต่างก็ตรวจได้
-
JavaScript กับ CSS ใช้คนละเส้นทาง
sin(),cos(),atan2()ของ CSS ไม่ได้ใช้โค้ดเดียวกับMath.sinของ JavaScript- เอนจินเลย์เอาต์ Blink จะย่อมุมในหน่วยองศาก่อน แล้วค่อยเรียก
std::sinของแพลตฟอร์มกับค่าที่ถูกย่อแล้ว - จึงต่างจากผลที่คำนวณจากอินพุตเรเดียนโดยตรง และ ฟังก์ชันตรีโกณมิติ CSS ทั้ง 7 ตัว ก็รั่วไหล OS ผ่าน
libmของโฮสต์ - การจำลองให้ตรงระดับบิตต้องรวมทั้งฟังก์ชันคณิตศาสตร์ปลายทาง การย่อช่วงในหน่วยองศา และกระบวนการแปลงเรเดียน/องศา
-
ภายใน macOS เองก็มีสองไลบรารีต่างกัน
- บน Apple Silicon มีทั้ง
libsystem_mแบบ scalar และรูทีนเวกเตอร์vvsin,vvtanhของ Accelerate ซึ่งให้ผลไม่เหมือนกัน - จากอินพุต 1 ล้านค่า ผลต่างกัน 10–89% ตามแต่ละฟังก์ชัน
cos(0)ใน implementation แบบ scalar ให้1.0พอดี- แต่ใน Accelerate คืนค่า
0.9999999999999999 - มีการวัด Chrome บน Mac จริงผ่าน debugging protocol เพื่อแยกว่าแต่ละจุดเรียกใช้ไลบรารีไหน
Math.tanh, ฟังก์ชันตรีโกณมิติ CSS และฟังก์ชัน transcendental ต่อ sample ของ audio compressor ใช้libsystem_mแบบ scalar- ส่วน Web Audio DSP, FFT, vector math และตัวกรอง biquad บน Mac ใช้ Accelerate
- เส้นทาง Chromium ที่เกี่ยวข้องมี
fft_frame_mac.cc,vector_math_mac.h,biquad.ccและBUILDFLAG(IS_MAC) - ถ้าเลือกไลบรารีของ Apple ไม่ตรงกับจุดเรียกใช้งาน ผลส่วนใหญ่ของอินพุตอาจคลาดไป 1 ULP
- บน Apple Silicon มีทั้ง
-
สถาปัตยกรรม CPU ก็มีผลต่อผลลัพธ์
- ARM และ x86 ต่างกันในเรื่อง fused multiply-add (FMA) และการส่งต่อเครื่องหมายของ NaN
- แม้ขั้นตอนคณิตศาสตร์จะถูกต้อง แต่ถ้าคอมไพเลอร์รวมการคูณกับการบวกเป็น FMA บนสถาปัตยกรรมหนึ่งเท่านั้น บิตผลลัพธ์ก็จะต่างกัน
เส้นทางการรั่วไหลตามเอนจินและฟีเจอร์
Math.*ของ JavaScript ใน V8 แทบทั้งหมดใช้ implementation ที่ฝังมาในตัว และมีเพียงMath.tanhจุดเดียวที่เชื่อมไปยังlibmของโฮสต์sin,cos,tan,asin,acos,atan,atan2,exp,log,log2,log10,powใช้ implementation ภายใน V8sqrt,absและการคำนวณเลขคณิตพื้นฐานใช้ฮาร์ดแวร์
- ฟังก์ชันคณิตศาสตร์ใน
calc()ของ CSS นั้น Blink เรียกไลบรารีของแพลตฟอร์มโดยตรงsin,cos,tan,asin,acos,atan,atan2,exp,log,log2,log10,powใช้libmของโฮสต์- CSS ไม่มีเส้นทาง
tanhที่สอดคล้องกัน
- Web Audio ใช้หลาย implementation ปะปนกันตามจุดเรียก
- FFT ของ oscillator, การบวก/คูณ/สเกลแบบเวกเตอร์ และ FFT บน Mac ใช้
vDSPของ Accelerate - ฟังก์ชัน transcendental ต่อ sample ของ DynamicsCompressor เช่น
sin,exp,log10f,powfใช้libsystem_mแบบ scalar - กราฟเสียงเดียวกันอาจพาดผ่าน สามไลบรารี ได้แก่ คณิตศาสตร์ฝังใน V8, ไลบรารี scalar และ Accelerate
- FFT ของ oscillator, การบวก/คูณ/สเกลแบบเวกเตอร์ และ FFT บน Mac ใช้
- WebAssembly ไม่มีคำสั่ง transcendental ในตัว
- ผลของ
sinเป็นต้น จึงขึ้นอยู่กับlibmที่รวมอยู่ในโมดูล - การคำนวณเชิงเลขอย่าง
f64.sqrt,f64.mulรันบนฮาร์ดแวร์จึงเหมือนกันข้าม OS - ลายนิ้วมือที่เหลืออยู่จึงเป็นเรื่องการ normalize NaN ระหว่าง ARM กับ x86 และความต่างด้านการปัดเศษของ SIMD บางส่วน
- ผลของ
- สัญญาณตรวจจับจึงไปกระจุกที่
Math.tanh, ฟังก์ชันตรีโกณมิติ CSS ทั้งหมด และ Web Audio- FFT ของ Accelerate ใน Web Audio เผยสถาปัตยกรรม CPU
libsystem_mแบบ scalar ใน compressor เผย OS
แทนที่จะทำให้ค่าผันผวน ต้องจำลองให้ตรงเป๊ะ
-
ทำไมการใส่ noise ถึงล้มเหลว
- ถ้าเพิ่ม noise เข้าไปในผลลัพธ์ ค่าอาจไม่ตรงกับค่าของ OS จริงตัวใดเลยในตารางอ้างอิง
- ถ้าค่าสุ่มต่างกันทุกครั้งที่เรียก ความเป็น deterministic จะหายไป และตัวอาการนี้เองก็เป็นสัญญาณตรวจจับอีกแบบ
- เป้าหมายไม่ใช่ค่าที่ใกล้เคียง แต่คือผลลัพธ์ที่ตรงระดับบิตกับค่าที่ OS ที่อ้างไว้จะคืนมา
-
ต้องกู้คืนองค์ประกอบทั้งหมดของอัลกอริทึมเป้าหมาย
- กู้คืนค่าสัมประสิทธิ์ minimax, ตาราง exponent และค่าคงที่สำหรับ range reduction จาก
libmเป้าหมาย แล้วพอร์ตเป็นโค้ด C แบบพกพา - ต้องทำให้ตรงแม้แต่อินพุตที่ไลบรารีเป้าหมายปัดเศษผิดทิศทาง
- การจำลอง
sinของ Apple ใช้ รูปแบบบิตที่ตรงเป๊ะ ของค่าสัมประสิทธิ์ที่ดึงจากlibsystem_mและเรียกfma()แบบ explicit - ถ้าย้ายค่าสัมประสิทธิ์เป็นเลขฐานสิบ อาจเกิดการปัดเศษซ้ำระหว่างถอดความ จึงต้องเก็บเป็นค่า floating-point แบบฐานสิบหก
- ทุกจุดที่ Apple fuse การคูณกับการบวก โค้ดก็ต้อง fuse แบบ explicit เช่นกัน
- กู้คืนค่าสัมประสิทธิ์ minimax, ตาราง exponent และค่าคงที่สำหรับ range reduction จาก
-
ตรึง FMA ให้ deterministic
- คอมไพล์ด้วย
-ffp-contract=offเพื่อไม่ให้คอมไพเลอร์เพิ่มหรือตัด FMA เองตามอำเภอใจ - มีเพียง
fma()ที่เขียนไว้ในโค้ดเท่านั้นที่จะรันในตำแหน่งเดียวกับของ Apple ทำให้แม้จำลอง ARM บนเซิร์ฟเวอร์ x86 ก็ยังได้บิตเดียวกัน - FMA ในฮาร์ดแวร์กับ FMA แบบซอฟต์แวร์ที่ปัดเศษได้ถูกต้องจะคืนค่าบิตเดียวกัน
- คอมไพล์ด้วย
ใช้โค้ดต้นฉบับของ Windows UCRT
- Windows UCRT ใช้ ISA แบบ x86-64 เหมือนเซิร์ฟเวอร์ Linux และเป็น position-independent จึงสามารถแม็ป
ucrtbase.dllจริงเข้า memory ตอนรันไทม์ แล้วเรียก export ของฟังก์ชันคณิตศาสตร์ได้โดยตรง - เพราะเป็นการรันโค้ดต้นฉบับ จึงได้ บิตของ UCRT จริง โดยไม่ต้อง reverse engineer อัลกอริทึมคณิตศาสตร์แยกต่างหาก
- แต่ต้องจัดการความต่างของ ABI ระหว่าง System V ของ Linux กับ Windows x64
- ใน Windows x64 ฟังก์ชันที่ถูกเรียกจะใช้ shadow space 32 ไบต์เหนือ return address
- ชุดรีจิสเตอร์ที่ callee ต้องรักษาไว้ก็ต่างจาก System V
- หากไม่ประกาศ function pointer เป็น
ms_abiการเขียน shadow space อาจทำให้ stack frame ของ clang เสียหายและ indirect call กระโดดไปผิด address ได้
- โค้ด DLL ที่แม็ปเข้ามาไม่ใช่เป้าหมายของ indirect call ที่ลงทะเบียนไว้ใน CFI
- ในโปรดักชัน
-fsanitize=cfi-icallอาจทำให้เกิด trap#UDและSIGILLทุกครั้งที่เรียก - wrapper ที่เรียก function pointer จึงต้องมี
clang::no_sanitize("cfi-icall")
- ในโปรดักชัน
- ฟังก์ชันคณิตศาสตร์ของ UCRT จะอ่าน CPU dispatch flag จาก
mov eax, [rip+disp32]ตอนต้น แล้วเลือกเส้นทาง scalar หรือ FMA/AVX2- ใน DLL ที่แม็ปใหม่ flag จะเป็น 0 จึงเลือกเส้นทาง scalar ที่ช้ากว่า
- ผลลัพธ์ของเส้นทางนี้ต่างจากบิตบนระบบ Windows สมัยใหม่
- ต้องหา address ของ flag จาก prologue ของ
tanhแล้วบังคับเป็นเส้นทาง FMA ก่อนเรียกครั้งแรก จึงจะตรงระดับบิตกับ Windows จริง
จุดแพตช์และข้อจำกัดด้านประสิทธิภาพ
- ระบบจะ hook คอขวดจุดเดียว ที่เอนจินเรียก
libmแล้วเลือกเส้นทางตาม OS ที่เบราว์เซอร์อ้างตัว- ถ้าอ้างว่าเป็น Linux ก็ใช้ glibc ต่อไป
- ถ้าอ้างว่าเป็น macOS ก็ใช้ implementation จำลองของ Apple
- ต่อให้ผลลัพธ์ถูกต้อง แต่ถ้าเวลาในการรันต่างจากเบราว์เซอร์จริงก็ยังตรวจจับได้
- บิลด์แรกใช้ baseline x86 เริ่มต้นซึ่งเก่ากว่า FMA ในฮาร์ดแวร์ ทำให้
fma()ทุกตัวถูกลดเป็นการเรียกซอฟต์แวร์และช้ากว่า native 2.5–6 เท่า - การเทียบสัดส่วนเวลาในลูปของ
Math.tanhกับMath.sinอาจเผยรูปแบบประสิทธิภาพที่ไม่มีในเบราว์เซอร์จริง - เมื่อเปิดใช้ FMA ในฮาร์ดแวร์ การคำนวณแบบ fuse แต่ละจุดกลายเป็นคำสั่งเดียว เร็วขึ้นราว 6 เท่า และยังให้บิตผลลัพธ์เหมือนเดิมแม้เร็วกว่า glibc
ตรวจสอบด้วยอินพุต 871,000 ค่า
- ชุดทดสอบสำหรับการตรวจสอบจะรัน อินพุต 871,000 ค่า ครอบคลุมทุก branch และทุกช่วงโดเมนในแต่ละรีลีส
- กริดอินพุตแบบหนาแน่น
- ขอบเขตของช่วง
- จำนวน subnormal
- ศูนย์ที่มีเครื่องหมาย
- อินฟินิตี้
- NaN
- ใช้สภาพแวดล้อมจริงสองแบบเป็นค่ามาตรฐานอ้างอิง
- Mac จริงคำนวณผลทั้งแบบ scalar และ Accelerate สำหรับทุกอินพุต เพื่อดูจุดที่ implementation ทั้งสองแยกกัน
- Chrome บน Mac จริงถูกรันผ่าน debugging protocol เพื่อเก็บผลแบบ full precision ของ
Math.tanhและฟังก์ชันตรีโกณมิติ CSS ทั้งหมด
Math.tanhและsin,cos,tan,asin,acos,atan,atan2ของ CSS ตรงระดับบิต กับ Chrome จริงบน Mac- ยังตรวจด้วยว่า implementation จำลองทำงานเหมือน machine code จริงที่อยู่ในไบนารีที่ปล่อยใช้งาน
- ต้องตรงแม้กระทั่ง post-processing ของเบราว์เซอร์ที่ขอบเขตโดเมน
- บน Mac จริง
asin(2)ของ CSS อยู่นอกโดเมนจึงกลายเป็น NaN และ CSS clamp NaN เป็น 0 ทำให้ค่าท้ายสุดเป็น0 - implementation จำลองแบบง่ายอาจคืนค่า 90 องศาผิด ๆ แทน
- บน Mac จริง
ทำไมคณิตศาสตร์จึงสำคัญกับการปลอมตัวเป็นเบราว์เซอร์
- ผลลัพธ์คณิตศาสตร์นั้น deterministic และตรวจได้ในต้นทุนต่ำ แต่การปลอมให้แม่นต้องรู้ทั้งภายใน
libmของผู้ขายและเส้นทางเรียกของแต่ละเอนจิน - หากต้องการให้ตรงกับเบราว์เซอร์จริง จำเป็นต้องรู้ว่า V8, Blink และ Web Audio เลือกใช้ไลบรารีคณิตศาสตร์ใดในแต่ละจุดเรียก และต้องทำให้ตรงทั้งบิตสุดท้าย พฤติกรรมตามสถาปัตยกรรม และเวลาในการรัน
- Scrapium ของ Scrapfly ถูกตั้งค่าให้เมื่อมีการขอแสดงตัวเป็น macOS ก็สามารถทำให้แม้แต่บิตการปัดเศษของ cosine ตรงกับทราฟฟิก macOS จริงได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
คำอธิบายที่ว่าผลลัพธ์จากการเรียก
tanhหนึ่งครั้งด้วยอินพุตทางขวาจะกลายเป็นลายเซ็นเฉพาะตามระบบปฏิบัติการนั้น พลาดความเป็นไปได้ในการระบุ ช่วงเวอร์ชันของเบราว์เซอร์คนส่วนใหญ่ไม่ได้ปลอมระบบปฏิบัติการใน User-Agent และการทำฟิงเกอร์พรินต์สนใจการผสมผสานของคุณลักษณะที่กึ่งไม่ซ้ำกันมากกว่าตัวระบบปฏิบัติการเอง การค้นพบนี้น่าสนใจ แต่บทความดูเหมือนเขียนด้วย LLM มากเกินไปจนลดความน่าเชื่อถือลง
เพื่อให้ผ่านการตรวจจับบอตได้ง่ายขึ้น และขายข้อมูลที่เก็บจากเว็บไซต์อื่นให้ลูกค้าได้
เรื่องที่เขียนด้วย LLM นั้นได้เปิดเผยไว้ในบทความและบล็อกแล้ว ไม่ได้ปิดบังหรือแสร้งว่าเป็นมนุษย์เขียน หากไม่ทำแบบนี้เพราะเวลามีจำกัด ก็คงไม่ได้เผยแพร่บทความเลย และพร้อมรับผิดชอบต่อทางเลือกนี้
เบราว์เซอร์เพิ่มฟีเจอร์และแก้บั๊กอยู่ตลอด และส่วนใหญ่สามารถ ตรวจจับด้วย JavaScript ได้
เป็นกลยุทธ์ที่ฉลาด เพราะถ้าวิเคราะห์และเปิดเผยเทคนิคฟิงเกอร์พรินต์ทั้งหมดด้วย AI แล้วเกิดข้อถกเถียงจนเบราว์เซอร์ถูกผลักดันให้ป้องกันสิ่งเหล่านี้ได้ ธุรกิจสแครปข้อมูลของตัวเองก็จะทำเงินได้มากขึ้น
ถ้าไม่มีบริษัทพวกนี้ การฟิงเกอร์พรินต์เบราว์เซอร์ คงไม่แพร่หลายเท่าตอนนี้ และอินเทอร์เน็ตก็คงดีกว่านี้ด้วยซ้ำ ผม/ฉันยังชอบบทความจากฝั่งตรงข้ามที่มีผลประโยชน์ชัดเจนอย่าง fingerprint.js มากกว่า
มีเหตุผลเพิ่มขึ้นอีกข้อที่ควรผลักดัน ฟังก์ชันทรานเซนเดนทัลที่ปัดเศษถูกต้องแม่นยำ
เพิ่งรู้ว่าเมื่อไม่นานมานี้ปัญหานี้แทบจะได้รับการแก้แล้ว ดูปาฐกถาหลักที่สองใน https://arith2026.org/program.html
libmที่ปัดเศษได้ถูกต้องแม่นยำนั้นยอดเยี่ยม แต่ ประสิทธิภาพกรณีเลวร้ายที่สุด ต้องไม่ย่ำแย่เหมือนpowของ glibc ในอดีตอาจลองปรับปรุงประสิทธิภาพกรณีเลวร้ายที่สุดได้ด้วยการทำ SLP vectorization เองบนเส้นทางสำรองความแม่นยำสูงที่ใช้เมื่ออยู่ใกล้ขอบเขตการปัดเศษ แต่จริง ๆ แล้วสำหรับการใช้งานส่วนใหญ่ก็เพียงพอแล้ว น่าแปลกที่เอนจิน JavaScript ไม่ได้ใช้
fdlibmต่อไปตามที่สเปก ECMAScript แนะนำ และถ้าMath.tanhเป็นเส้นทางคอขวดของ JavaScript ก็คงเป็นโค้ดที่ค่อนข้างแปลกมากในงานวิศวกรรมมักใช้ fixed-point เพราะทำงานได้บนฮาร์ดแวร์ที่เรียบง่ายกว่ามาก และสามารถจำลองข้อผิดพลาดทางคณิตศาสตร์ได้ง่าย IEEE 754 floating-point นั้นน่าสงสัยแม้ในเชิงทฤษฎี และเมื่อพูดถึงการสูญเสียความแม่นยำ จำนวนเต็มที่เล็กกว่า mantissa หรือจำนวนเต็มต่ำกว่า 24 บิต ก็อาจดีกว่า floating-point 32 บิตในบางกรณี
คงดีถ้าเทคนิคนี้ถูกเพิ่มเข้าไปใน https://coveryourtracks.eff.org/ เพื่อจะได้ดูว่าผลลัพธ์ฟังก์ชันคณิตศาสตร์ของฉันมีความเป็นเอกลักษณ์แค่ไหนเมื่อเทียบกับประชากรที่ใหญ่กว่า
ไม่รู้ว่าจริงไหม แต่คิดว่าสัญญาณที่ coveryourtracks.eff.org ใช้น่าจะมีประมาณ 25 รายการเอง
บทความดูมีร่องรอยชัดว่า Claude เป็นคนเขียน
ถ้าคลิกลิงก์ Claude จะส่งพรอมป์ว่า
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 และ Mullvad Browser ก็เลิกพยายามปกปิดระบบปฏิบัติการในท้ายที่สุด แต่บางทีอาจไม่ควรทำเช่นนั้น
เพราะดูเหมือนมี ช่องทางฟิงเกอร์พรินต์ มากเกินไป
ความแตกต่างด้านพฤติกรรมเฉพาะระบบปฏิบัติการเกิดขึ้นมากเกินไปทั้งในและนอกเบราว์เซอร์ จนจัดการทั้งหมดได้ยาก ต่อให้บล็อกการดึงข้อมูล canvas หรือใส่ noise ก็ยังอาจเผยความแตกต่างในการเรนเดอร์ได้ และนักพัฒนา Tor Browser ก็ยืนยันแล้วว่าแม้แต่ความต่างระหว่าง X11 กับ Wayland ยังซ่อนไม่ได้ นับประสาอะไรกับระบบปฏิบัติการคนละตัวโดยสิ้นเชิง https://forum.torproject.org/t/linux-is-it-alright-to-run-th...
navigator.platformดังนั้นจึงตรวจได้ง่ายมากว่าเป็น สภาพแวดล้อมที่ไม่ใช่ Windowsใส่โค้ดต่อไปนี้ด้วยปลั๊กอินฉีด JavaScript ที่คุณชอบก็พอ:
let oldTanh = Math.tanh; Math.tanh = x => oldTanh(x) + Math.random()/10000000;Math.tanh = Math.random;glibc รุ่นล่าสุดใช้
tanhที่ปัดเศษถูกต้องแม่นยำ จาก CORE-MATH จึงคืนค่าต่างจากค่าที่อ้างในบทความยังไม่ชัดเจนว่าฟังก์ชันทรานเซนเดนทัลอื่น ๆ สามารถทำการปัดเศษที่ถูกต้องแม่นยำด้วยประสิทธิภาพสมเหตุสมผลได้หรือไม่ ดังนั้นแต่ละฟังก์ชันจึงทิ้งฟิงเกอร์พรินต์เฉพาะของตัวเองไว้
Chrome มีโค้ดที่รันจริงหลายร้อย MB เลยคิดว่าน่าจะลิงก์แบบสแตติกกับไลบรารีฝั่งผู้ใช้ไปสักครึ่งหนึ่งแล้ว
อีกอย่าง ผมนึกว่า
tanhไม่ใช่การเรียกฟังก์ชัน แต่เป็น โอเปอเรชันในตัว ที่ JavaScript JIT ปล่อยออกมาเป็นคำสั่ง CPU จึงแปลกที่ต้องแยกไปหาdlsym()เพื่อทำการคำนวณทางคณิตศาสตร์ ตัวคำสั่ง CPU เองก็อาจถูกฟิงเกอร์พรินต์ได้เช่นกันไมโครโค้ดไม่ได้ประโยชน์อย่าง branch prediction จึงช้ากว่าการทำในซอฟต์แวร์จริง ๆ
สงสัยว่าจะชนะการต่อสู้นี้ได้จริงไหม
ถ้ารันฟังก์ชันมากพอ ก็น่าจะผสมอัตราส่วนเวลาในการรันกับผลลัพธ์การปัดเศษเพื่อประมาณได้ไม่เพียงแค่ระบบปฏิบัติการและรุ่นเครื่องที่แน่นอน แต่รวมถึงงานอื่นที่กำลังรันอยู่บนเครื่องเดียวกันด้วย ดูเหมือนทำได้แค่ทำให้ยากขึ้นเล็กน้อย มากกว่าจะป้องกันได้ทั้งหมด
สุดท้ายสังคมและกฎหมายต้องตามให้ทัน เหมือนกลอนประตูไม่ได้ป้องกันการบุกรุกได้ทั้งหมด แต่มีการประณามทางสังคมและโทษทางอาญาช่วยเสริม เราควรทำให้ การติดตามบุคคลด้วยวิธีนี้เป็นสิ่งผิดกฎหมาย และกีดกันทางสังคมบริษัทกับคนทำงานที่ใช้ประโยชน์จากมัน
ในที่อย่างรัสเซีย เมียนมา หรือเกาหลีเหนือ หลักนิติธรรมไม่ทำงาน และบางครั้งหน่วยงานท้องถิ่นยังคุ้มครองอาชญากรที่หลอกชาวต่างชาติอย่างแข็งขันด้วย ดังนั้นอุปมาเรื่องกลอนประตูจึงใช้ไม่ได้