morgan pushed to branch tor-browser-128.2.0esr-14.0-1 at The Tor Project / Applications / Tor Browser
Commits:
-
600fa3e4
by Pier Angelo Vendrame at 2024-08-27T09:53:22+02:00
-
fb25351a
by Fatih at 2024-08-27T09:53:53+02:00
-
365873be
by Fatih at 2024-08-27T09:54:19+02:00
4 changed files:
- browser/components/resistfingerprinting/test/browser/browser.toml
- + browser/components/resistfingerprinting/test/browser/browser_exslt_time_precision.js
- + browser/components/resistfingerprinting/test/browser/browser_exslt_timezone_load.js
- dom/xslt/xslt/txEXSLTFunctions.cpp
Changes:
... | ... | @@ -196,3 +196,7 @@ lineno = "172" |
196 | 196 | |
197 | 197 | ["browser_timezone.js"]
|
198 | 198 | lineno = "176"
|
199 | + |
|
200 | +["browser_exslt_timezone_load.js"]
|
|
201 | + |
|
202 | +["browser_exslt_time_precision.js"] |
1 | +/**
|
|
2 | + * Bug 1912129 - A test case for verifying EXSLT date will report second-precise
|
|
3 | + * time fingerprinting resistance is enabled.
|
|
4 | + */
|
|
5 | + |
|
6 | +function getTime(tab) {
|
|
7 | + const extractTime = function () {
|
|
8 | + const xslText = `
|
|
9 | + <xsl:stylesheet version="1.0"
|
|
10 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
11 | + xmlns:date="http://exslt.org/dates-and-times"
|
|
12 | + extension-element-prefixes="date">
|
|
13 | + <xsl:output method="text" />
|
|
14 | + <xsl:template match="/">
|
|
15 | + <xsl:value-of select="date:date-time()" />
|
|
16 | + </xsl:template>
|
|
17 | + </xsl:stylesheet>`;
|
|
18 | + |
|
19 | + const parser = new DOMParser();
|
|
20 | + const xsltProcessor = new XSLTProcessor();
|
|
21 | + const xslStylesheet = parser.parseFromString(xslText, "application/xml");
|
|
22 | + xsltProcessor.importStylesheet(xslStylesheet);
|
|
23 | + const xmlDoc = parser.parseFromString("<test />", "application/xml");
|
|
24 | + const styledDoc = xsltProcessor.transformToDocument(xmlDoc);
|
|
25 | + const time = styledDoc.firstChild.textContent;
|
|
26 | + |
|
27 | + return time;
|
|
28 | + };
|
|
29 | + |
|
30 | + const extractTimeExpr = `(${extractTime.toString()})();`;
|
|
31 | + |
|
32 | + return SpecialPowers.spawn(
|
|
33 | + tab.linkedBrowser,
|
|
34 | + [extractTimeExpr],
|
|
35 | + async funccode => content.eval(funccode)
|
|
36 | + );
|
|
37 | +}
|
|
38 | + |
|
39 | +add_task(async function test_new_window() {
|
|
40 | + await SpecialPowers.pushPrefEnv({
|
|
41 | + set: [
|
|
42 | + ["privacy.fingerprintingProtection", true],
|
|
43 | + ["privacy.fingerprintingProtection.overrides", "+ReduceTimerPrecision"],
|
|
44 | + ],
|
|
45 | + });
|
|
46 | + |
|
47 | + // Open a tab for extracting the time from XSLT.
|
|
48 | + const tab = await BrowserTestUtils.openNewForegroundTab({
|
|
49 | + gBrowser,
|
|
50 | + opening: TEST_PATH + "file_dummy.html",
|
|
51 | + forceNewProcess: true,
|
|
52 | + });
|
|
53 | + |
|
54 | + for (let i = 0; i < 10; i++) {
|
|
55 | + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
|
56 | + await new Promise(res => setTimeout(res, 25));
|
|
57 | + |
|
58 | + // The regex could be a lot shorter (e.g. /\.(\d{3})/) but I wrote the whole
|
|
59 | + // thing to make sure the time is in the expected format and to allow us
|
|
60 | + // to re-use this regex in the future if we need to.
|
|
61 | + // Note: Date format is not locale dependent.
|
|
62 | + const regex = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.(\d{3})[-+]\d{2}:\d{2}/;
|
|
63 | + const time = await getTime(tab);
|
|
64 | + const [, milliseconds] = time.match(regex);
|
|
65 | + |
|
66 | + is(milliseconds, "000", "Date's precision was reduced to seconds.");
|
|
67 | + }
|
|
68 | + |
|
69 | + BrowserTestUtils.removeTab(tab);
|
|
70 | + await SpecialPowers.popPrefEnv();
|
|
71 | +}); |
1 | +/**
|
|
2 | + * Bug 1891690 - A test case for verifying EXSLT date will use Atlantic/Reykjavik
|
|
3 | + * timezone (GMT and "real" equivalent to UTC) after fingerprinting
|
|
4 | + * resistance is enabled.
|
|
5 | + */
|
|
6 | + |
|
7 | +function getTimeZone(tab) {
|
|
8 | + const extractTime = function () {
|
|
9 | + const xslText = `
|
|
10 | + <xsl:stylesheet version="1.0"
|
|
11 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
12 | + xmlns:date="http://exslt.org/dates-and-times"
|
|
13 | + extension-element-prefixes="date">
|
|
14 | + <xsl:output method="text" />
|
|
15 | + <xsl:template match="/">
|
|
16 | + <xsl:value-of select="date:date-time()" />
|
|
17 | + </xsl:template>
|
|
18 | + </xsl:stylesheet>`;
|
|
19 | + |
|
20 | + const parser = new DOMParser();
|
|
21 | + const xsltProcessor = new XSLTProcessor();
|
|
22 | + const xslStylesheet = parser.parseFromString(xslText, "application/xml");
|
|
23 | + xsltProcessor.importStylesheet(xslStylesheet);
|
|
24 | + const xmlDoc = parser.parseFromString("<test />", "application/xml");
|
|
25 | + const styledDoc = xsltProcessor.transformToDocument(xmlDoc);
|
|
26 | + const time = styledDoc.firstChild.textContent;
|
|
27 | + |
|
28 | + return time;
|
|
29 | + };
|
|
30 | + |
|
31 | + const extractTimeExpr = `(${extractTime.toString()})();`;
|
|
32 | + |
|
33 | + return SpecialPowers.spawn(
|
|
34 | + tab.linkedBrowser,
|
|
35 | + [extractTimeExpr],
|
|
36 | + async funccode => content.eval(funccode)
|
|
37 | + );
|
|
38 | +}
|
|
39 | + |
|
40 | +add_task(async function test_new_window() {
|
|
41 | + await SpecialPowers.pushPrefEnv({
|
|
42 | + set: [
|
|
43 | + ["privacy.fingerprintingProtection", true],
|
|
44 | + ["privacy.fingerprintingProtection.overrides", "+JSDateTimeUTC"],
|
|
45 | + ],
|
|
46 | + });
|
|
47 | + |
|
48 | + // Open a tab for extracting the time zone from XSLT.
|
|
49 | + const tab = await BrowserTestUtils.openNewForegroundTab({
|
|
50 | + gBrowser,
|
|
51 | + opening: TEST_PATH + "file_dummy.html",
|
|
52 | + forceNewProcess: true,
|
|
53 | + });
|
|
54 | + |
|
55 | + SpecialPowers.Cu.getJSTestingFunctions().setTimeZone("America/Toronto");
|
|
56 | + const timeZone = await getTimeZone(tab);
|
|
57 | + |
|
58 | + ok(timeZone.endsWith("+00:00"), "Timezone was spoofed.");
|
|
59 | + |
|
60 | + BrowserTestUtils.removeTab(tab);
|
|
61 | + await SpecialPowers.popPrefEnv();
|
|
62 | +}); |
... | ... | @@ -590,14 +590,22 @@ nsresult txEXSLTFunctionCall::evaluate(txIEvalContext* aContext, |
590 | 590 | // http://exslt.org/date/functions/date-time/
|
591 | 591 | |
592 | 592 | PRExplodedTime prtime;
|
593 | - PR_ExplodeTime(PR_Now(),
|
|
594 | - nsContentUtils::ShouldResistFingerprinting(
|
|
595 | - "We are not allowed to access the document at this "
|
|
596 | - "stage (we are given a txEarlyEvalContext context).",
|
|
597 | - RFPTarget::JSDateTimeUTC)
|
|
598 | - ? PR_GMTParameters
|
|
599 | - : PR_LocalTimeParameters,
|
|
600 | - &prtime);
|
|
593 | + Document* sourceDoc = getSourceDocument(aContext);
|
|
594 | + NS_ENSURE_STATE(sourceDoc);
|
|
595 | + |
|
596 | + PRTimeParamFn timezone =
|
|
597 | + sourceDoc->ShouldResistFingerprinting(RFPTarget::JSDateTimeUTC)
|
|
598 | + ? PR_GMTParameters
|
|
599 | + : PR_LocalTimeParameters;
|
|
600 | + |
|
601 | + PRTime time =
|
|
602 | + sourceDoc->ShouldResistFingerprinting(RFPTarget::ReduceTimerPrecision)
|
|
603 | + ? (PRTime)nsRFPService::ReduceTimePrecisionAsSecs(
|
|
604 | + (double)PR_Now() / PR_USEC_PER_SEC, 0,
|
|
605 | + RTPCallerType::ResistFingerprinting) *
|
|
606 | + PR_USEC_PER_SEC
|
|
607 | + : PR_Now();
|
|
608 | + PR_ExplodeTime(time, timezone, &prtime);
|
|
601 | 609 | |
602 | 610 | int32_t offset =
|
603 | 611 | (prtime.tm_params.tp_gmt_offset + prtime.tm_params.tp_dst_offset) /
|
... | ... | @@ -641,7 +649,7 @@ Expr::ResultType txEXSLTFunctionCall::getReturnType() { |
641 | 649 | |
642 | 650 | bool txEXSLTFunctionCall::isSensitiveTo(ContextSensitivity aContext) {
|
643 | 651 | if (mType == txEXSLTType::NODE_SET || mType == txEXSLTType::SPLIT ||
|
644 | - mType == txEXSLTType::TOKENIZE) {
|
|
652 | + mType == txEXSLTType::TOKENIZE || mType == txEXSLTType::DATE_TIME) {
|
|
645 | 653 | return (aContext & PRIVATE_CONTEXT) || argsSensitiveTo(aContext);
|
646 | 654 | }
|
647 | 655 | return argsSensitiveTo(aContext);
|