شرح بصمة TLS وتجزئات JA4
لماذا تُعدّ رسائل TLS Client Hello منجمًا لتحديد هوية الأجهزة، وكيف تمنحنا تجزئات JA4 بصمة ثابتة تصمد أمام تحديثات المتصفح.
يبدأ كل اتصال HTTPS بـمصافحة TLS، وتبدأ كل مصافحة TLS برسالة Client Hello. تحتوي هذه الرسالة على كمّ وفير من المعلومات عن العميل المتصل — مجموعات التشفير، والامتدادات، والمنحنيات المدعومة، وخوارزميات التوقيع — وهي تتباين بشكل كبير بين المتصفحات والإصدارات وأنظمة التشغيل. تلتقط بصمة TLS هذه المعلومات وتستخدمها كإشارة لتحديد الهوية.
ماذا يوجد في رسالة Client Hello؟
عندما يتصل متصفح بخادم HTTPS، يرسل رسالة Client Hello تحتوي على: إصدار TLS الذي يدعمه، وقائمة مجموعات التشفير التي يرغب في استخدامها، وامتدادات TLS التي يضمّنها (مثل SNI وALPN وkey share)، والمنحنيات الإهليلجية التي يدعمها، وخوارزميات التوقيع التي يقبلها، وأساليب الضغط التي يعرضها.
لكل عائلة متصفحات بصمة مميّزة. فكل من Chrome وFirefox وSafari يرسل ترتيبات مختلفة لمجموعات التشفير، ومجموعات مختلفة من الامتدادات، وتفضيلات مختلفة للمنحنيات. وحتى ضمن عائلة المتصفح نفسها، قد ترسل إصدارات مختلفة رسائل Client Hello مختلفة قليلًا مع إضافة مجموعات التشفير أو إيقافها.
من JA3 إلى JA4
كانت JA3 هي تجزئة بصمة TLS الأصلية، وقد قدّمتها Salesforce عام 2017. فهي تدمج إصدار TLS ومجموعات التشفير والامتدادات والمنحنيات الإهليلجية وصيغ نقاط EC في سلسلة نصية ثم تحسب لها تجزئة MD5. ورغم أنها كانت ثورية، فإن JA3 لها حدودها: فهي تُنتج تجزئة مبهمة واحدة يصعب تحليلها، كما أن أي تغيير طفيف في أي حقل يُنتج تجزئة مختلفة تمامًا.
أما JA4، التي قدّمتها FoxIO عام 2023، فتحسّن JA3 بعدة طرق. فهي تُنتج بصمة منظّمة من ثلاثة مكوّنات: بادئة قابلة للقراءة البشرية (مثل «t13d1715h2» — TLS 1.3، و17 مجموعة تشفير، و15 امتدادًا، وHTTP/2)، وتجزئة مرتّبة لمجموعات التشفير، وتجزئة مرتّبة للامتدادات. يجعل هذا الهيكل بصمات JA4 قابلة للتحليل بنظرة واحدة مع الحفاظ على الدقة اللازمة لتحديد الهوية.
لماذا تهم بصمات TLS في ذكاء الأجهزة
تكتسب بصمات TLS قيمتها لأنها تُجمع قبل تنفيذ أي JavaScript. فالبوت الذي يزيّف وكيل المستخدم الخاص به، ويزوّر تصيير canvas، ويرقّع خصائص navigator، لا يزال يرسل رسالة Client Hello حقيقية من مكتبة TLS التي يستخدمها فعليًا أيًّا كانت. فإذا قالت رسالة Client Hello «مكتبة crypto/tls في Go» بينما قال وكيل المستخدم «Chrome 124»، فإننا نعلم أن شيئًا ما يُزيَّف.
هذا التحقق المتقاطع بالغ القوة في كشف البوتات. فمعظم أطر الأتمتة — Selenium وPuppeteer وPlaywright — تستخدم حزمة TLS الأصلية للمتصفح، لذا تتطابق بصمات TLS الخاصة بها مع المتصفح الذي تتحكم فيه. لكن عملاء HTTP المخصّصين، وأدوات الكشط المبنية على Go، ونصوص Python البرمجية التي تستخدم مكتبة requests، جميعها لها بصمات TLS مميّزة تحدّدها فورًا كعملاء غير متصفحين.
ثبات بصمة TLS
من الشواغل المتعلقة ببصمة TLS ثباتها عبر تحديثات المتصفح. فعندما يضيف Chrome مجموعة تشفير أو يزيلها، تتغيّر بصمة TLS. لكن هذا يحدث عمليًا بوتيرة أقل مما قد تتوقّع. فقائمة مجموعات التشفير في Chrome ثابتة نسبيًا — إذ تحدث التغييرات الكبرى مرة أو مرتين في السنة، لا مع كل إصدار.
يساعد التنسيق المنظّم في JA4 هنا. فالبادئة القابلة للقراءة البشرية تبقى ثابتة عبر تغييرات الإصدارات الطفيفة (لا يتغيّر عدد مجموعات التشفير والامتدادات كثيرًا)، لذا حتى عندما تتغيّر التجزئة التفصيلية، توفّر البادئة استمرارية. في نظام تحديد الهوية متعدّد المستويات لدينا، تُوضع بيانات بصمة TLS في المستوى الثاني — ثابتة بما يكفي للمساهمة في تحديد الهوية، لكنها تُعالَج عبر المطابقة بين الجلسات للتعامل مع الانزياح المتوقّع.
الجمع من جهة الخادم
على عكس الإشارات من جهة العميل التي تتطلّب تنفيذ JavaScript، تُجمع بصمات TLS بالكامل من جهة الخادم. تفحص خوادمنا الطرفية مصافحة TLS الخام وتستخرج رسالة Client Hello قبل إنشاء الاتصال. وهذا يعني أن بصمة TLS تعمل حتى عندما يكون JavaScript محظورًا، أو عندما تكون هناك امتدادات خصوصية مثبّتة في المتصفح، أو عندما لا يكون العميل متصفحًا على الإطلاق.
كما تجعل هذه الطبيعة الخادمية بصمات TLS مقاومة للتزييف. فمع أنه من الممكن نظريًا صياغة رسالة TLS Client Hello مخصّصة تحاكي متصفحًا معيّنًا، فإن القيام بذلك يتطلّب تنفيذ TLS على مستوى منخفض — وهو جهد أكبر بكثير من تغيير سلسلة وكيل المستخدم. ومعظم أدوات التزييف لا تحاول ذلك.
التكامل مع تحديد هوية الجهاز
في محرّك تحديد هوية الأجهزة لدينا، تعمل بصمة TLS كإشارة ومُتحقِّق في آن واحد. فكإشارة، تسهم في بصمة الجهاز الإجمالية بوزنها الخاص في تحديد الهوية. وكمُتحقِّق، توفّر تحقّقًا متقاطعًا مقابل هوية المتصفح المُعلنة. فإذا قالت إشارات JavaScript «Chrome على macOS» بينما قالت بصمة TLS «Firefox على Linux»، فإن هذا التناقض يُطلق علامة عبث في تحليل Smart Signals لدينا.