tor-browser

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

commit 77a7566252f4d7b36c1f1fa5ae7e77dde870c044
parent 89363ce08073060b586633f4d70ab781322d5199
Author: Tom Ritter <tom@mozilla.com>
Date:   Tue,  9 Dec 2025 16:34:58 +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:
Mdocshell/shistory/ChildSHistory.cpp | 1+
Mjs/xpconnect/loader/mozJSModuleLoader.cpp | 1+
Mtoolkit/components/antitracking/ContentBlockingNotifier.h | 21---------------------
Mtoolkit/components/resistfingerprinting/nsRFPIPCUtils.h | 8++++++++
Mtoolkit/components/resistfingerprinting/nsRFPService.cpp | 63+++++++++++++++++++++++++++++++++++++++------------------------
Mtoolkit/components/resistfingerprinting/nsRFPService.h | 28+++++++++++++++++++++++++++-
Mwidget/cocoa/nsCocoaWindow.mm | 1+
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"