tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 2a597f21c28345e274cc9ace5e52d73539a7fb9c
parent 50ae8c38460620f59bc33d4f596dc44af742f6be
Author: Tom Ritter <tom@mozilla.com>
Date:   Fri, 19 Dec 2025 14:47:58 +0000

Bug 2005273: Add additional known canvas fingerprinting text and aliases r=timhuang

Differential Revision: https://phabricator.services.mozilla.com/D276877

Diffstat:
Mdom/canvas/CanvasRenderingContext2D.cpp | 18++++++++++++------
Mtoolkit/components/resistfingerprinting/nsRFPService.cpp | 14++++++++------
Mtoolkit/components/resistfingerprinting/nsRFPService.h | 8++++++--
3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp @@ -4583,16 +4583,14 @@ void CanvasRenderingContext2D::FillText(const nsAString& aText, double aX, if (mFillTextCalls <= 5) { if (aText == u"Cwm fjordbank glyphs vext quiz, 😃"_ns) { mFeatureUsage |= CanvasFeatureUsage::KnownText_1; - } else if (aText == u"Cwm fjordbank gly 😃"_ns) { - mFeatureUsage |= CanvasFeatureUsage::KnownText_1; } else if (StringBeginsWith(aText, u"Hel$&?6%"_ns)) { - mFeatureUsage |= CanvasFeatureUsage::KnownText_2; + mFeatureUsage |= CanvasFeatureUsage::KnownText_2; // Imperva } else if (StringBeginsWith(aText, u"<@nv45. "_ns)) { mFeatureUsage |= CanvasFeatureUsage::KnownText_3; } else if (aText == u"Cañvas FP 😎 12345"_ns) { mFeatureUsage |= CanvasFeatureUsage::KnownText_4; } else if (StringBeginsWith(aText, u"❤️🤪🎉👋"_ns)) { - mFeatureUsage |= CanvasFeatureUsage::KnownText_5; + mFeatureUsage |= CanvasFeatureUsage::KnownText_5; // hCaptcha } else if (aText == u"SomeCanvasFingerPrint.65@345876"_ns) { mFeatureUsage |= CanvasFeatureUsage::KnownText_6; } else if (aText == u"Browser,Signal <canvas> 2.0"_ns) { @@ -4606,9 +4604,9 @@ void CanvasRenderingContext2D::FillText(const nsAString& aText, double aX, } else if (aText == u"g"_ns) { mFeatureUsage |= CanvasFeatureUsage::KnownText_11; } else if (aText == u"Soft Ruddy Foothold 2"_ns) { - mFeatureUsage |= CanvasFeatureUsage::KnownText_12; + mFeatureUsage |= CanvasFeatureUsage::KnownText_12; // Akamai } else if (aText == u"!H71JCaj)]# 1@#"_ns) { - mFeatureUsage |= CanvasFeatureUsage::KnownText_13; + mFeatureUsage |= CanvasFeatureUsage::KnownText_13; // Akamai } else if (aText == u"oubrg5h56e@!$3t4"_ns) { mFeatureUsage |= CanvasFeatureUsage::KnownText_14; } else if (aText == u"Cwm fjordbank glyphs vext quiz,"_ns) { @@ -4631,6 +4629,14 @@ void CanvasRenderingContext2D::FillText(const nsAString& aText, double aX, mFeatureUsage |= CanvasFeatureUsage::KnownText_23; } else if (aText == u"<@nv45. F1n63r,Pr1n71n6!"_ns) { mFeatureUsage |= CanvasFeatureUsage::KnownText_24; + } else if (aText == u"Cwm fjordbank gly 😃"_ns) { + mFeatureUsage |= CanvasFeatureUsage::KnownText_25; + } else if (aText == u"clientgear.com <canvas> 1.0") { + mFeatureUsage |= CanvasFeatureUsage::KnownText_26; + } else if (aText == u"iO0A🤣💩") { + mFeatureUsage |= CanvasFeatureUsage::KnownText_27; + } else if (aText == u"Ry"_ns) { + mFeatureUsage |= CanvasFeatureUsage::KnownText_28; } } mFillTextCalls++; diff --git a/toolkit/components/resistfingerprinting/nsRFPService.cpp b/toolkit/components/resistfingerprinting/nsRFPService.cpp @@ -2006,10 +2006,14 @@ static const char* CanvasFingerprinterToString( return "Ozoki"; case CanvasFingerprinterAlias::ePerimeterX: return "PerimeterX"; + case CanvasFingerprinterAlias::eClientGear: + return "ClientGear"; case CanvasFingerprinterAlias::eSignifyd: return "Signifyd"; case CanvasFingerprinterAlias::eClaydar: return "Claydar"; + case CanvasFingerprinterAlias::eImperva: + return "Imperva"; case CanvasFingerprinterAlias::eForter: return "Forter"; case CanvasFingerprinterAlias::eVariant1: @@ -2482,6 +2486,10 @@ static void MaybeCurrentCaller(nsACString& aFilename, uint32_t& aLineNum, fingerprinter = CanvasFingerprinterAlias::eClaydar; } else if (accumulatedFeatureUsage & CanvasFeatureUsage::KnownText_23) { fingerprinter = CanvasFingerprinterAlias::eForter; + } else if (accumulatedFeatureUsage & CanvasFeatureUsage::KnownText_2) { + fingerprinter = CanvasFingerprinterAlias::eImperva; + } else if (accumulatedFeatureUsage & CanvasFeatureUsage::KnownText_26) { + fingerprinter = CanvasFingerprinterAlias::eClientGear; } else if (seenExtracted2D_250x80 && accumulatedFeatureUsage & CanvasFeatureUsage::KnownText_6) { fingerprinter = CanvasFingerprinterAlias::eVariant5; @@ -2494,12 +2502,6 @@ static void MaybeCurrentCaller(nsACString& aFilename, uint32_t& aLineNum, fingerprinter = CanvasFingerprinterAlias::eVariant1; } else if (extractedWebGL > 0 && extracted2D > 1 && seenExtracted2D_860x6) { fingerprinter = CanvasFingerprinterAlias::eVariant2; - } else if (extracted2D > 0 && - (accumulatedFeatureUsage & CanvasFeatureUsage::SetFont) && - (accumulatedFeatureUsage & - (CanvasFeatureUsage::FillRect | CanvasFeatureUsage::LineTo | - CanvasFeatureUsage::Stroke))) { - fingerprinter = CanvasFingerprinterAlias::eVariant4; } nsAutoCString uri(aURI); diff --git a/toolkit/components/resistfingerprinting/nsRFPService.h b/toolkit/components/resistfingerprinting/nsRFPService.h @@ -228,7 +228,8 @@ enum CanvasFingerprinterAlias { eSignifyd = 5, eClaydar = 6, eForter = 7, - // Unknown but distinct types of fingerprinters + + // Variants are unknown but distinct types of fingerprinters eVariant1 = 8, eVariant2 = 9, eVariant3 = 10, @@ -237,7 +238,10 @@ enum CanvasFingerprinterAlias { eVariant6 = 13, eVariant7 = 14, eVariant8 = 15, - eLastAlias = eVariant8 + + eClientGear = 16, + eImperva = 17, + eLastAlias = eImperva }; enum CanvasExtractionAPI : uint8_t {