טביעת אצבע של 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 כלשהו. בוט שמתחזה ב-user agent שלו, מזייף את עיבוד ה-canvas שלו ומתקן את מאפייני ה-navigator שלו — עדיין שולח הודעת Client Hello אותנטית מספריית ה-TLS שהוא באמת משתמש בה. אם ה-Client Hello אומר "ספריית crypto/tls של Go" אבל ה-user agent אומר "Chrome 124", אנחנו יודעים שמשהו מזויף.
אימות צולב זה עוצמתי במיוחד לזיהוי בוטים. רוב מסגרות האוטומציה — Selenium, Puppeteer, Playwright — משתמשות במחסנית ה-TLS המקורית של הדפדפן, ולכן טביעות האצבע של TLS שלהן תואמות את הדפדפן שהן שולטות בו. אך לקוחות HTTP מותאמים אישית, סורקים מבוססי Go וסקריפטים ב-Python המשתמשים בספריית requests — כולם בעלי טביעות אצבע ייחודיות של TLS שמזהות אותם מיד כלקוחות שאינם דפדפן.
יציבות של טביעת אצבע TLS
חשש אחד בטביעת אצבע של TLS הוא היציבות לאורך עדכוני דפדפן. כאשר Chrome מוסיף או מסיר חבילת צפנים, טביעת האצבע של TLS משתנה. בפועל, זה קורה בתדירות נמוכה יותר ממה שאפשר לצפות. רשימת חבילות הצפנים של Chrome יציבה יחסית — שינויים משמעותיים מתרחשים פעם או פעמיים בשנה, לא בכל גרסה.
התבנית המובנית של JA4 עוזרת כאן. התחילית הקריאה לבני אדם נשארת יציבה לאורך שינויי גרסה משניים (מספר חבילות הצפנים וההרחבות אינו משתנה לעיתים קרובות), כך שגם כאשר הגיבוב המפורט משתנה, התחילית מספקת המשכיות. במערכת הזיהוי הרב-שכבתית שלנו, נתוני טביעת האצבע של TLS ממוקמים ברמה 2 (Tier 2) — יציבים מספיק כדי לתרום לזיהוי, אך מעובדים דרך התאמה בין הפעלות (cross-session) כדי להתמודד עם סחיפה צפויה.
איסוף בצד השרת
בניגוד לאותות בצד הלקוח הדורשים הרצת JavaScript, טביעות אצבע של TLS נאספות כולן בצד השרת. שרתי הקצה שלנו בוחנים את לחיצת היד הגולמית של TLS ומחלצים את ה-Client Hello לפני שהחיבור נוצר. משמעות הדבר היא שטביעת אצבע של TLS פועלת גם כאשר JavaScript חסום, כאשר בדפדפן מותקנות הרחבות פרטיות, או כאשר הלקוח אינו דפדפן כלל.
אופי זה של איסוף בצד השרת גם הופך את טביעות האצבע של TLS לעמידות בפני התחזות. אף שמבחינה תיאורטית ניתן ליצור Client Hello מותאם אישית של TLS המחקה דפדפן ספציפי, לעשות זאת דורש מימוש TLS ברמה נמוכה — הרבה יותר מאמץ משינוי מחרוזת user agent. רוב כלי ההתחזות אינם מנסים זאת.
שילוב עם זיהוי מכשירים
במנוע זיהוי המכשירים שלנו, טביעת האצבע של TLS משמשת גם כאות וגם כמאמת. כאות, היא תורמת לטביעת האצבע הכוללת של המכשיר עם משקל זיהוי משלה. כמאמת, היא מספקת בדיקה צולבת מול זהות הדפדפן המוצהרת. אם אותות ה-JavaScript אומרים "Chrome ב-macOS" אבל טביעת האצבע של TLS אומרת "Firefox ב-Linux", הפער מפעיל דגל חבלה בניתוח Smart Signals שלנו.