commit 8c90d9ae564a073cbdb3be184c60bc166c20c0c4
parent 34a426c6e35d8ea90c79fe0278dc0ae508544762
Author: Tom Ritter <tom@mozilla.com>
Date: Mon, 8 Dec 2025 16:31:01 +0000
Bug 1873716: Move the identifier of a Fingerprinter from AntiTracking to RFP r=timhuang
SKIP_BMO_CHECK
Differential Revision: https://phabricator.services.mozilla.com/D273661
Diffstat:
7 files changed, 77 insertions(+), 46 deletions(-)
diff --git a/docshell/shistory/ChildSHistory.cpp b/docshell/shistory/ChildSHistory.cpp
@@ -9,6 +9,7 @@
#include "mozilla/dom/CanonicalBrowsingContext.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/dom/ContentFrameMessageManager.h"
+#include "mozilla/StaticPrefs_browser.h"
#include "nsIXULRuntime.h"
#include "nsComponentManagerUtils.h"
#include "nsSHEntry.h"
diff --git a/js/xpconnect/loader/mozJSModuleLoader.cpp b/js/xpconnect/loader/mozJSModuleLoader.cpp
@@ -65,6 +65,7 @@
#include "mozilla/ProfilerMarkers.h"
#include "mozilla/ResultExtensions.h"
#include "mozilla/ScriptPreloader.h"
+#include "mozilla/StaticPrefs_browser.h"
#include "mozilla/Try.h"
#include "mozilla/dom/AutoEntryScript.h"
#include "mozilla/dom/ReferrerPolicyBinding.h"
diff --git a/toolkit/components/antitracking/ContentBlockingNotifier.h b/toolkit/components/antitracking/ContentBlockingNotifier.h
@@ -35,27 +35,6 @@ class ContentBlockingNotifier final {
ePrivilegeStorageAccessForOriginAPI,
};
- // We try to classify observed canvas fingerprinting scripts into different
- // classes, but we don't usually know the source/vendor of those scripts. The
- // classification is based on a behavioral analysis, based on type of canvas,
- // the extracted (e.g. toDataURL) size, the usage of functions like fillText
- // etc. See `nsRFPService::MaybeReportCanvasFingerprinter` for the
- // classification heuristic.
- enum CanvasFingerprinter {
- // Suspected fingerprint.com (FingerprintJS)
- eFingerprintJS,
- // Suspected Akamai fingerprinter
- eAkamai,
- // Unknown but distinct types of fingerprinters
- eVariant1,
- eVariant2,
- eVariant3,
- eVariant4,
- // This just indicates that more than one canvas was extracted and is a
- // very weak signal.
- eMaybe
- };
-
// This method can be called on the parent process or on the content process.
// The notification is propagated to the child channel if aChannel is a parent
// channel proxy.
diff --git a/toolkit/components/resistfingerprinting/nsRFPIPCUtils.h b/toolkit/components/resistfingerprinting/nsRFPIPCUtils.h
@@ -13,6 +13,14 @@
namespace IPC {
+// CanvasFingerprinterAlias
+template <>
+struct ParamTraits<mozilla::CanvasFingerprinterAlias>
+ : public ContiguousEnumSerializerInclusive<
+ mozilla::CanvasFingerprinterAlias,
+ mozilla::CanvasFingerprinterAlias::eNoneIdentified,
+ mozilla::CanvasFingerprinterAlias::eMaybe> {};
+
// CanvasFingerprintingEvent
template <>
struct ParamTraits<mozilla::CanvasFingerprintingEvent> {
diff --git a/toolkit/components/resistfingerprinting/nsRFPService.cpp b/toolkit/components/resistfingerprinting/nsRFPService.cpp
@@ -1912,23 +1912,42 @@ nsresult nsRFPService::RandomizeElements(
}
static const char* CanvasFingerprinterToString(
- ContentBlockingNotifier::CanvasFingerprinter aFingerprinter) {
+ CanvasFingerprinterAlias aFingerprinter) {
switch (aFingerprinter) {
- case ContentBlockingNotifier::CanvasFingerprinter::eFingerprintJS:
+ case CanvasFingerprinterAlias::eNoneIdentified:
+ return "(None Identified)";
+ case CanvasFingerprinterAlias::eFingerprintJS:
return "FingerprintJS";
- case ContentBlockingNotifier::CanvasFingerprinter::eAkamai:
+ case CanvasFingerprinterAlias::eAkamai:
return "Akamai";
- case ContentBlockingNotifier::CanvasFingerprinter::eVariant1:
+ case CanvasFingerprinterAlias::eOzoki:
+ return "Ozoki";
+ case CanvasFingerprinterAlias::ePerimeterX:
+ return "PerimeterX";
+ case CanvasFingerprinterAlias::eSignifyd:
+ return "Signifyd";
+ case CanvasFingerprinterAlias::eClaydar:
+ return "Claydar";
+ case CanvasFingerprinterAlias::eForter:
+ return "Forter";
+ case CanvasFingerprinterAlias::eVariant1:
return "Variant1";
- case ContentBlockingNotifier::CanvasFingerprinter::eVariant2:
+ case CanvasFingerprinterAlias::eVariant2:
return "Variant2";
- case ContentBlockingNotifier::CanvasFingerprinter::eVariant3:
+ case CanvasFingerprinterAlias::eVariant3:
return "Variant3";
- case ContentBlockingNotifier::CanvasFingerprinter::eVariant4:
+ case CanvasFingerprinterAlias::eVariant4:
return "Variant4";
- case ContentBlockingNotifier::CanvasFingerprinter::eMaybe:
- return "Maybe";
- }
+ case CanvasFingerprinterAlias::eVariant5:
+ return "Variant5";
+ case CanvasFingerprinterAlias::eVariant6:
+ return "Variant6";
+ case CanvasFingerprinterAlias::eVariant7:
+ return "Variant7";
+ case CanvasFingerprinterAlias::eVariant8:
+ return "Variant8";
+ }
+ MOZ_ASSERT(false, "Unhandled CanvasFingerprinterAlias enum value");
return "<error>";
}
@@ -2004,39 +2023,35 @@ static void MaybeCurrentCaller(nsACString& aFilename, uint32_t& aLineNum,
}
}
- Maybe<ContentBlockingNotifier::CanvasFingerprinter> fingerprinter;
+ CanvasFingerprinterAlias fingerprinter = eNoneIdentified;
+
if (seenExtractedWebGL_300x150 && seenExtracted2D_240x60 &&
seenExtracted2D_122x110) {
- fingerprinter =
- Some(ContentBlockingNotifier::CanvasFingerprinter::eFingerprintJS);
+ fingerprinter = CanvasFingerprinterAlias::eFingerprintJS;
} else if (seenExtractedWebGL_300x150 && seenExtracted2D_280x60 &&
seenExtracted2D_16x16) {
- fingerprinter = Some(ContentBlockingNotifier::CanvasFingerprinter::eAkamai);
+ fingerprinter = CanvasFingerprinterAlias::eAkamai;
} else if (seenExtractedWebGL_300x150 && extracted2D > 0 &&
(featureUsage & CanvasFeatureUsage::SetFont)) {
- fingerprinter =
- Some(ContentBlockingNotifier::CanvasFingerprinter::eVariant1);
+ fingerprinter = CanvasFingerprinterAlias::eVariant1;
} else if (extractedWebGL > 0 && extracted2D > 1 && seenExtracted2D_860x6) {
- fingerprinter =
- Some(ContentBlockingNotifier::CanvasFingerprinter::eVariant2);
+ fingerprinter = CanvasFingerprinterAlias::eVariant2;
} else if (extractedOther > 0 && (extractedWebGL > 0 || extracted2D > 0)) {
- fingerprinter =
- Some(ContentBlockingNotifier::CanvasFingerprinter::eVariant3);
+ fingerprinter = CanvasFingerprinterAlias::eVariant3;
} else if (extracted2D > 0 && (featureUsage & CanvasFeatureUsage::SetFont) &&
(featureUsage &
(CanvasFeatureUsage::FillRect | CanvasFeatureUsage::LineTo |
CanvasFeatureUsage::Stroke))) {
- fingerprinter =
- Some(ContentBlockingNotifier::CanvasFingerprinter::eVariant4);
+ fingerprinter = CanvasFingerprinterAlias::eVariant4;
} else if (extractedOther + extractedWebGL + extracted2D > 1) {
// This I added primarily to not miss anything, but it can cause false
// positives.
- fingerprinter = Some(ContentBlockingNotifier::CanvasFingerprinter::eMaybe);
+ fingerprinter = CanvasFingerprinterAlias::eMaybe;
}
bool knownFingerprintText =
bool(featureUsage & CanvasFeatureUsage::KnownFingerprintText);
- if (!knownFingerprintText && fingerprinter.isNothing()) {
+ if (!knownFingerprintText && fingerprinter == eNoneIdentified) {
return;
}
diff --git a/toolkit/components/resistfingerprinting/nsRFPService.h b/toolkit/components/resistfingerprinting/nsRFPService.h
@@ -11,7 +11,6 @@
#include "ErrorList.h"
#include "PLDHashTable.h"
#include "mozilla/BasicEvents.h"
-#include "mozilla/ContentBlockingLog.h"
#include "mozilla/gfx/Types.h"
#include "mozilla/TypedEnumBits.h"
#include "mozilla/dom/MediaDeviceInfoBinding.h"
@@ -175,6 +174,33 @@ enum class CanvasFeatureUsage : uint8_t {
};
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(CanvasFeatureUsage);
+// We try to classify observed canvas fingerprinting scripts into different
+// classes, but we don't usually know the source/vendor of those scripts. The
+// classification is based on a behavioral analysis covering things like the
+// functions called and size of the canvas. The alias given is a guess and
+// should not be considered definitive. The entity identified may not be doing
+// this behavior at all, they may be doing a diferent or additional behaviors.
+enum CanvasFingerprinterAlias {
+ eNoneIdentified = 0,
+ eFingerprintJS = 1,
+ eAkamai = 2,
+ eOzoki = 3,
+ ePerimeterX = 4,
+ eSignifyd = 5,
+ eClaydar = 6,
+ eForter = 7,
+ // Unknown but distinct types of fingerprinters
+ eVariant1 = 8,
+ eVariant2 = 9,
+ eVariant3 = 10,
+ eVariant4 = 11,
+ eVariant5 = 12,
+ eVariant6 = 13,
+ eVariant7 = 14,
+ eVariant8 = 15,
+ eLastAlias = eVariant8
+};
+
class CanvasUsage {
public:
CSSIntSize mSize;
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
@@ -79,6 +79,7 @@
#include "mozilla/PresShell.h"
#include "mozilla/ScopeExit.h"
#include "mozilla/StaticPrefs_apz.h"
+#include "mozilla/StaticPrefs_browser.h"
#include "mozilla/StaticPrefs_gfx.h"
#include "mozilla/StaticPrefs_general.h"
#include "mozilla/StaticPrefs_ui.h"