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:
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 {