Commit fa918a4f authored by Pier Angelo Vendrame's avatar Pier Angelo Vendrame 🎃 Committed by Beatriz Rizental
Browse files

Bug 1840385 - Do not spoof the OS in HTTP User Agent. r=tjr

parent d5c41cb7
Loading
Loading
Loading
Loading
+10 −25
Original line number Diff line number Diff line
@@ -107,20 +107,13 @@ const DEFAULT_UA_OS = {
  other: `X11; Linux ${defaultLinuxCpu}`,
};

const SPOOFED_UA_NAVIGATOR_OS = {
const SPOOFED_UA_OS = {
  linux: "X11; Linux x86_64",
  win: "Windows NT 10.0; Win64; x64",
  macosx: "Macintosh; Intel Mac OS X 10.15",
  android: "Android 10; Mobile",
  other: "X11; Linux x86_64",
};
const SPOOFED_UA_HTTPHEADER_OS = {
  linux: "Windows NT 10.0",
  win: "Windows NT 10.0",
  macosx: "Windows NT 10.0",
  android: "Android 10; Mobile",
  other: "Windows NT 10.0",
};
const SPOOFED_HW_CONCURRENCY = 2;

const CONST_APPCODENAME = "Mozilla";
@@ -169,7 +162,7 @@ async function testUserAgentHeader() {

  is(
    result,
    expectedResults.userAgentHeader,
    expectedResults.userAgent,
    `Checking ${expectedResults.testDesc} User Agent HTTP Header.`
  );

@@ -203,7 +196,7 @@ async function testNavigator() {
  );
  is(
    result.userAgent,
    expectedResults.userAgentNavigator,
    expectedResults.userAgent,
    `Checking ${testDesc} navigator.userAgent.`
  );
  is(
@@ -308,7 +301,7 @@ async function testWorkerNavigator() {
  );
  is(
    result.userAgent,
    expectedResults.userAgentNavigator,
    expectedResults.userAgent,
    `Checking ${testDesc} worker navigator.userAgent.`
  );
  is(
@@ -364,8 +357,7 @@ add_task(async function setupDefaultUserAgent() {
    oscpu: DEFAULT_OSCPU[AppConstants.platform],
    platform: DEFAULT_PLATFORM[AppConstants.platform],
    pluginsLength: 5,
    userAgentNavigator: defaultUserAgent,
    userAgentHeader: defaultUserAgent,
    userAgent: defaultUserAgent,
  };

  await testNavigator();
@@ -397,8 +389,7 @@ add_task(async function setupRFPExemptions() {
    oscpu: DEFAULT_OSCPU[AppConstants.platform],
    platform: DEFAULT_PLATFORM[AppConstants.platform],
    pluginsLength: 5,
    userAgentNavigator: defaultUserAgent,
    userAgentHeader: defaultUserAgent,
    userAgent: defaultUserAgent,
  };

  await testNavigator();
@@ -447,8 +438,7 @@ add_task(async function setupETPToggleExemptions() {
    oscpu: DEFAULT_OSCPU[AppConstants.platform],
    platform: DEFAULT_PLATFORM[AppConstants.platform],
    pluginsLength: 5,
    userAgentNavigator: defaultUserAgent,
    userAgentHeader: defaultUserAgent,
    userAgent: defaultUserAgent,
  };

  await testNavigator();
@@ -482,12 +472,8 @@ add_task(async function setupResistFingerprinting() {

  let spoofedGeckoTrail = SPOOFED_UA_GECKO_TRAIL[AppConstants.platform];

  let spoofedUserAgentNavigator = `Mozilla/5.0 (${
    SPOOFED_UA_NAVIGATOR_OS[AppConstants.platform]
  }; rv:${appVersion}.0) Gecko/${spoofedGeckoTrail} Firefox/${appVersion}.0`;

  let spoofedUserAgentHeader = `Mozilla/5.0 (${
    SPOOFED_UA_HTTPHEADER_OS[AppConstants.platform]
  let spoofedUserAgent = `Mozilla/5.0 (${
    SPOOFED_UA_OS[AppConstants.platform]
  }; rv:${appVersion}.0) Gecko/${spoofedGeckoTrail} Firefox/${appVersion}.0`;

  expectedResults = {
@@ -498,8 +484,7 @@ add_task(async function setupResistFingerprinting() {
    oscpu: SPOOFED_OSCPU[AppConstants.platform],
    platform: SPOOFED_PLATFORM[AppConstants.platform],
    pluginsLength: 5,
    userAgentNavigator: spoofedUserAgentNavigator,
    userAgentHeader: spoofedUserAgentHeader,
    userAgent: spoofedUserAgent,
  };

  await testNavigator();
+13 −31
Original line number Diff line number Diff line
@@ -122,20 +122,13 @@ const DEFAULT_UA_OS = {
  other: `X11; Linux ${defaultLinuxCpu}`,
};

const SPOOFED_UA_NAVIGATOR_OS = {
const SPOOFED_UA_OS = {
  linux: "X11; Linux x86_64",
  win: "Windows NT 10.0; Win64; x64",
  macosx: "Macintosh; Intel Mac OS X 10.15",
  android: "Android 10; Mobile",
  other: "X11; Linux x86_64",
};
const SPOOFED_UA_HTTPHEADER_OS = {
  linux: "Windows NT 10.0",
  win: "Windows NT 10.0",
  macosx: "Windows NT 10.0",
  android: "Android 10; Mobile",
  other: "Windows NT 10.0",
};
const SPOOFED_HW_CONCURRENCY = 2;

const CONST_APPCODENAME = "Mozilla";
@@ -186,12 +179,12 @@ async function testNavigator(result, expectedResults, extraData) {
  );
  is(
    result.userAgent,
    expectedResults.userAgentNavigator,
    expectedResults.userAgent,
    `Checking ${testDesc} navigator.userAgent.`
  );
  is(
    result.userAgentHTTPHeader,
    expectedResults.userAgentHTTPHeader,
    expectedResults.userAgent,
    `Checking ${testDesc} userAgentHTTPHeader.`
  );
  is(
@@ -268,7 +261,7 @@ async function testNavigator(result, expectedResults, extraData) {
  );
  is(
    result.worker_userAgent,
    expectedResults.userAgentNavigator,
    expectedResults.userAgent,
    `Checking ${testDesc} worker navigator.userAgent.`
  );
  is(
@@ -295,8 +288,7 @@ async function testNavigator(result, expectedResults, extraData) {
}

let defaultUserAgent;
let spoofedUserAgentNavigator;
let spoofedUserAgentHeader;
let spoofedUserAgent;
let allNotSpoofed;
let allSpoofed;

@@ -308,14 +300,8 @@ add_setup(async () => {
    DEFAULT_UA_GECKO_TRAIL[AppConstants.platform]
  } Firefox/${appVersion}.0`;

  spoofedUserAgentNavigator = `Mozilla/5.0 (${
    SPOOFED_UA_NAVIGATOR_OS[AppConstants.platform]
  }; rv:${appVersion}.0) Gecko/${
    SPOOFED_UA_GECKO_TRAIL[AppConstants.platform]
  } Firefox/${appVersion}.0`;

  spoofedUserAgentHeader = `Mozilla/5.0 (${
    SPOOFED_UA_HTTPHEADER_OS[AppConstants.platform]
  spoofedUserAgent = `Mozilla/5.0 (${
    SPOOFED_UA_OS[AppConstants.platform]
  }; rv:${appVersion}.0) Gecko/${
    SPOOFED_UA_GECKO_TRAIL[AppConstants.platform]
  } Firefox/${appVersion}.0`;
@@ -331,8 +317,7 @@ add_setup(async () => {
    oscpu: DEFAULT_OSCPU[AppConstants.platform],
    platform: DEFAULT_PLATFORM[AppConstants.platform],
    pluginsLength: 5,
    userAgentNavigator: defaultUserAgent,
    userAgentHTTPHeader: defaultUserAgent,
    userAgent: defaultUserAgent,
    framer_crossOrigin_userAgentHTTPHeader: defaultUserAgent,
    framee_crossOrigin_userAgentHTTPHeader: defaultUserAgent,
  };
@@ -343,10 +328,9 @@ add_setup(async () => {
    oscpu: SPOOFED_OSCPU[AppConstants.platform],
    platform: SPOOFED_PLATFORM[AppConstants.platform],
    pluginsLength: 5,
    userAgentNavigator: spoofedUserAgentNavigator,
    userAgentHTTPHeader: spoofedUserAgentHeader,
    framer_crossOrigin_userAgentHTTPHeader: spoofedUserAgentHeader,
    framee_crossOrigin_userAgentHTTPHeader: spoofedUserAgentHeader,
    userAgent: spoofedUserAgent,
    framer_crossOrigin_userAgentHTTPHeader: spoofedUserAgent,
    framee_crossOrigin_userAgentHTTPHeader: spoofedUserAgent,
  };
});

@@ -385,8 +369,7 @@ add_task(async () => {
add_task(async () => {
  expectedResults = structuredClone(allSpoofed);
  expectedResults.framer_crossOrigin_userAgentHTTPHeader = defaultUserAgent;
  expectedResults.framee_crossOrigin_userAgentHTTPHeader =
    spoofedUserAgentHeader;
  expectedResults.framee_crossOrigin_userAgentHTTPHeader = spoofedUserAgent;
  await testC(uri, testNavigator, expectedResults);
});

@@ -394,8 +377,7 @@ add_task(async () => {
add_task(async () => {
  expectedResults = structuredClone(allSpoofed);
  expectedResults.framer_crossOrigin_userAgentHTTPHeader = defaultUserAgent;
  expectedResults.framee_crossOrigin_userAgentHTTPHeader =
    spoofedUserAgentHeader;
  expectedResults.framee_crossOrigin_userAgentHTTPHeader = spoofedUserAgent;
  await testD(uri, testNavigator, expectedResults);
});

+1 −1
Original line number Diff line number Diff line
@@ -2112,7 +2112,7 @@ nsresult Navigator::GetUserAgent(nsPIDOMWindowInner* aWindow,
  // specific OS version, etc.
  if (shouldResistFingerprinting) {
    nsAutoCString spoofedUA;
    nsRFPService::GetSpoofedUserAgent(spoofedUA, false);
    nsRFPService::GetSpoofedUserAgent(spoofedUA);
    CopyASCIItoUTF16(spoofedUA, aUserAgent);
    return NS_OK;
  }
+1 −1
Original line number Diff line number Diff line
@@ -411,7 +411,7 @@ nsresult nsHttpHandler::Init() {
  mMisc.AssignLiteral("rv:" MOZILLA_UAVERSION);

  // Generate the spoofed User Agent for fingerprinting resistance.
  nsRFPService::GetSpoofedUserAgent(mSpoofedUserAgent, true);
  nsRFPService::GetSpoofedUserAgent(mSpoofedUserAgent);

  mSessionStartTime = NowInSeconds();
  mHandlerActive = true;
+4 −16
Original line number Diff line number Diff line
@@ -895,8 +895,7 @@ uint32_t nsRFPService::GetSpoofedPresentedFrames(double aTime, uint32_t aWidth,
// User-Agent/Version Stuff

/* static */
void nsRFPService::GetSpoofedUserAgent(nsACString& userAgent,
                                       bool isForHTTPHeader) {
void nsRFPService::GetSpoofedUserAgent(nsACString& userAgent) {
  // This function generates the spoofed value of User Agent.
  // We spoof the values of the platform and Firefox version, which could be
  // used as fingerprinting sources to identify individuals.
@@ -907,30 +906,19 @@ void nsRFPService::GetSpoofedUserAgent(nsACString& userAgent,
  // These magic numbers are the lengths of the UA string literals below.
  // Assume three-digit Firefox version numbers so we have room to grow.
  size_t preallocatedLength =
      13 +
      (isForHTTPHeader ? mozilla::ArrayLength(SPOOFED_HTTP_UA_OS)
                       : mozilla::ArrayLength(SPOOFED_UA_OS)) -
      1 + 5 + 3 + 10 + mozilla::ArrayLength(LEGACY_UA_GECKO_TRAIL) - 1 + 9 + 3 +
      2;
      13 + mozilla::ArrayLength(SPOOFED_UA_OS) - 1 + 5 + 3 + 10 +
      mozilla::ArrayLength(LEGACY_UA_GECKO_TRAIL) - 1 + 9 + 3 + 2;
  userAgent.SetCapacity(preallocatedLength);

  // "Mozilla/5.0 (%s; rv:%d.0) Gecko/%d Firefox/%d.0"
  userAgent.AssignLiteral("Mozilla/5.0 (");

  if (isForHTTPHeader) {
    userAgent.AppendLiteral(SPOOFED_HTTP_UA_OS);
  } else {
  userAgent.AppendLiteral(SPOOFED_UA_OS);
  }

  userAgent.AppendLiteral("; rv:" MOZILLA_UAVERSION ") Gecko/");

#if defined(ANDROID)
  userAgent.AppendLiteral(MOZILLA_UAVERSION);
#else
  userAgent.AppendLiteral(LEGACY_UA_GECKO_TRAIL);
#endif

  userAgent.AppendLiteral(" Firefox/" MOZILLA_UAVERSION);

  MOZ_ASSERT(userAgent.Length() <= preallocatedLength);
Loading