بصمة Canvas بعد الأساسيات: لماذا يرسم متصفحان Chrome متطابقان بكسلات مختلفة
جهازان بنفس Chrome ونظام التشغيل وبطاقة الرسوميات يُنتجان بكسلات canvas مختلفة. لماذا خط أنابيب العرض غير حتمي، ولماذا يأتي حقن الضوضاء بنتائج عكسية، وأين يقع canvas ضمن منظومة كشف حديثة.
تُستخدَم بصمة canvas في الإنتاج منذ عام 2012. الفكرة مباشِرة: اطلب من المتصفح أن يعرض محتوى ثنائي الأبعاد، ثم اقرأ البكسلات مرة أخرى واحسب لها بصمة (hash). تُنتج الأجهزة المختلفة بكسلات مختلفة قليلًا لنفس التعليمات، وهذه الفروق مستقرة بما يكفي للتعرف على الجهاز عبر الجلسات.
هذا القدر معروف جيدًا. الأقل فهمًا هو لماذا تنجح هذه التقنية — لماذا تُنتج التهيئات البرمجية المتطابقة على أجهزة متطابقة مخرجات بكسلات مختلفة رغم ذلك. تكمن الإجابة عند تقاطع مشغّلات GPU وعرض الخطوط وحساب الفاصلة العائمة.
خط أنابيب العرض ليس حتميًا
عندما تستدعي JavaScript الأمر context.fillText("Cwm fjord bank glyphs vext quiz", 4, 45)، فإن Chrome لا يعرض البكسلات بنفسه. بل يولّد تعليمات لـ Skia — مكتبة الرسوميات ثنائية الأبعاد — التي بدورها تُصدر أوامر الرسم إلى خلفية معجَّلة بواسطة GPU (عادةً ANGLE على Windows، وMetal على macOS، أو العرض البرمجي الاحتياطي داخل الحاويات).
عند كل خطوة، تتراكم فروق تنفيذية صغيرة:
-
يختار نظام الخطوط الفرعي في Skia عائلة خط. إذا لم يكن Arial مثبَّتًا، فإنه يلجأ إلى بديل — والبديل يتباين تبعًا للخطوط المثبَّتة على النظام.
-
يُعرَض الخط المختار بالحجم المطلوب باستخدام FreeType (على Linux)، أو DirectWrite (على Windows)، أو Core Text (على macOS). ولكل مكتبة خوارزميات تلميح (hinting) مختلفة.
-
يُطبَّق تحديد المواضع بالبكسل الفرعي. هنا تبدأ الخطوط المتطابقة في إنتاج بكسلات مختلفة — إذ تقرّب الخوارزمية المواضع إلى إزاحات بكسلية كسرية، وقواعد التقريب تختلف بين المنصات.
-
يُركَّب النص المُنقَّط على canvas. يُجرى المزج باستخدام مظلِّلات GPU على الأنظمة المعجَّلة عتاديًا، وبواسطة كود CPU في وضع العرض الاحتياطي.
يمكن لكل خطوة من هذه الخطوات أن تُدخِل فروقًا بمقدار قيمة بكسل واحدة أو اثنتين. غير مرئية بمفردها. فريدة مجتمعةً.
إصدارات مشغّل GPU تهيمن على البصمة
يمكن لجهازَي Windows 11 مزوَّدين بشريحتَي Intel UHD Graphics 620 أن يُنتجا مخرجات canvas مختلفة إذا اختلفت مشغّلات GPU لديهما. تُصدر Intel تحديثات مشغّل عدة مرات في السنة، ويمكن لكل تحديث أن يغيّر ترشيح البكسل الفرعي وتصحيح جاما وتنعيم حواف النص.
هذا يعني أن استقرار بصمة canvas محدود بتواتر تحديثات المشغّل. فالمستخدم الذي يرقّي مشغّل الرسوميات لديه — غالبًا بصمت، عبر Windows Update — سيرى بصمة canvas الخاصة به تتغيّر.
تتعامل أنظمة الكشف مع هذا بمعاملة بصمة canvas كإشارة من إشارات عديدة، لا كمعرّف قائم بذاته. فعندما تتغيّر بينما تبقى الإشارات الأخرى مستقرة (بصمة TLS، وباعث WebGL، والمنطقة الزمنية، والخطوط المثبَّتة)، يظل الزائر معروفًا.
عرض الرموز التعبيرية منجم ذهب
العنصر الأكثر تمييزًا للهوية في بصمة canvas غالبًا ليس النص أو الأشكال بل الرموز التعبيرية (emoji). يعتمد عرض الرموز التعبيرية على خط الرموز التعبيرية المُرفَق بنظام التشغيل — Segoe UI Emoji على Windows، وApple Color Emoji على macOS، وNoto Color Emoji على Android.
وحتى داخل نظام تشغيل واحد، يتغيّر عرض الرموز التعبيرية عبر الإصدارات. فطريقة عرض Windows 10 لرمز قوس قزح تختلف عن طريقة عرض Windows 11. وتنعيم حواف وجه iOS 16 المبتسم يختلف عن iOS 17.
تعرض سكربتات بصمة canvas الحديثة على وجه التحديد تسلسلات من الرموز التعبيرية بما فيها الإضافات الجديدة إلى Unicode. فالزائر الذي يدّعي تشغيل Safari على iPhone بينما يعجز عن عرض رمز تعبيري أُضيف في iOS 17 يشغّل إصدار iOS أقدم — أو يكذب بشأن المنصة.
أُطر الأتمتة تُنتج بصمات مميِّزة
يستخدم Chrome بلا واجهة (headless)، وهو يعمل داخل حاوية Docker من دون GPU، محرك SwiftShader للعرض. يُنتج SwiftShader مخرجات canvas متسقة داخليًا لكنها متمايزة عن أي Chrome معجَّل عتاديًا.
التوقيع قابل للتمييز: تنعيم حواف نظيف على نحو غير معتاد، وقيم ألوان محددة في مناطق التدرّج، وحواف نص لا تطابق أي مشغّل GPU معروف. فبصمة canvas التي تطابق SwiftShader في Chrome 124 داخل حاوية Linux هي على الأرجح أتمتة — فلا مستخدم حقيقي يشغّل متصفحًا بهذه الطريقة.
يحاول Puppeteer-extra-stealth انتحال مخرَج canvas عبر اعتراض toDataURL() وإعادة بيانات مُعدَّلة. لكن التعديل غالبًا يُدخِل آثارًا خاصة به — أنماط ضوضاء تتكرر عبر الجلسات، ما يجعل جهد مقاومة البصمة بشكل متناقض أسهل كشفًا من عدم فعل أي شيء.
لماذا لا يعمل حقن الضوضاء جيدًا
تحقن المتصفحات المركّزة على الخصوصية مثل Brave ضوضاء في مخرَج canvas لمنع التتبّع. الفكرة هي إضافة تغييرات عشوائية صغيرة إلى قيم البكسل بحيث يُنتج الجهاز نفسه بصمات مختلفة في كل جلسة.
في الممارسة، لدى حقن الضوضاء ثلاث مشكلات:
1. الضوضاء نفسها بصمة. فالزائر الذي يتغيّر مخرَج canvas لديه في كل تحميل بينما تبقى إشاراته الأخرى متطابقة يمكن تمييزه بوصفه متصفحًا يحقن ضوضاء. وهذا في حد ذاته مميِّز للهوية.
2. خوارزمية الضوضاء مستقرة. فتنفيذ Brave يُنتج أنماط ضوضاء محددة لا تطابق التباين الطبيعي لعرض GPU. وتستطيع أنظمة الكشف تمييز مخرجات canvas التي تبدو محقونة بالضوضاء عن تلك التي تبدو طبيعية.
3. الأنظمة المتطورة تجمع العيّنات. فيمكن حساب متوسط عدة عمليات عرض على الصفحة نفسها، أو عبر الجلسات. وإذا كانت الضوضاء صغيرة، فإن المتوسط يتقارب نحو البصمة الحتمية الكامنة.
ماذا تلتقط بصمة canvas
إلى جانب المخرَج البصري الواضح، تستطيع بصمة canvas استخلاص عدة خصائص للجهاز كآثار جانبية:
زمن العرض — المدة التي يستغرقها canvas في العرض تكشف قدرة GPU. فسطح مكتب بدقة 4K مزوَّد ببطاقة رسوميات منفصلة يعرض أسرع من حاسوب محمول متوسط الفئة.
قياسات النص — يُعيد measureText() عروضًا بالبكسل دقيقة تتباين تبعًا لعرض الخط. ويمكن استخدام عرض النص كبصمة حتى من دون عرض.
دعم عمليات التركيب — تدعم بعض المتصفحات أو تهيئات GPU أوضاع تركيب موسَّعة. واختبار الدعم يكشف حدود القدرات.
تأثيرات المرشِّحات — تُنتج المرشِّحات على طراز CSS المطبَّقة على canvas مخرجات مختلفة عبر بطاقات GPU، وبخاصة مرشِّحات التمويه (blur) والظل المُسقَط (drop-shadow).
أين تقع بصمة canvas ضمن منظومة الكشف
بمفردها، بصمة canvas ليست معرّفًا متينًا. فالمشغّلات تتغيّر. والمستخدمون يبدّلون المتصفحات. وحقن الضوضاء شائع لدى الجماهير المركّزة على الخصوصية.
قوتها الحقيقية تكمن في كونها تحققًا متقاطعًا. فعندما تدّعي جلسة أنها لمستخدم عائد استنادًا إلى ملفات تعريف الارتباط أو تسجيل الدخول إلى الحساب، تعمل بصمة canvas كإشارة ثانية — فمطابقتها للبصمة التاريخية تؤكد الادعاء، وعدم مطابقتها تُبلِّغ عن استيلاء على الحساب أو اختطاف جلسة.
في كشف البوتات، تتفوق بصمة canvas في اصطياد الأتمتة داخل الحاويات. فالمستخدمون الحقيقيون لديهم بطاقات GPU حقيقية. والبطاقات الحقيقية تُنتج توقيعات عرض قابلة للتمييز. وأي شيء يعرض مثل SwiftShader، أو مثل canvas منتحَل بشكل رديء، يقع في خانة «بوت على الأرجح».
لا تزال تقنية عام 2012 تعمل في 2026 للسبب نفسه: العرض حتمي لكل بيئة لكن يكاد يكون من المستحيل انتحاله بالكامل. فكل محاولة للاختفاء تترك آثارًا للمحاولة نفسها.