ما هو WebGL Pixel Hash؟ هاش GPU وبصمة المتصفح
المتصفح والجهاز

ما هو WebGL Pixel Hash؟ هاش GPU وبصمة المتصفح

اكتشف كيف يُنتج hash بكسلات WebGL معرّفاً فريداً من مُخرجات GPU — إشارة بصمة عالية الكثافة المعلوماتية.

8 دقائق قراءة·

يُنشئ WebGL pixel hash fingerprinting (بصمة هاش بكسل WebGL) مشهدًا اختباريًا غير مرئي باستخدام GLSL shader ويقرأ البكسلات الناتجة عبر gl.readPixels() — مستغلًا حقيقة أن كل GPU يحسب العمليات الحسابية بدقة النقطة العائمة بشكل مختلف قليلًا، ما يُنتج هاشًا ثابتًا يُعرّف أجهزتك عبر جميع المتصفحات، ويصمد أمام حذف ملفات تعريف الارتباط، ولا يمكن إخفاؤه بـ VPN. يمكنك رؤية هاش WebGL pixel الخاص بك الآن على whatsmy.fyi.

ملخص سريع

يُصرَّف برنامج GLSL shader ويُنفَّذ على GPU الخاص بك داخل canvas WebGL مخفية. تُقرأ قيم البكسلات المُنتَجة وتُحوَّل إلى معرّف مضغوط. ولأن تقريب النقطة العائمة في وحدات shader للـ GPU يتباين بين الشركات المصنعة والبنى ومشغّلات الأجهزة (drivers)، يُنتج الـ shader ذاته مخرجات بكسل مختلفة بدقة على أجهزة مختلفة — حتى على جهازين بنفس موديل GPU لكن بتثبيتات مشغّل مختلفة. هذا يجعل هاش البكسل معرّفًا أكثر دقة من مجرد قراءة سلسلة renderer للـ GPU، التي تكشف فقط عن موديل الأجهزة لا عن سلوك المشغّل الدقيق.

ما هو WebGL Pixel Hash Fingerprinting؟

بصمة هاش بكسل WebGL هي أسلوب محدد ضمن عائلة أوسع من بصمة WebGL يستهدف المخرجات الحسابية لـ GPU الخاص بك بدلًا من بياناته التعريفية. بينما تُخبر قراءة سلسلة renderer للـ GPU عبر WEBGL_debug_renderer_info المتتبعَ بموديل GPU، فإنها لا تستطيع تمييز GPU متطابقَين يشغّلان إصداري مشغّل مختلفين. يسد هاش البكسل هذه الفجوة.

تعمل التقنية لأن WebGL API تمنح JavaScript وصولًا مباشرًا إلى تنفيذ GPU shader. يمكن لنص البصمة كتابة GLSL fragment shader يُجري عمليات رياضية — دوال مثلثية، أجزاء كسرية، ضجيج عشوائي زائف — وجعل GPU يُنفّذه. تعتمد قيم الألوان الناتجة المكتوبة في كل بكسل على كيفية معالجة وحدات النقطة العائمة للـ GPU لتلك العمليات داخليًا. تُراكم بنى GPU المختلفة أخطاء التقريب بشكل مختلف، ويمكن لإصدارات مشغّل مختلفة على نفس الـ GPU أن تُنتج مخرجات مختلفة قابلة للقياس.

هذا وثيق الصلة بـ بصمة canvas، التي تقرأ مخرجات البكسل أيضًا — لكن بصمة canvas تستهدف اختلافات رسم الخطوط ثنائية الأبعاد والتنعيم. يستهدف هاش بكسل WebGL العمليات الحسابية في shader ثلاثي الأبعاد للـ GPU مباشرةً، مما يجعله أعلى انتروبيا وأصعب توحيدًا.

كيف تعمل بصمة هاش بكسل WebGL؟

تسير العملية بأكملها في JavaScript، وتستغرق أقل من 50 ميلي ثانية، وغير مرئية تمامًا للمستخدم. تتكشف في أربع مراحل.

المرحلة الأولى — إنشاء canvas WebGL مخفية

يُنشئ النص عنصر canvas خارج الشاشة — لا يُضاف أبدًا للمستند — ويحصل على سياق رسم WebGL. حجم canvas عادةً صغير (256×128 أو 512×256 بكسل) للحفاظ على سرعة التنفيذ. لا تُعرض canvas أبدًا.

المرحلة الثانية — تصريف shader مصمم لتعظيم التباين

يُكتب GLSL fragment shader لإجراء عمليات حساسة لاختلافات دقة النقطة العائمة. أكثر الـ shaders فاعلية تجمع sin() وcos() وfract() وضرب المعاملات الكبيرة — لأن هذه العمليات تُراكم أخطاء التقريب عبر بنى GPU بطرق مختلفة. يُعيّن الـ shader إحداثيات شاشة كل بكسل عبر هذه الدوال الرياضية لإنتاج قيمة لون.

مثال معروف يستخدم صيغة كهذه:

// GLSL fragment shader used for pixel hash fingerprinting
precision highp float;

void main() {
  float x = gl_FragCoord.x / 256.0;
  float y = gl_FragCoord.y / 128.0;

  // These sin/fract combinations amplify GPU floating-point differences
  float r = fract(sin(x * 12.9898 + y * 78.233) * 43758.5453);
  float g = fract(sin(x * 93.989 + y * 17.211) * 43421.631);
  float b = fract(cos(x * 51.234 + y * 31.456) * 12345.678);

  gl_FragColor = vec4(r, g, b, 1.0);
}

المعاملات الثابتة الكبيرة (43758.5453، 43421.631، 12345.678) تعني أن اختلافات النقطة العائمة الدقيقة في النتائج الوسيطة تتضخم إلى اختلافات لون مرئية عندما تلفّها fract(). GPU-ان متفقان حتى 14 خانة عشرية في العمليات الحسابية الوسيطة لا يزالان ينتجان ألوان بكسل نهائية مختلفة.

المرحلة الثالثة — قراءة البكسلات بـ gl.readPixels()

بعد تنفيذ الـ shader، يستدعي النص gl.readPixels() لنقل بيانات البكسلات المُنتَجة من ذاكرة GPU إلى Uint8Array في JavaScript. هذا يمنح النص وصولًا مباشرًا لقيم RGBA لكل بكسل في canvas — النتيجة العددية الخام للحساب الـ shader للـ GPU.

// JavaScript: compile shader, render, and extract pixels
const canvas = document.createElement('canvas');
canvas.width = 256;
canvas.height = 128;
const gl = canvas.getContext('webgl');

// Compile and link vertex + fragment shaders (abbreviated)
const program = compileAndLinkShaders(gl, vertexSrc, fragmentSrc);
gl.useProgram(program);

// Draw a full-screen triangle strip
const buf = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(
  gl.ARRAY_BUFFER,
  new Float32Array([-1, -1,  1, -1,  -1, 1,  1, 1]),
  gl.STATIC_DRAW
);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);

// Read pixel data from GPU memory
const pixels = new Uint8Array(256 * 128 * 4); // width × height × RGBA
gl.readPixels(0, 0, 256, 128, gl.RGBA, gl.UNSIGNED_BYTE, pixels);

// Hash the pixel buffer → stable GPU fingerprint
const hash = fnv1a(pixels); // or MurmurHash, xxHash, etc.

المرحلة الرابعة — تحويل مصفوفة البكسلات إلى هاش

تُحوَّل مصفوفة البكسلات الكاملة — 131,072 بايت لـ canvas بحجم 256×128 — إلى قيمة مضغوطة. الخيارات الشائعة هي FNV-1a (سريع وغير مشفّر) أو MurmurHash3 أو مجموع رقمي بسيط من بايتات البكسلات المُختارة. النتيجة سلسلة سداسية عشرية قصيرة تمثل السلوك الدقيق للنقطة العائمة في وحدات shader لـ GPU الخاص بك. هذا الهاش ثابت عبر إعادة تشغيل المتصفح وجلسات التصفح الخاص وإعادة التشغيل. يتغير فقط عند تحديث مشغّل GPU أو استبدال الأجهزة المادية.

كيف يختلف هذا عن قراءة سلسلة renderer للـ GPU؟

كلاهما أساليب بصمة WebGL، لكنهما يعملان على مستويات مختلفة من مكدس الأجهزة ويلتقطان أبعادًا مختلفة من التفرد.

الخاصيةسلسلة GPU Rendererهاش بكسل WebGL
ما يقرأهاسم موديل GPU + سلسلة المورّدمخرجات الحساب في الـ shader
الـ API المستخدمةWEBGL_debug_renderer_infogl.readPixels()
يُميّز نفس الـ GPU بمشغّلات مختلفة؟لا — نفس الـ GPU يعطي دائمًا نفس السلسلةنعم — اختلافات المشغّل تُغيّر مخرجات البكسل
يُحجبه privacy.resistFingerprinting؟نعم — يُعيد placeholder عامجزئيًا — يتطلب توحيدًا إضافيًا
يعمل على الأجهزة الافتراضية؟بشكل غير متسق — VMs غالبًا تُعيد Mesa/SwiftShaderنعم — المُصيِّرات البرمجية تُنتج مخرجات مميزة أيضًا
يتطلب امتداد WebGL؟نعم — WEBGL_debug_renderer_infoلا — يستخدم WebGL الأساسي

يُعتبر هاش البكسل إشارة أكثر متانة لأنه لا يعتمد على امتداد تصحيح يمكن للمتصفحات حجبه ببساطة. طالما أن رسم WebGL متاح — وهو الحال في أكثر من 95% من المتصفحات — يمكن استخراج شكل من أشكال التباين على مستوى البكسل، حتى لو أعادت سلسلة الـ renderer قيمة عامة.

ما مدى تفرد هاش بكسل WebGL؟

يُسهم هاش البكسل بحوالي 5–7 بتات من الانتروبيا بمعزل عن الإشارات الأخرى، وفقًا لأبحاث Fingerprint.com والدراسات الأكاديمية حول بصمة GPU. هذا يُترجم إلى تمييز متصفحك من بين 32–128 تهيئة متشابهة — تضييق ذو معنى حتى قبل دمج الإشارات الأخرى.

النتيجةالقيمةالمصدر
الانتروبيا من مخرجات رسم WebGL وحدها~5.7 بتبحث Fingerprint.com
ثبات هاش البكسل عبر إعادة تشغيل المتصفحقريب من 100% (يتغير فقط مع تحديث المشغّل)Cao et al., NDSS 2017
الاتساق عبر المتصفحات على نفس الأجهزةعالٍ — العمليات الحسابية للأجهزة مستقلة عن المتصفحCao et al., NDSS 2017
قابلية التعرف عند دمجه مع renderer + vendor للـ GPUأقل من 0.01% من الزوار يشتركون في نفس الثلاثيبحث Inria / KU Leuven الميداني
دعم WebGL في المتصفحات (Chrome، Edge، Safari، Firefox)95–99%اختبار WebGL في BrowserLeaks

عند دمجه مع سلسلة renderer للـ GPU وسلسلة المورّد وإشارات الأجهزة الأخرى، يمكن للبصمة المركبة لـ WebGL تضييق الزائر لأقل من 0.01% من جمهور الموقع النموذجي — مستوى دقة يتجاوز ما كانت معظم ملفات تعريف الارتباط من طرف ثالث تُحققه للتتبع عبر المواقع.

لماذا يبقى هاش البكسل عبر المتصفحات

هذه الميزة هي ما تجعل هاش بكسل WebGL ذا قيمة خاصة للتتبع عبر المتصفحات — سيناريو لا تستطيع الأنظمة المعتمدة على ملفات تعريف الارتباط معالجته أساسًا. عندما تستخدم Chrome وFirefox وEdge على نفس الجهاز، يحتفظ كل متصفح بملفات تعريف ارتباط وتخزين محلي منفصلة تمامًا. لكن الثلاثة يشتركون في نفس GPU والمشغّل الأساسيين. يُصرَّف GLSL shader بشكل مستقل في كل متصفح، لكن يُنفَّذ على نفس الأجهزة — ما يُنتج مخرجات بكسل متطابقة (أو شبه متطابقة) عبرها جميعًا.

أثبت البحث الذي نشره Cao et al. في NDSS 2017 هذه القدرة على التتبع عبر المتصفحات باستخدام هذا النهج تحديدًا: استُخدمت مخرجات رسم GPU لربط جلسات التصفح عبر تثبيتات متصفح مختلفة على نفس الجهاز دون أي حالة مشتركة بينها.

من يستخدم بصمة هاش بكسل WebGL؟

منصات ذكاء الأجهزة التجارية

تشمل منصات كـ Fingerprint.com وThreatmetrix وiovation هاشات رسم WebGL في حساب معرّف الجهاز جانبًا إلى جانب عشرات الإشارات الأخرى. لكشف الاحتيال، يعمل هاش البكسل كمرساة أجهزة ثابتة — حتى لو مسح المحتال ملفات تعريف الارتباط وأدار عناوين IP وبدّل المتصفحات، فإن مخرجات رسم GPU تربط جلساته معًا.

تتبع تقنية الإعلانات

مع إيقاف ملفات تعريف الارتباط من طرف ثالث في Safari وFirefox وتدريجها في Chrome، زادت شبكات الإعلانات اعتمادها على بصمة مستوى الأجهزة لتعريف المستخدمين عبر المواقع. هاش بكسل WebGL جذاب بشكل خاص لأنه لا يتطلب تخزين متصفح ولا بيانات وصفية للشبكة — وهو مكتفٍ بذاته بالكامل داخل JavaScript.

كشف المتصفحات بدون واجهة مستخدم والروبوتات

تستخدم المتصفحات الآلية على بنية الخادم عادةً مُصيِّرات برمجية مثل SwiftShader (Chrome بدون واجهة مستخدم) أو Mesa LLVMpipe (Linux). تُنتج هذه المُصيِّرات البرمجية هاشات بكسل WebGL مختلفة بوضوح عن تلك التي تُنتجها أجهزة GPU الحقيقية — وغالبًا ما تُنتج نفس الهاش عبر جميع النسخ التي تشغّل إصدار المُصيِّر البرمجي ذاته. تستغل منصات الأمان هذا الاتساق للإشارة إلى حركة مرور الروبوتات المحتملة.

الاستجابة الأكاديمية: UNIGL

أبرز دفاع أكاديمي ضد بصمة هاش بكسل WebGL هو UNIGL، المقترح في ورقة USENIX Security لعام 2019 بعنوان "Rendered Private: Making GLSL Execution Uniform to Prevent WebGL-based Browser Fingerprinting" لـ Wu وLi وCao وWang. يعمل UNIGL عن طريق إعادة كتابة برامج GLSL shader في المتصفح قبل وصولها إلى GPU، وتحويل عمليات النقطة العائمة إلى أشكال تُنتج مخرجات موحدة بصرف النظر عن الأجهزة الأساسية.

على عكس الأساليب التي تحجب WebGL ببساطة (متصفح Tor) أو تضيف ضجيجًا (Brave)، يهدف UNIGL إلى جعل مخرجات الرسم موحدة حقًا — إزالة إشارة التتبع دون كسر تطبيقات WebGL. أثبت الباحثون أن UNIGL يمكنه جعل هاشات البكسل متطابقة عبر أجهزة GPU مختلفة بتكلفة أداء أقل من 3% لتطبيقات الويب النموذجية. لكن UNIGL لم يُعتمد من قِبل أي متصفح رئيسي حتى عام 2025، ولا يزال نموذجًا بحثيًا.

كيف تحمي نفسك من بصمة هاش بكسل WebGL

تتطلب الحماية الفعّالة إما حجب وصول رسم WebGL، أو حقن ضجيج في مخرجات البكسل، أو توحيد الحساب. الخيارات مرتبة من الأقوى إلى الأكثر عملية للاستخدام اليومي.

  • متصفح Tor (أقوى حماية): يُعطّل متصفح Tor gl.readPixels() كليًا في تهيئته الافتراضية، مما يجعل من المستحيل على النصوص قراءة بيانات البكسلات المُنتَجة. كما يُقيّد WebGL إلى وضع قدرات محدود. المفاضلة هي تصفح أبطأ عبر شبكة Tor وبعض تطبيقات WebGL المعطوبة.
  • متصفح Brave (موصى به للاستخدام اليومي): Farbling في Brave يحقن قيمة ضجيج عشوائية صغيرة لكل جلسة في مخرجات بكسل WebGL. الضجيج متسق خلال الجلسة (بحيث تعمل تطبيقات WebGL بشكل صحيح) لكنه يتغير بين الجلسات وبين المواقع المختلفة — مما يجعل هاش البكسل معرّف تتبع غير موثوق دون كسر معظم محتوى WebGL.
  • Firefox مع privacy.resistFingerprinting: تمكين هذه الخاصية في about:config يُوحّد مخرجات WebGL في Firefox، مما يجعل هاش الرسم أقل تمييزًا. الحماية أقل عدوانية من Farbling في Brave لكنها لا تتطلب تبديل المتصفحات. قد تتصرف بعض تطبيقات WebGL بشكل غير متوقع.
  • Safari على Apple Silicon (حماية جزئية): يُعشوش Safari على رقائق Apple M-series مخرجات canvas ويُقيّد بعض معاملات WebGL. مع ذلك، لا يزال من الممكن كشف بصمة بنية GPU من Apple الأساسية من خلال مخرجات الرسم — بشكل خاص في المقارنات بين أجيال M1 وM2 وM3، التي تُنتج نتائج shader مختلفة قابلة للقياس.
  • تعطيل WebGL في إعدادات المتصفح: في Firefox، تعيين webgl.disabled على true في about:config يمنع رسم WebGL كليًا. هذا يُزيل إشارة هاش البكسل تمامًا لكنه يكسر أيضًا خرائط WebGL (Google Maps ثلاثي الأبعاد، Mapbox) وألعاب المتصفح وبعض واجهات مؤتمرات الفيديو.
  • ما لا يستطيع VPN فعله: يُشفّر VPN حركة مرور الشبكة ويُغيّر عنوان IP المرئي، لكن ليس له تأثير على تنفيذ GPU shader. يُحسب هاش البكسل داخل متصفحك ويُرسل إلى خوادم التتبع كقيمة JavaScript — لا كبيانات وصفية للشبكة. تحقق من حماية VPN الخاص بك على مستوى IP على whatsmy.fyi، لكن افهم أنه لا يُعالج أي نوع من البصمة.

الأسئلة الشائعة

ما الفرق بين هاش بكسل WebGL وسلسلة renderer لـ WebGL؟

سلسلة الـ renderer تسمية نصية — مثل "NVIDIA GeForce RTX 4080/PCIe/SSE2" — تُعيدها امتداد WEBGL_debug_renderer_info. تُعرّف موديل GPU الخاص بك لكنها متطابقة لجميع الأجهزة التي تحمل نفس GPU بالضبط. هاش البكسل هو بصمة رقمية للحساب الفعلي لـ GPU الخاص بك — مُنتَج عن طريق تشغيل shader اختباري وقراءة بكسلات المخرجات. يلتقط الاختلافات على مستوى المشغّل والسيليكون التي تجعله فريدًا حتى بين الأجهزة ذات نفس موديل GPU.

هل يعمل هاش البكسل في وضع التصفح الخاص؟

نعم. يمنع وضع التصفح الخاص متصفحك من حفظ ملفات تعريف الارتباط والتاريخ والتنزيلات على القرص — لكنه لا يُغير أجهزة GPU أو مشغّلها. يُنشأ هاش البكسل كليًا من حساب GPU وهو متطابق في النوافذ العادية والخاصة على حد سواء. فقط المتصفحات ذات حماية البصمة النشطة (Brave، Firefox مع privacy.resistFingerprinting، متصفح Tor) تُنتج مخرجات مختلفة.

هل يمكن لـ GPU-ين مختلفين إنتاج نفس هاش البكسل؟

نعم، لكنه غير شائع إحصائيًا. GPU-ات من شركات مصنعة مختلفة (NVIDIA مقابل AMD مقابل Intel مقابل Apple) نادرًا ما تُنتج نفس الهاش لأن بنى shader الخاصة بها تتعامل مع عمليات النقطة العائمة بشكل مختلف جوهريًا. GPU-ات ضمن نفس عائلة المنتجات — مثلًا بطاقتا RTX 3070 تشغّلان مشغّلات متطابقة — ستُنتج عمومًا نفس الهاش، لهذا فإن هاش البكسل هو الأقوى عند دمجه مع سلسلة renderer للـ GPU وإشارات أخرى.

هل يمكن عمل بصمة للمُصيِّرات البرمجية بهذه التقنية؟

نعم. تُنتج المُصيِّرات البرمجية كـ SwiftShader (المستخدمة في Chrome عند تعطيل أو عدم توفر تسريع الأجهزة) وMesa LLVMpipe هاشات بكسل خاصة بها. تُنتج إصدارات مختلفة من هذه المُصيِّرات هاشات مختلفة. جهاز يشغّل Chrome بتعطيل تسريع الأجهزة يُنتج هاش SwiftShader متسقًا عبر الجلسات — ومختلفًا بوضوح عن أي هاش GPU حقيقي، لهذا تستخدمه منصات الأمان لوضع علامة على بيئات المتصفح بدون واجهة مستخدم.

هل تحديث مشغّل GPU الخاص بي يُغيّر هاش البكسل؟

يمكن أن يحدث ذلك. أحيانًا تُغيّر تحديثات المشغّل سلوك النقطة العائمة في تنفيذ shader — خاصةً للدوال المثلثية على أجيال GPU القديمة. يعتمد ما إذا كان تحديث مشغّل معين يُغيّر هاش البكسل على ما إذا كان التحديث يُعدّل مُصرّف الـ shader أو سلوك وحدة النقطة العائمة للعمليات المستخدمة في shader البصمة. من الناحية العملية، أحيانًا تُغيّر التحديثات الكبرى للمشغّل الهاش؛ تحديثات الاستقرار البسيطة عادةً لا تفعل ذلك.

هل تحجب أدوات حجب الإعلانات بصمة هاش بكسل WebGL؟

فقط إذا كان نص البصمة مُحمَّلًا من نطاق طرف ثالث مُدرج في قائمة تصفية أداة حجب الإعلانات. يحجب uBlock Origin في الوضع المتوسط أو الصارم معظم نصوص البصمة المعروفة من خدمات التتبع التجارية. مع ذلك، النصوص الطرف الأول — المُحمَّلة من نفس نطاق الموقع — لا تُحجب بواسطة أدوات حجب الإعلانات على مستوى الشبكة. التقنية نفسها (قراءة مخرجات بكسل WebGL) قدرة متصفح قياسية لا ثغرة أمنية، لذا لا يمكن حجبها بالتصفية على مستوى الشبكة وحدها.

هل هذا هو نفس الأسلوب الموصوف في ورقة "Rendered Private"؟

نعم. تتناول ورقة USENIX Security لعام 2019 "Rendered Private: Making GLSL Execution Uniform to Prevent WebGL-based Browser Fingerprinting" لـ Wu وLi وCao وWang مباشرةً بصمة هاش بكسل WebGL. يُعيد تخفيفهم المقترح UNIGL كتابة كود GLSL shader المصدر على مستوى المتصفح لجعل مخرجات الرسم موحدة عبر أجهزة مختلفة. تظل الورقة المعالجة الأكاديمية الأشمل لكل من الهجوم والدفاعات المحتملة.

مقالات ذات صلة

تحقق من عنوان IP وموقعك ودرجة الخصوصية — فوراً.

صفر سجلات. صفر تتبع. صفر APIs خارجية.

ابدأ الفحص الآن →

مقالات ذات صلة

ما هو WebGL Pixel Hash؟ هاش GPU وبصمة المتصفح | whatsmy.fyi