Mike Perry commited on 2015-04-30 07:25:35
Zeige 1 geänderte Dateien mit 340 Einfügungen und 226 Löschungen.
... | ... |
@@ -1,9 +1,9 @@ |
1 | 1 |
<?xml version="1.0" encoding="UTF-8"?> |
2 |
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>The Design and Implementation of the Tor Browser [DRAFT]</title><meta name="generator" content="DocBook XSL Stylesheets V1.78.1" /></head><body><div class="article"><div class="titlepage"><div><div><h2 class="title"><a id="design"></a>The Design and Implementation of the Tor Browser [DRAFT]</h2></div><div><div class="author"><h3 class="author"><span class="firstname">Mike</span> <span class="surname">Perry</span></h3><div class="affiliation"><div class="address"><p><code class="email"><<a class="email" href="mailto:mikeperry#torproject org">mikeperry#torproject org</a>></code></p></div></div></div></div><div><div class="author"><h3 class="author"><span class="firstname">Erinn</span> <span class="surname">Clark</span></h3><div class="affiliation"><div class="address"><p><code class="email"><<a class="email" href="mailto:erinn#torproject org">erinn#torproject org</a>></code></p></div></div></div></div><div><div class="author"><h3 class="author"><span class="firstname">Steven</span> <span class="surname">Murdoch</span></h3><div class="affiliation"><div class="address"><p><code class="email"><<a class="email" href="mailto:sjmurdoch#torproject org">sjmurdoch#torproject org</a>></code></p></div></div></div></div><div><p class="pubdate">November 6th, 2014</p></div></div><hr /></div><div class="toc"><p><strong>Table of Contents</strong></p><dl class="toc"><dt><span class="sect1"><a href="#idp59720528">1. Introduction</a></span></dt><dd><dl><dt><span class="sect2"><a href="#components">1.1. Browser Component Overview</a></span></dt></dl></dd><dt><span class="sect1"><a href="#DesignRequirements">2. Design Requirements and Philosophy</a></span></dt><dd><dl><dt><span class="sect2"><a href="#security">2.1. Security Requirements</a></span></dt><dt><span class="sect2"><a href="#privacy">2.2. Privacy Requirements</a></span></dt><dt><span class="sect2"><a href="#philosophy">2.3. Philosophy</a></span></dt></dl></dd><dt><span class="sect1"><a href="#adversary">3. Adversary Model</a></span></dt><dd><dl><dt><span class="sect2"><a href="#adversary-goals">3.1. Adversary Goals</a></span></dt><dt><span class="sect2"><a href="#adversary-positioning">3.2. Adversary Capabilities - Positioning</a></span></dt><dt><span class="sect2"><a href="#attacks">3.3. Adversary Capabilities - Attacks</a></span></dt></dl></dd><dt><span class="sect1"><a href="#Implementation">4. Implementation</a></span></dt><dd><dl><dt><span class="sect2"><a href="#proxy-obedience">4.1. Proxy Obedience</a></span></dt><dt><span class="sect2"><a href="#state-separation">4.2. State Separation</a></span></dt><dt><span class="sect2"><a href="#disk-avoidance">4.3. Disk Avoidance</a></span></dt><dt><span class="sect2"><a href="#app-data-isolation">4.4. Application Data Isolation</a></span></dt><dt><span class="sect2"><a href="#identifier-linkability">4.5. Cross-Origin Identifier Unlinkability</a></span></dt><dt><span class="sect2"><a href="#fingerprinting-linkability">4.6. Cross-Origin Fingerprinting Unlinkability</a></span></dt><dt><span class="sect2"><a href="#new-identity">4.7. Long-Term Unlinkability via "New Identity" button</a></span></dt><dt><span class="sect2"><a href="#other-security">4.8. Other Security Measures</a></span></dt></dl></dd><dt><span class="sect1"><a href="#BuildSecurity">5. Build Security and Package Integrity</a></span></dt><dd><dl><dt><span class="sect2"><a href="#idp60597904">5.1. Achieving Binary Reproducibility</a></span></dt><dt><span class="sect2"><a href="#idp60632800">5.2. Package Signatures and Verification</a></span></dt><dt><span class="sect2"><a href="#idp60636736">5.3. Anonymous Verification</a></span></dt></dl></dd><dt><span class="appendix"><a href="#Transparency">A. Towards Transparency in Navigation Tracking</a></span></dt><dd><dl><dt><span class="sect1"><a href="#deprecate">A.1. Deprecation Wishlist</a></span></dt><dt><span class="sect1"><a href="#idp60669376">A.2. Promising Standards</a></span></dt></dl></dd></dl></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="idp59720528"></a>1. Introduction</h2></div></div></div><p> |
|
2 |
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>The Design and Implementation of the Tor Browser [DRAFT]</title><meta name="generator" content="DocBook XSL Stylesheets V1.78.1" /></head><body><div class="article"><div class="titlepage"><div><div><h2 class="title"><a id="design"></a>The Design and Implementation of the Tor Browser [DRAFT]</h2></div><div><div class="author"><h3 class="author"><span class="firstname">Mike</span> <span class="surname">Perry</span></h3><div class="affiliation"><div class="address"><p><code class="email"><<a class="email" href="mailto:mikeperry#torproject org">mikeperry#torproject org</a>></code></p></div></div></div></div><div><div class="author"><h3 class="author"><span class="firstname">Erinn</span> <span class="surname">Clark</span></h3><div class="affiliation"><div class="address"><p><code class="email"><<a class="email" href="mailto:erinn#torproject org">erinn#torproject org</a>></code></p></div></div></div></div><div><div class="author"><h3 class="author"><span class="firstname">Steven</span> <span class="surname">Murdoch</span></h3><div class="affiliation"><div class="address"><p><code class="email"><<a class="email" href="mailto:sjmurdoch#torproject org">sjmurdoch#torproject org</a>></code></p></div></div></div></div><div><p class="pubdate">April 30th, 2015</p></div></div><hr /></div><div class="toc"><p><strong>Table of Contents</strong></p><dl class="toc"><dt><span class="sect1"><a href="#idp51709072">1. Introduction</a></span></dt><dd><dl><dt><span class="sect2"><a href="#components">1.1. Browser Component Overview</a></span></dt></dl></dd><dt><span class="sect1"><a href="#DesignRequirements">2. Design Requirements and Philosophy</a></span></dt><dd><dl><dt><span class="sect2"><a href="#security">2.1. Security Requirements</a></span></dt><dt><span class="sect2"><a href="#privacy">2.2. Privacy Requirements</a></span></dt><dt><span class="sect2"><a href="#philosophy">2.3. Philosophy</a></span></dt></dl></dd><dt><span class="sect1"><a href="#adversary">3. Adversary Model</a></span></dt><dd><dl><dt><span class="sect2"><a href="#adversary-goals">3.1. Adversary Goals</a></span></dt><dt><span class="sect2"><a href="#adversary-positioning">3.2. Adversary Capabilities - Positioning</a></span></dt><dt><span class="sect2"><a href="#attacks">3.3. Adversary Capabilities - Attacks</a></span></dt></dl></dd><dt><span class="sect1"><a href="#Implementation">4. Implementation</a></span></dt><dd><dl><dt><span class="sect2"><a href="#proxy-obedience">4.1. Proxy Obedience</a></span></dt><dt><span class="sect2"><a href="#state-separation">4.2. State Separation</a></span></dt><dt><span class="sect2"><a href="#disk-avoidance">4.3. Disk Avoidance</a></span></dt><dt><span class="sect2"><a href="#app-data-isolation">4.4. Application Data Isolation</a></span></dt><dt><span class="sect2"><a href="#identifier-linkability">4.5. Cross-Origin Identifier Unlinkability</a></span></dt><dt><span class="sect2"><a href="#fingerprinting-linkability">4.6. Cross-Origin Fingerprinting Unlinkability</a></span></dt><dt><span class="sect2"><a href="#new-identity">4.7. Long-Term Unlinkability via "New Identity" button</a></span></dt><dt><span class="sect2"><a href="#other-security">4.8. Other Security Measures</a></span></dt></dl></dd><dt><span class="sect1"><a href="#BuildSecurity">5. Build Security and Package Integrity</a></span></dt><dd><dl><dt><span class="sect2"><a href="#idp54108896">5.1. Achieving Binary Reproducibility</a></span></dt><dt><span class="sect2"><a href="#idp54129600">5.2. Package Signatures and Verification</a></span></dt><dt><span class="sect2"><a href="#idp54134112">5.3. Anonymous Verification</a></span></dt><dt><span class="sect2"><a href="#update-safety">5.4. Update Safety</a></span></dt></dl></dd><dt><span class="appendix"><a href="#Transparency">A. Towards Transparency in Navigation Tracking</a></span></dt><dd><dl><dt><span class="sect1"><a href="#deprecate">A.1. Deprecation Wishlist</a></span></dt><dt><span class="sect1"><a href="#idp54168528">A.2. Promising Standards</a></span></dt></dl></dd></dl></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="idp51709072"></a>1. Introduction</h2></div></div></div><p> |
|
3 | 3 |
|
4 | 4 |
This document describes the <a class="link" href="#adversary" title="3. Adversary Model">adversary model</a>, |
5 | 5 |
<a class="link" href="#DesignRequirements" title="2. Design Requirements and Philosophy">design requirements</a>, and <a class="link" href="#Implementation" title="4. Implementation">implementation</a> of the Tor Browser. It is current as of Tor Browser |
6 |
-4.5-alpha-1. |
|
6 |
+4.5. |
|
7 | 7 |
|
8 | 8 |
</p><p> |
9 | 9 |
|
... | ... |
@@ -12,14 +12,20 @@ describe a reference implementation of a Private Browsing Mode that defends |
12 | 12 |
against active network adversaries, in addition to the passive forensic local |
13 | 13 |
adversary currently addressed by the major browsers. |
14 | 14 |
|
15 |
+ </p><p> |
|
16 |
+ |
|
17 |
+For more practical information regarding Tor Browser development, please |
|
18 |
+consult the <a class="ulink" href="https://trac.torproject.org/projects/tor/wiki/doc/TorBrowser/Hacking" target="_top">Tor |
|
19 |
+Browser Hacking Guide</a>. |
|
20 |
+ |
|
15 | 21 |
</p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="components"></a>1.1. Browser Component Overview</h3></div></div></div><p> |
16 | 22 |
|
17 | 23 |
The Tor Browser is based on <a class="ulink" href="https://www.mozilla.org/en-US/firefox/organizations/" target="_top">Mozilla's Extended |
18 | 24 |
Support Release (ESR) Firefox branch</a>. We have a <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git" target="_top">series of patches</a> |
19 | 25 |
against this browser to enhance privacy and security. Browser behavior is |
20 |
-additionally augmented through the <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/tree/master" target="_top">Torbutton |
|
26 |
+additionally augmented through the <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/tree/" target="_top">Torbutton |
|
21 | 27 |
extension</a>, though we are in the process of moving this functionality |
22 |
-into direct Firefox patches. We also <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/blob/refs/heads/tor-browser-31.2.0esr-4.x-1:/browser/app/profile/000-tor-browser.js" target="_top">change |
|
28 |
+into direct Firefox patches. We also <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/tree/browser/app/profile/000-tor-browser.js?h=tor-browser-31.6.0esr-4.5-1" target="_top">change |
|
23 | 29 |
a number of Firefox preferences</a> from their defaults. |
24 | 30 |
|
25 | 31 |
</p><p> |
... | ... |
@@ -33,14 +39,14 @@ Instantbird, and XULRunner. |
33 | 39 |
To help protect against potential Tor Exit Node eavesdroppers, we include |
34 | 40 |
<a class="ulink" href="https://www.eff.org/https-everywhere" target="_top">HTTPS-Everywhere</a>. To |
35 | 41 |
provide users with optional defense-in-depth against Javascript and other |
36 |
-potential exploit vectors, we also include <a class="ulink" href="http://noscript.net/" target="_top">NoScript</a>. We also modify <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/blob/refs/heads/master:/Bundle-Data/linux/Data/Browser/profile.default/preferences/extension-overrides.js" target="_top">several |
|
42 |
+potential exploit vectors, we also include <a class="ulink" href="http://noscript.net/" target="_top">NoScript</a>. We also modify <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/Bundle-Data/linux/Data/Browser/profile.default/preferences/extension-overrides.js" target="_top">several |
|
37 | 43 |
extension preferences</a> from their defaults. |
38 | 44 |
|
39 | 45 |
</p><p> |
40 | 46 |
|
41 | 47 |
To provide censorship circumvention in areas where the public Tor network is |
42 | 48 |
blocked either by IP, or by protocol fingerprint, we include several <a class="ulink" href="https://trac.torproject.org/projects/tor/wiki/doc/AChildsGardenOfPluggableTransports" target="_top">Pluggable |
43 |
-Transports</a> in the distribution. As of this writing, we include <a class="ulink" href="https://gitweb.torproject.org/pluggable-transports/obfsproxy.git/blob/HEAD:/doc/obfs3/obfs3-protocol-spec.txt" target="_top">Obfsproxy</a>, |
|
49 |
+Transports</a> in the distribution. As of this writing, we include <a class="ulink" href="https://gitweb.torproject.org/pluggable-transports/obfs4.git" target="_top">Obfs4proxy</a>, |
|
44 | 50 |
<a class="ulink" href="https://trac.torproject.org/projects/tor/wiki/doc/meek" target="_top">meek</a>, |
45 | 51 |
<a class="ulink" href="https://fteproxy.org/" target="_top">FTE</a>, and <a class="ulink" href="https://crypto.stanford.edu/flashproxy/" target="_top">FlashProxy</a>. |
46 | 52 |
|
... | ... |
@@ -552,7 +556,7 @@ Proxy obedience is assured through the following: |
552 | 556 |
</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">Firefox proxy settings, patches, and build flags |
553 | 557 |
<p> |
554 | 558 |
|
555 |
-Our <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/blob/refs/heads/tor-browser-31.2.0esr-4.x-1:/browser/app/profile/000-tor-browser.js" target="_top">Firefox |
|
559 |
+Our <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/tree/browser/app/profile/000-tor-browser.js?h=tor-browser-31.6.0esr-4.5-1" target="_top">Firefox |
|
556 | 560 |
preferences file</a> sets the Firefox proxy settings to use Tor directly |
557 | 561 |
as a SOCKS proxy. It sets <span class="command"><strong>network.proxy.socks_remote_dns</strong></span>, |
558 | 562 |
<span class="command"><strong>network.proxy.socks_version</strong></span>, |
... | ... |
@@ -568,9 +572,9 @@ as set the pref <span class="command"><strong>media.peerconnection.enabled</stro |
568 | 572 |
</p><p> |
569 | 573 |
|
570 | 574 |
We also patch Firefox in order to provide several defense-in-depth mechanisms |
571 |
-for proxy safety. Notably, we <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/8527bec0ad59fb3d885c5639735fb188eefa336f" target="_top">patch |
|
575 |
+for proxy safety. Notably, we <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=8c6604d2b776f0d8e33ed9130c5f5b8cf744bac8" target="_top">patch |
|
572 | 576 |
the DNS service</a> to prevent any browser or addon DNS resolution, and we |
573 |
-also <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/04c046e11f6622f44ca010bcb8ecf68cf470a4c0" target="_top">patch |
|
577 |
+also <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=c96c854c0eca21fed1362d1ddd164b657d351795" target="_top">patch |
|
574 | 578 |
OCSP and PKIX code</a> to prevent any use of the non-proxied command-line |
575 | 579 |
tool utility functions from being functional while linked in to the browser. |
576 | 580 |
In both cases, we could find no direct paths to these routines in the browser, |
... | ... |
@@ -578,7 +582,7 @@ but it seemed better safe than sorry. |
578 | 582 |
|
579 | 583 |
</p><p> |
580 | 584 |
|
581 |
-During every Extended Support Release transition, we perform <a class="ulink" href="https://gitweb.torproject.org/tor-browser-spec.git/tree/HEAD:/audits" target="_top">in-depth |
|
585 |
+During every Extended Support Release transition, we perform <a class="ulink" href="https://gitweb.torproject.org/tor-browser-spec.git/tree/audits" target="_top">in-depth |
|
582 | 586 |
code audits</a> to verify that there were no system calls or XPCOM |
583 | 587 |
activity in the source tree that did not use the browser proxy settings. |
584 | 588 |
</p><p> |
... | ... |
@@ -590,7 +594,7 @@ geolocation queries, searchbox queries, XPCOM addon HTTPS/HTTP activity, |
590 | 594 |
WebSockets, and live bookmark updates. We have also verified that IPv6 |
591 | 595 |
connections are not attempted, through the proxy or otherwise (Tor does not |
592 | 596 |
yet support IPv6). We have also verified that external protocol helpers, such |
593 |
-as smb urls and other custom protocol handlers are all blocked. |
|
597 |
+as SMB URLs and other custom protocol handlers are all blocked. |
|
594 | 598 |
|
595 | 599 |
</p></li><li class="listitem">Disabling plugins |
596 | 600 |
|
... | ... |
@@ -610,8 +614,10 @@ restricted from automatic load through Firefox's click-to-play preference |
610 | 614 |
|
611 | 615 |
In addition, to reduce any unproxied activity by arbitrary plugins at load |
612 | 616 |
time, and to reduce the fingerprintability of the installed plugin list, we |
613 |
-also patch the Firefox source code to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/2ecf6c33618ecee554155f735a3e92860f519f9c" target="_top"> |
|
614 |
-prevent the load of any plugins except for Flash and Gnash</a>. |
|
617 |
+also patch the Firefox source code to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=465cb8295db58a6450dc14a593d29372cbebc71d" target="_top"> |
|
618 |
+prevent the load of any plugins except for Flash and Gnash</a>. Even for |
|
619 |
+Flash and Gnash, we also patch Firefox to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=e5531b1baa3c96dee7d8d4274791ff393bafd241" target="_top">prevent loading them into the |
|
620 |
+address space</a> until they are explicitly enabled. |
|
615 | 621 |
|
616 | 622 |
</p></li><li class="listitem">External App Blocking and Drag Event Filtering |
617 | 623 |
<p> |
... | ... |
@@ -619,7 +625,7 @@ prevent the load of any plugins except for Flash and Gnash</a>. |
619 | 625 |
External apps can be induced to load files that perform network activity. |
620 | 626 |
Unfortunately, there are cases where such apps can be launched automatically |
621 | 627 |
with little to no user input. In order to prevent this, Torbutton installs a |
622 |
-component to <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/blob_plain/HEAD:/src/components/external-app-blocker.js" target="_top"> |
|
628 |
+component to <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/tree/src/components/external-app-blocker.js" target="_top"> |
|
623 | 629 |
provide the user with a popup</a> whenever the browser attempts to launch |
624 | 630 |
a helper app. |
625 | 631 |
|
... | ... |
@@ -629,7 +635,7 @@ Additionally, modern desktops now pre-emptively fetch any URLs in Drag and |
629 | 635 |
Drop events as soon as the drag is initiated. This download happens |
630 | 636 |
independent of the browser's Tor settings, and can be triggered by something |
631 | 637 |
as simple as holding the mouse button down for slightly too long while |
632 |
-clicking on an image link. We filter drag and drop events events <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/blob_plain/HEAD:/src/components/external-app-blocker.js" target="_top">from |
|
638 |
+clicking on an image link. We filter drag and drop events events <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/tree/src/components/external-app-blocker.js" target="_top">from |
|
633 | 639 |
Torbutton</a> before the OS downloads the URLs the events contained. |
634 | 640 |
|
635 | 641 |
</p></li><li class="listitem">Disabling system extensions and clearing the addon whitelist |
... | ... |
@@ -654,24 +660,24 @@ system-wide extensions (through the use of |
654 | 660 |
disabled, which prevents Flash cookies from leaking from a pre-existing Flash |
655 | 661 |
directory. |
656 | 662 |
|
657 |
- </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="disk-avoidance"></a>4.3. Disk Avoidance</h3></div></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp60374176"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"> |
|
663 |
+ </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="disk-avoidance"></a>4.3. Disk Avoidance</h3></div></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp53861360"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"> |
|
658 | 664 |
|
659 | 665 |
The User Agent MUST (at user option) prevent all disk records of browser activity. |
660 | 666 |
The user should be able to optionally enable URL history and other history |
661 | 667 |
features if they so desire. |
662 | 668 |
|
663 |
- </blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp60375536"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"> |
|
669 |
+ </blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp53862720"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"> |
|
664 | 670 |
|
665 | 671 |
We achieve this goal through several mechanisms. First, we set the Firefox |
666 | 672 |
Private Browsing preference |
667 | 673 |
<span class="command"><strong>browser.privatebrowsing.autostart</strong></span>. In addition, four Firefox patches are needed to prevent disk writes, even if |
668 | 674 |
Private Browsing Mode is enabled. We need to |
669 | 675 |
|
670 |
-<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/4ebc3cda4b704c0149fb9e0fdcbb6e5ee3a8e75c" target="_top">prevent |
|
671 |
-the permissions manager from recording HTTPS STS state</a>, <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/8904bfc10cd537bd35be5ddd23c58fdaa72baa21" target="_top">prevent |
|
672 |
-intermediate SSL certificates from being recorded</a>, <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/86f6bc9dc28b6f8d7eae7974c7e9b537c3a08e41" target="_top">prevent |
|
676 |
+<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=44b8ae43a83191bbf5161cbdbf399e10c1b943d0" target="_top">prevent |
|
677 |
+the permissions manager from recording HTTPS STS state</a>, <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=e5abcb28f131aa96e8762212573488d303b3614d" target="_top">prevent |
|
678 |
+intermediate SSL certificates from being recorded</a>, <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=ee34e122ac2929a7668314483e36e58a88c98c08" target="_top">prevent |
|
673 | 679 |
the clipboard cache from being written to disk for large pastes</a>, and |
674 |
-<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/d5da6f8b7de089335e49e2f7dbd2b8d74e4cb613" target="_top">prevent |
|
680 |
+<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=c8e357740dd7bafa2a129007f27d2b243e36f4a2" target="_top">prevent |
|
675 | 681 |
the content preferences service from recording site zoom</a>. We also had |
676 | 682 |
to disable the media cache with the pref <span class="command"><strong>media.cache_size</strong></span>, |
677 | 683 |
to prevent HTML5 videos from being written to the OS temporary directory, |
... | ... |
@@ -734,7 +740,7 @@ the url bar origin for which browser state exists, possibly with a |
734 | 740 |
context-menu option to drill down into specific types of state or permissions. |
735 | 741 |
An example of this simplification can be seen in Figure 1. |
736 | 742 |
|
737 |
- </p><div class="figure"><a id="idp60398240"></a><p class="title"><strong>Figure 1. Improving the Privacy UI</strong></p><div class="figure-contents"><div class="mediaobject" align="center"><img src="NewCookieManager.png" align="middle" alt="Improving the Privacy UI" /></div><div class="caption"><p></p> |
|
743 |
+ </p><div class="figure"><a id="idp53885184"></a><p class="title"><strong>Figure 1. Improving the Privacy UI</strong></p><div class="figure-contents"><div class="mediaobject" align="center"><img src="NewCookieManager.png" align="middle" alt="Improving the Privacy UI" /></div><div class="caption"><p></p> |
|
738 | 744 |
|
739 | 745 |
This example UI is a mock-up of how isolating identifiers to the URL bar |
740 | 746 |
origin can simplify the privacy UI for all data - not just cookies. Once |
... | ... |
@@ -761,59 +767,35 @@ unlinkability trumps that desire. |
761 | 767 |
</p></li><li class="listitem">Cache |
762 | 768 |
<p> |
763 | 769 |
|
764 |
-Cache is isolated to the url bar origin by using a technique pioneered by |
|
765 |
-Colin Jackson et al, via their work on <a class="ulink" href="http://www.safecache.com/" target="_top">SafeCache</a>. The technique re-uses the |
|
766 |
-<a class="ulink" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsICachingChannel" target="_top">nsICachingChannel.cacheKey</a> |
|
767 |
-attribute that Firefox uses internally to prevent improper caching and reuse |
|
768 |
-of HTTP POST data. |
|
769 |
- |
|
770 |
- </p><p> |
|
771 |
- |
|
772 |
-However, to <a class="ulink" href="https://trac.torproject.org/projects/tor/ticket/3666" target="_top">increase the |
|
773 |
-security of the isolation</a> and to <a class="ulink" href="https://trac.torproject.org/projects/tor/ticket/3754" target="_top">solve conflicts |
|
774 |
-with OCSP relying the cacheKey property for reuse of POST requests</a>, we |
|
775 |
-had to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/18dfd3064aff23a402fec248aab797036a9ba615" target="_top">patch |
|
776 |
-Firefox to provide a cacheDomain cache attribute</a>. We use the fully |
|
777 |
-qualified url bar domain as input to this field, to avoid the complexities |
|
778 |
-of heuristically determining the second-level DNS name. |
|
779 |
- |
|
780 |
- </p><p> |
|
781 |
- |
|
782 |
- Furthermore, we chose a different |
|
783 |
-isolation scheme than the Stanford implementation. First, we decoupled the |
|
784 |
-cache isolation from the third party cookie attribute. Second, we use several |
|
785 |
-mechanisms to attempt to determine the actual location attribute of the |
|
786 |
-top-level window (to obtain the url bar FQDN) used to load the page, as |
|
787 |
-opposed to relying solely on the Referer property. |
|
788 |
- |
|
789 |
- </p><p> |
|
790 |
- |
|
791 |
-Therefore, <a class="ulink" href="http://crypto.stanford.edu/sameorigin/safecachetest.html" target="_top">the original |
|
792 |
-Stanford test cases</a> are expected to fail. Functionality can still be |
|
793 |
-verified by navigating to <a class="ulink" href="about:cache" target="_top">about:cache</a> and |
|
794 |
-viewing the key used for each cache entry. Each third party element should |
|
795 |
-have an additional "domain=string" property prepended, which will list the |
|
796 |
-FQDN that was used to source the third party element. |
|
770 |
+In Firefox, there are actually two distinct caching mechanisms: One for |
|
771 |
+general content (HTML, Javascript, CSS), and one specifically for images. The |
|
772 |
+content cache is isolated to the URL bar domain by <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=7c58be929777d386a03e1faaee648909151fd951" target="_top">altering |
|
773 |
+each cache key</a> to include an additional ID that includes the URL bar |
|
774 |
+domain. This functionality can be observed by navigating to <a class="ulink" href="about:cache" target="_top">about:cache</a> and viewing the key used for each cache |
|
775 |
+entry. Each third party element should have an additional "id=string" |
|
776 |
+property prepended, which will list the FQDN that was used to source the third |
|
777 |
+party element. |
|
797 | 778 |
|
798 | 779 |
</p><p> |
799 | 780 |
|
800 | 781 |
Additionally, because the image cache is a separate entity from the content |
801 |
-cache, we had to patch Firefox to also <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/114cd22282f8b3cd6e6a5c29de8a8c396a79acc0" target="_top">isolate |
|
782 |
+cache, we had to patch Firefox to also <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=d8b98a75fb200268c40886d876adc19e00b933bf" target="_top">isolate |
|
802 | 783 |
this cache per url bar domain</a>. |
803 | 784 |
|
804 | 785 |
</p></li><li class="listitem">HTTP Auth |
805 | 786 |
<p> |
806 | 787 |
|
807 |
-HTTP authentication tokens are removed for third party elements using the |
|
808 |
-<a class="ulink" href="https://developer.mozilla.org/en/Setting_HTTP_request_headers#Observers" target="_top">http-on-modify-request |
|
809 |
-observer</a> to remove the Authorization headers to prevent <a class="ulink" href="http://jeremiahgrossman.blogspot.com/2007/04/tracking-users-without-cookies.html" target="_top">silent |
|
810 |
-linkability between domains</a>. |
|
788 |
+HTTP Authorization headers can be used by Javascript to encode <a class="ulink" href="http://jeremiahgrossman.blogspot.com/2007/04/tracking-users-without-cookies.html" target="_top">silent |
|
789 |
+third party tracking identifiers</a>. To prevent this, we remove HTTP |
|
790 |
+authentication tokens for third party elements through a <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=b8ce4a0760759431f146c71184c89fbd5e1a27e4" target="_top">patch |
|
791 |
+to nsHTTPChannel</a>. |
|
792 |
+ |
|
811 | 793 |
</p></li><li class="listitem">DOM Storage |
812 | 794 |
<p> |
813 | 795 |
|
814 | 796 |
DOM storage for third party domains MUST be isolated to the url bar origin, |
815 | 797 |
to prevent linkability between sites. This functionality is provided through a |
816 |
-<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/973468a07fb9e7d9995d01b250223a8df16d6cfd" target="_top">patch |
|
798 |
+<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=97490c4a90ca1c43374486d9ec0c5593d5fe5720" target="_top">patch |
|
817 | 799 |
to Firefox</a>. |
818 | 800 |
|
819 | 801 |
</p></li><li class="listitem">Flash cookies |
... | ... |
@@ -830,37 +812,83 @@ We are currently <a class="ulink" href="https://trac.torproject.org/projects/tor |
830 | 812 |
difficulties</a> causing Flash player to use this settings |
831 | 813 |
file on Windows, so Flash remains difficult to enable. |
832 | 814 |
|
833 |
- </p></li><li class="listitem">SSL+TLS session resumption, HTTP Keep-Alive and SPDY |
|
815 |
+ </p></li><li class="listitem">SSL+TLS session resumption |
|
834 | 816 |
<p><span class="command"><strong>Design Goal:</strong></span> |
835 | 817 |
|
836 | 818 |
TLS session resumption tickets and SSL Session IDs MUST be limited to the url |
837 |
-bar origin. HTTP Keep-Alive connections from a third party in one url bar |
|
838 |
-origin MUST NOT be reused for that same third party in another url bar origin. |
|
819 |
+bar origin. |
|
839 | 820 |
|
840 | 821 |
</p><p><span class="command"><strong>Implementation Status:</strong></span> |
841 | 822 |
|
842 | 823 |
We currently clear SSL Session IDs upon <a class="link" href="#new-identity" title="4.7. Long-Term Unlinkability via "New Identity" button">New |
843 | 824 |
Identity</a>, we disable TLS Session Tickets via the Firefox Pref |
844 | 825 |
<span class="command"><strong>security.enable_tls_session_tickets</strong></span>. We disable SSL Session |
845 |
-IDs via a <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/5524ae43780e4738310852cc2a0b7c5d25aa69ed" target="_top">patch |
|
826 |
+IDs via a <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=a01fb747d4b8b24687de538cb6a1304fe27d9d88" target="_top">patch |
|
846 | 827 |
to Firefox</a>. To compensate for the increased round trip latency from disabling |
847 | 828 |
these performance optimizations, we also enable |
848 | 829 |
<a class="ulink" href="https://tools.ietf.org/html/draft-bmoeller-tls-falsestart-00" target="_top">TLS |
849 | 830 |
False Start</a> via the Firefox Pref |
850 | 831 |
<span class="command"><strong>security.ssl.enable_false_start</strong></span>. |
832 |
+ </p></li><li class="listitem">IP address, Tor Circuit, and HTTP Keep-Alive linkability |
|
833 |
+ <p> |
|
834 |
+ |
|
835 |
+IP addresses, Tor Circuits, and HTTP connections from a third party in one URL |
|
836 |
+bar origin MUST NOT be reused for that same third party in another URL bar |
|
837 |
+origin. |
|
851 | 838 |
</p><p> |
852 | 839 |
|
853 |
-Because of the extreme performance benefits of HTTP Keep-Alive for interactive |
|
854 |
-web apps, and because of the difficulties of conveying urlbar origin |
|
855 |
-information down into the Firefox HTTP layer, as a compromise we currently |
|
856 |
-merely reduce the HTTP Keep-Alive timeout to 20 seconds (which is measured |
|
857 |
-from the last packet read on the connection) using the Firefox preference |
|
858 |
-<span class="command"><strong>network.http.keep-alive.timeout</strong></span>. |
|
840 |
+This isolation functionality is provided by the combination of a <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=b3ea705cc35b79a9ba27323cb3e32d5d004ea113" target="_top">Firefox |
|
841 |
+patch to allow SOCKS username and passwords</a>, as well as a Torbutton |
|
842 |
+component that <a class="ulink" href="" target="_top">sets |
|
843 |
+the SOCKS username and password for each request</a>. The Tor client has |
|
844 |
+logic to prevent connections with different SOCKS usernames and passwords from |
|
845 |
+using the same Tor Circuit, which provides us with IP address unlinkability. |
|
846 |
+Firefox has existing logic to ensure that connections with SOCKS proxy do not |
|
847 |
+re-use existing HTTP Keep Alive connections unless the proxy settings match. |
|
848 |
+We extended this logic to cover SOCKS username and password authentication, |
|
849 |
+providing us with HTTP Keep-Alive unlinkability. |
|
850 |
+ |
|
851 |
+ </p></li><li class="listitem">SharedWorkers |
|
852 |
+ <p> |
|
853 |
+ |
|
854 |
+<a class="ulink" href="https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker" target="_top">SharedWorkers</a> |
|
855 |
+are a special form of Javascript Worker Threads that have a shared scope |
|
856 |
+between all threads from the same Javascript origin. |
|
857 |
+ </p><p><span class="command"><strong>Design Goal:</strong></span> |
|
858 |
+ |
|
859 |
+SharedWorker scope MUST be isolated to the URL bar domain. A SharedWorker |
|
860 |
+launched from a third party from one URL bar domain MUST NOT have access to |
|
861 |
+the objects created by that same third party loaded under another URL bar domain. |
|
862 |
+ |
|
863 |
+ </p><p><span class="command"><strong>Implementation Status:</strong></span> |
|
864 |
+ |
|
865 |
+For now, we disable SharedWorkers via the pref |
|
866 |
+<span class="command"><strong>dom.workers.sharedWorkers.enabled</strong></span>. |
|
867 |
+ |
|
868 |
+ </p></li><li class="listitem">blob: URIs (URL.createObjectURL) |
|
869 |
+ <p> |
|
870 |
+ |
|
871 |
+The <a class="ulink" href="https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL" target="_top">URL.createObjectURL</a> |
|
872 |
+API allows a site to load arbitrary content into a random UUID that is stored |
|
873 |
+in the user's browser, and this content can be accessed via a URL of the form |
|
874 |
+<span class="command"><strong>blob:UUID</strong></span> from any other content element anywhere on the |
|
875 |
+web. While this UUID value is neither under control of the site nor |
|
876 |
+predictable, it can still be used to tag a set of users that are of high |
|
877 |
+interest to an adversary. |
|
859 | 878 |
|
860 | 879 |
</p><p> |
861 |
-However, because SPDY can store identifiers and has extremely long keepalive |
|
862 |
-duration, it is disabled through the Firefox preference |
|
863 |
-<span class="command"><strong>network.http.spdy.enabled</strong></span>. |
|
880 |
+ |
|
881 |
+URIs created with URL.createObjectURL MUST be limited in scope to the first |
|
882 |
+party URL bar domain that created them. We provide this isolation in Tor |
|
883 |
+Browser via a <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=0d67ab406bdd3cf095802cb25c081641aa1f0bcc" target="_top">direct |
|
884 |
+patch to Firefox</a>. |
|
885 |
+ |
|
886 |
+ </p></li><li class="listitem">SPDY |
|
887 |
+ <p> |
|
888 |
+ |
|
889 |
+Because SPDY can store identifiers, it is disabled through the |
|
890 |
+Firefox preference <span class="command"><strong>network.http.spdy.enabled</strong></span>. |
|
891 |
+ |
|
864 | 892 |
</p></li><li class="listitem">Automated cross-origin redirects MUST NOT store identifiers |
865 | 893 |
<p><span class="command"><strong>Design Goal:</strong></span> |
866 | 894 |
|
... | ... |
@@ -932,65 +960,106 @@ the best approach. |
932 | 960 |
cleared by <a class="link" href="#new-identity" title="4.7. Long-Term Unlinkability via "New Identity" button">New Identity</a>, but we don't |
933 | 961 |
defend against the creation of these cookies between <span class="command"><strong>New |
934 | 962 |
Identity</strong></span> invocations. |
935 |
- </p></li><li class="listitem">Exit node usage |
|
936 |
- <p> |
|
937 |
- |
|
938 |
-All content elements associated with a given URL bar domain (including the |
|
939 |
-main page) are given a SOCKS username and password for this domain, which |
|
940 |
-causes Tor to isolate all of these requests on their own set of Tor circuits. |
|
941 |
- |
|
942 | 963 |
</p></li></ol></div><p> |
943 | 964 |
For more details on identifier linkability bugs and enhancements, see the <a class="ulink" href="https://trac.torproject.org/projects/tor/query?keywords=~tbb-linkability&status=!closed" target="_top">tbb-linkability tag in our bugtracker</a> |
944 | 965 |
</p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="fingerprinting-linkability"></a>4.6. Cross-Origin Fingerprinting Unlinkability</h3></div></div></div><p> |
945 | 966 |
|
946 |
-In order to properly address the fingerprinting adversary on a technical |
|
947 |
-level, we need a metric to measure linkability of the various browser |
|
948 |
-properties beyond any stored origin-related state. <a class="ulink" href="https://panopticlick.eff.org/about.php" target="_top">The Panopticlick Project</a> |
|
949 |
-by the EFF provides us with a prototype of such a metric. The researchers |
|
950 |
-conducted a survey of volunteers who were asked to visit an experiment page |
|
951 |
-that harvested many of the above components. They then computed the Shannon |
|
952 |
-Entropy of the resulting distribution of each of several key attributes to |
|
953 |
-determine how many bits of identifying information each attribute provided. |
|
954 |
- |
|
955 |
- </p><p> |
|
956 |
- |
|
957 |
-Unfortunately, there are limitations to the way the Panopticlick study was |
|
958 |
-conducted. Because the Panopticlick dataset is based on browser data spanning |
|
959 |
-a number of widely deployed browsers over a number of years, any |
|
960 |
-fingerprinting defenses attempted by browsers today are very likely to cause |
|
961 |
-Panopticlick to report an <span class="emphasis"><em>increase</em></span> in fingerprintability |
|
962 |
-and entropy, because those defenses will stand out in sharp contrast to |
|
963 |
-historical data. Moreover, because fingerprinting is a problem that |
|
964 |
-potentially touches every aspect of the browser, we do not believe it is |
|
965 |
-possible to solve cross-browser fingerprinting issues. We reduce the efforts |
|
966 |
-for fingerprinting resistance by only concerning ourselves with reducing the |
|
967 |
-fingerprintable differences <span class="emphasis"><em>among</em></span> Tor Browser users. |
|
968 |
- |
|
969 |
- </p><p> |
|
970 |
- |
|
971 |
-The unsolvable nature of the cross-browser fingerprinting problem also means |
|
972 |
-that the Panopticlick test website itself is not useful for evaluating the |
|
973 |
-actual effectiveness of our defenses, or the fingerprinting defenses of any |
|
974 |
-other web browser. We are interested in deploying an improved version of |
|
975 |
-Panopticlick that measures entropy and variance only among a specific user |
|
976 |
-agent population, but until then, intuition serves as a decent guide. |
|
977 |
-Essentially, anything that reveals custom user configuration, third party |
|
978 |
-software, highly variable hardware details, and external devices attached to |
|
979 |
-the users computer is likely to more fingerprintable than things like |
|
980 |
-operating system type and even processor speed. |
|
981 |
- |
|
982 |
- </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="fingerprinting-defenses"></a>Fingerprinting defenses in the Tor Browser</h4></div></div></div><p> |
|
967 |
+Browser fingerprinting is the act of inspecting browser behaviors and features in |
|
968 |
+an attempt to differentiate and track individual users. Fingerprinting attacks |
|
969 |
+are typically broken up into passive and active vectors. Passive |
|
970 |
+fingerprinting makes use of any information the browser provides automatically |
|
971 |
+to a website without any specific action on the part of the website. Active |
|
972 |
+fingerprinting makes use of any information that can be extracted from the |
|
973 |
+browser by some specific website action, usually involving Javascript. |
|
974 |
+Some definitions of browser fingerprinting also include supercookies and |
|
975 |
+cookie-like identifier storage, but we deal with those issues separately in |
|
976 |
+the <a class="link" href="#identifier-linkability" title="4.5. Cross-Origin Identifier Unlinkability">preceding section on identifier |
|
977 |
+linkability</a>. |
|
978 |
+ |
|
979 |
+ </p><p> |
|
980 |
+ |
|
981 |
+For the most part, however, we do not differentiate between passive or active |
|
982 |
+fingerprinting sources, since many active fingerprinting mechanisms are very |
|
983 |
+rapid, and can be obfuscated or disguised as legitimate functionality. |
|
984 |
+Instead, we believe fingerprinting can only be rationally addressed if we |
|
985 |
+understand where the problem comes from, what sources of issues are the most |
|
986 |
+severe, and how to study the efficacy of defenses properly. |
|
987 |
+ |
|
988 |
+ </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="fingerprinting-scope"></a>Sources of Fingerprinting Issues</h4></div></div></div><p> |
|
989 |
+ |
|
990 |
+All fingerprinting issues arise from one of four primary sources. In order |
|
991 |
+from most severe to least severe, these sources are: |
|
992 |
+ |
|
993 |
+ </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>End-user Configuration Details</strong></span><p> |
|
994 |
+ |
|
995 |
+End-user configuration details are by far the most severe threat to |
|
996 |
+fingerprinting, as they will quickly provide enough information to uniquely |
|
997 |
+identify a user. We believe it is essential to avoid exposing platform |
|
998 |
+configuration details to website content at all costs. We also discourage |
|
999 |
+excessive fine-grained customization of Tor Browser by minimizing and |
|
1000 |
+aggregating user-facing privacy and security options, as well as by |
|
1001 |
+discouraging the use of additional addons. When it is necessary to expose |
|
1002 |
+configuration details in the course of providing functionality, we strive to |
|
1003 |
+do so only on a per-site basis via site permissions, to avoid linkability. |
|
1004 |
+ |
|
1005 |
+ </p></li><li class="listitem"><span class="command"><strong>Device and Hardware Characteristics</strong></span><p> |
|
1006 |
+ |
|
1007 |
+Device and hardware characteristics can be determined three ways: they can be |
|
1008 |
+reported explicitly by the browser, they can be inferred through API behavior, |
|
1009 |
+or they can be extracted through statistical measurements of system |
|
1010 |
+performance. We are most concerned with the cases where this information is |
|
1011 |
+either directly reported or can be determined via a single use of an API or |
|
1012 |
+feature, and prefer to place such APIs either behind site permissions, or |
|
1013 |
+disable them entirely. |
|
1014 |
+ </p><p> |
|
1015 |
+ |
|
1016 |
+On the other hand, because statistical inference of system performance |
|
1017 |
+requires many iterations to achieve accuracy in the face of noise and |
|
1018 |
+concurrent activity, we are less concerned with this mechanism of extracting |
|
1019 |
+this information. We also expect that reducing the resolution of Javascript's |
|
1020 |
+time sources will significantly increase the duration of execution required to |
|
1021 |
+extract accurate results, and thus make statistical approaches both |
|
1022 |
+unattractive and highly noticeable due to excessive resource consumption. |
|
1023 |
+ |
|
1024 |
+ </p></li><li class="listitem"><span class="command"><strong>Operating System Vendor and Version Differences</strong></span><p> |
|
1025 |
+ |
|
1026 |
+Operating system vendor and version differences permeate many different |
|
1027 |
+aspects of the browser. While it is possible to address these issues with some |
|
1028 |
+effort, the relative lack of diversity in operating systems causes us to |
|
1029 |
+primarily focus our efforts on passive operating system fingerprinting |
|
1030 |
+mechanisms at this point in time. For the purposes of protecting user |
|
1031 |
+anonymity, it is not strictly essential that the operating system be |
|
1032 |
+completely concealed, though we recognize that it is useful to reduce this |
|
1033 |
+differentiation ability where possible, especially for cases where the |
|
1034 |
+specific version of a system can be inferred. |
|
1035 |
+ |
|
1036 |
+ </p></li><li class="listitem"><span class="command"><strong>Browser Vendor and Version Differences</strong></span><p> |
|
1037 |
+ |
|
1038 |
+Due to vast differences in feature set and implementation behavior even |
|
1039 |
+between different versions of the same browser, browser vendor and version |
|
1040 |
+differences are simply not possible to conceal in any realistic way. It |
|
1041 |
+is only possible to minimize the differences among different installations of |
|
1042 |
+the same browser vendor and version. We make no effort to mimic any other |
|
1043 |
+major browser vendor, and in fact most of our fingerprinting defenses serve to |
|
1044 |
+differentiate Tor Browser users from normal Firefox users. Because of this, |
|
1045 |
+any study that lumps browser vendor and version differences in to its analysis |
|
1046 |
+of the fingerprintability of a population is largely useless for evaluating |
|
1047 |
+either attacks or defenses. Unfortunately, this includes popular large-scale |
|
1048 |
+studies such as <a class="ulink" href="https://panopticlick.eff.org/" target="_top">Panopticlick</a> and <a class="ulink" href="https://amiunique.org/" target="_top">Am I Unique</a>. |
|
1049 |
+ |
|
1050 |
+ </p></li></ol></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="fingerprinting-defenses"></a>Fingerprinting defenses in the Tor Browser</h4></div></div></div><p> |
|
983 | 1051 |
|
984 | 1052 |
The following defenses are listed roughly in order of most severe |
985 |
-fingerprinting threat first. This ordering is based on the above intuition that |
|
986 |
-user configurable aspects of the computer are the most severe source of |
|
987 |
-fingerprintability, though we are in need of updated measurements to determine |
|
988 |
-this with certainty. |
|
1053 |
+fingerprinting threat first. This ordering is based on the above intuition |
|
1054 |
+that user configurable aspects of the computer are the most severe source of |
|
1055 |
+fingerprintability, followed by device characteristics and hardware, and then |
|
1056 |
+finally operating system vendor and version information. |
|
989 | 1057 |
|
990 | 1058 |
</p><p> |
991 |
-Where our actual implementation differs from |
|
992 |
-an ideal solution, we separately describe our <span class="command"><strong>Design Goal</strong></span> |
|
993 |
-and our <span class="command"><strong>Implementation Status</strong></span>. |
|
1059 |
+ |
|
1060 |
+Where our actual implementation differs from an ideal solution, we separately |
|
1061 |
+describe our <span class="command"><strong>Design Goal</strong></span> and our <span class="command"><strong>Implementation |
|
1062 |
+Status</strong></span>. |
|
994 | 1063 |
|
995 | 1064 |
</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">Plugins |
996 | 1065 |
<p> |
... | ... |
@@ -1017,8 +1086,9 @@ Currently, we entirely disable all plugins in Tor Browser. However, as a |
1017 | 1086 |
compromise due to the popularity of Flash, we allow users to re-enable Flash, |
1018 | 1087 |
and flash objects are blocked behind a click-to-play barrier that is available |
1019 | 1088 |
only after the user has specifically enabled plugins. Flash is the only plugin |
1020 |
-available, the rest are <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/1ef32dcf0cc64876f5b92a583b788dc921f22c5d" target="_top">entirely |
|
1021 |
-blocked from loading by a Firefox patch</a>. We also set the Firefox |
|
1089 |
+available, the rest are entirely |
|
1090 |
+blocked from loading by the Firefox patches mentioned in the <a class="link" href="#proxy-obedience" title="4.1. Proxy Obedience">Proxy Obedience |
|
1091 |
+section</a>. We also set the Firefox |
|
1022 | 1092 |
preference <span class="command"><strong>plugin.expose_full_path</strong></span> to false, to avoid |
1023 | 1093 |
leaking plugin installation information. |
1024 | 1094 |
|
... | ... |
@@ -1041,13 +1111,12 @@ image can be used almost identically to a tracking cookie by the web server. |
1041 | 1111 |
In some sense, the canvas can be seen as the union of many other |
1042 | 1112 |
fingerprinting vectors. If WebGL is normalized through software rendering, |
1043 | 1113 |
system colors were standardized, and the browser shipped a fixed collection of |
1044 |
-fonts (see later points in this list), it might not be necessary |
|
1045 |
-to create a canvas permission. However, until then, to reduce the threat from |
|
1046 |
-this vector, we have patched Firefox to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/3b53f525cfb68880e676e64f13cbc0b928ae3ecf" target="_top">prompt |
|
1047 |
-before returning valid image data</a> to the Canvas APIs, and for <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/fb9f463fe3a69499d6896c217786bafdf0cda62f" target="_top">access |
|
1048 |
-to isPointInPath and related functions</a>. If the user hasn't previously |
|
1049 |
-allowed the site in the URL bar to access Canvas image data, pure white image |
|
1050 |
-data is returned to the Javascript APIs. |
|
1114 |
+fonts (see later points in this list), it might not be necessary to create a |
|
1115 |
+canvas permission. However, until then, to reduce the threat from this vector, |
|
1116 |
+we have patched Firefox to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=6a169ef0166b268b1a27546a17b3d7470330917d" target="_top">prompt |
|
1117 |
+before returning valid image data</a> to the Canvas APIs. If the user |
|
1118 |
+hasn't previously allowed the site in the URL bar to access Canvas image data, |
|
1119 |
+pure white image data is returned to the Javascript APIs. |
|
1051 | 1120 |
|
1052 | 1121 |
</p><p> |
1053 | 1122 |
</p></li><li class="listitem">Open TCP Port Fingerprinting |
... | ... |
@@ -1055,22 +1124,25 @@ data is returned to the Javascript APIs. |
1055 | 1124 |
|
1056 | 1125 |
In Firefox, by using either WebSockets or XHR, it is possible for remote |
1057 | 1126 |
content to <a class="ulink" href="http://www.andlabs.org/tools/jsrecon.html" target="_top">enumerate |
1058 |
-the list of TCP ports open on 127.0.0.1</a>. In other browsers, this can |
|
1059 |
-be accomplished by DOM events on image or script tags. This open vs filtered |
|
1060 |
-vs closed port list can provide a very unique fingerprint of a machine, |
|
1061 |
-because it essentially enables the detection of many different popular third |
|
1062 |
-party applications and optional system services (Skype, Bitcoin, Bittorrent |
|
1063 |
-and other P2P software, SSH ports, SMB and related LAN services, CUPS and |
|
1064 |
-printer daemon config ports, mail servers, and so on). It is also possible to |
|
1065 |
-determine when ports are closed versus filtered/blocked (and thus probe |
|
1066 |
-custom firewall configuration). |
|
1067 |
- |
|
1068 |
- </p><p>In Tor Browser, we prevent access to |
|
1069 |
-127.0.0.1/localhost by ensuring that even these requests are still sent by |
|
1070 |
-Firefox to our SOCKS proxy (ie we set |
|
1127 |
+the list of TCP ports open on 127.0.0.1</a>, as well as on any other |
|
1128 |
+machines on the local network. In other browsers, this can be accomplished by |
|
1129 |
+DOM events on image or script tags. This open vs filtered vs closed port list |
|
1130 |
+can provide a very unique fingerprint of a machine, because it essentially |
|
1131 |
+enables the detection of many different popular third party applications and |
|
1132 |
+optional system services (Skype, Bitcoin, Bittorrent and other P2P software, |
|
1133 |
+SSH ports, SMB and related LAN services, CUPS and printer daemon config ports, |
|
1134 |
+mail servers, and so on). It is also possible to determine when ports are |
|
1135 |
+closed versus filtered/blocked (and thus probe custom firewall configuration). |
|
1136 |
+ |
|
1137 |
+ </p><p> |
|
1138 |
+ |
|
1139 |
+In Tor Browser, we prevent access to 127.0.0.1/localhost by ensuring that even |
|
1140 |
+these requests are still sent by Firefox to our SOCKS proxy (ie we set |
|
1071 | 1141 |
<span class="command"><strong>network.proxy.no_proxies_on</strong></span> to the empty string). The local |
1072 | 1142 |
Tor client then rejects them, since it is configured to proxy for internal IP |
1073 |
-addresses by default. |
|
1143 |
+addresses by default. Access to the local network is forbidden via the same |
|
1144 |
+mechanism. |
|
1145 |
+ |
|
1074 | 1146 |
</p></li><li class="listitem">Invasive Authentication Mechanisms (NTLM and SPNEGO) |
1075 | 1147 |
<p> |
1076 | 1148 |
|
... | ... |
@@ -1127,7 +1199,7 @@ considerably larger than the combination of the Droid, Nanum, and Lohit fonts. |
1127 | 1199 |
In the meantime while we investigate shipping our own fonts, we disable |
1128 | 1200 |
plugins, which prevents font name enumeration. Additionally, we limit both the |
1129 | 1201 |
number of font queries from CSS, as well as the total number of fonts that can |
1130 |
-be used in a document <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/d515c79ffd115b132caade7f881e5b467448964d" target="_top">with |
|
1202 |
+be used in a document <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=e78bc05159a79c1358fa9c64e565af9d98c141ee" target="_top">with |
|
1131 | 1203 |
a Firefox patch</a>. We create two prefs, |
1132 | 1204 |
<span class="command"><strong>browser.display.max_font_attempts</strong></span> and |
1133 | 1205 |
<span class="command"><strong>browser.display.max_font_count</strong></span> for this purpose. Once these |
... | ... |
@@ -1170,18 +1242,22 @@ this scheme. |
1170 | 1242 |
|
1171 | 1243 |
</p><p><span class="command"><strong>Implementation Status:</strong></span> |
1172 | 1244 |
|
1173 |
- |
|
1174 |
-We have implemented the above strategy using a window observer to <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/blob/HEAD:/src/chrome/content/torbutton.js#l2960" target="_top">resize |
|
1175 |
-new windows based on desktop resolution</a>. Additionally, we patch |
|
1176 |
-Firefox to use the client content window size <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/8fc2421becd0ab0cfb5ebbc19af67469552202b2" target="_top">for |
|
1177 |
-window.screen</a>. Similarly, we <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/81e7fc3a10d27b1d8f0832faf1685899d21f6fef" target="_top">patch |
|
1178 |
-DOM events to return content window relative points</a>. We also force |
|
1245 |
+We automatically resize new browser windows to a 200x100 pixel multiple using |
|
1246 |
+a window observer to <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/tree/src/chrome/content/torbutton.js#n3361" target="_top">resize |
|
1247 |
+new windows based on desktop resolution</a>. To minimize the effect of the |
|
1248 |
+long tail of large monitor sizes, we also cap the the window size at 1000 |
|
1249 |
+pixels in each direction. Additionally, we patch |
|
1250 |
+Firefox to use the client content window size <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=bd3b1ed32a9c21fdc92fc35f2ec0a41badc378d5" target="_top">for |
|
1251 |
+window.screen</a>, and to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=a5648c8d80f396caf294d761cc4a9a76c0b33a9d" target="_top">report |
|
1252 |
+a window.devicePixelRatio of 1.0</a>. Similarly, we <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=3c02858027634ffcfbd97047dfdf170c19ca29ec" target="_top">patch |
|
1253 |
+DOM events to return content window relative points</a>. We also |
|
1254 |
+ |
|
1255 |
+We also force |
|
1179 | 1256 |
popups to open in new tabs (via |
1180 | 1257 |
<span class="command"><strong>browser.link.open_newwindow.restriction</strong></span>), to avoid |
1181 | 1258 |
full-screen popups inferring information about the browser resolution. In |
1182 |
-addition, we prevent auto-maximizing on browser start, and are investigating a |
|
1183 |
-user-friendly way of informing users that maximized windows are detrimental |
|
1184 |
-to privacy in this mode. |
|
1259 |
+addition, we prevent auto-maximizing on browser start, and inform users that |
|
1260 |
+maximized windows are detrimental to privacy in this mode. |
|
1185 | 1261 |
|
1186 | 1262 |
</p></li><li class="listitem">Display Media information |
1187 | 1263 |
<p> |
... | ... |
@@ -1204,10 +1280,10 @@ details such as screen orientation or type. |
1204 | 1280 |
</p><p><span class="command"><strong>Implementation Status:</strong></span> |
1205 | 1281 |
|
1206 | 1282 |
We patch |
1207 |
-Firefox to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/30dc2c4290698af81ceafae9d628a34c53faabe1" target="_top">report |
|
1208 |
-a fixed set of system colors to content window CSS</a>, and <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/8f6e979d30598569dea14ac6f4eef4e96543b3d7" target="_top">prevent |
|
1209 |
-detection of font smoothing on Mac OS X</a>. We also always |
|
1210 |
-<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/09561f0e5452305b9efcb4e6169c613c8db33246" target="_top">report |
|
1283 |
+Firefox to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=cf8956b4460107c5b0053c8fc574e34b0a30ec1e" target="_top">report |
|
1284 |
+a fixed set of system colors to content window CSS</a>, and <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=bbc138486e0489b0d559343fa0522df4ee3b3533" target="_top">prevent |
|
1285 |
+detection of font smoothing on OSX</a>. We also always |
|
1286 |
+<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=e17d60442ab0db92664ff68d90fe7bf737374912" target="_top">report |
|
1211 | 1287 |
landscape-primary</a> for the screen orientation. |
1212 | 1288 |
|
1213 | 1289 |
</p></li><li class="listitem">WebGL |
... | ... |
@@ -1249,7 +1325,7 @@ these headers should remain identical across the population even when updated. |
1249 | 1325 |
Firefox provides several options for controlling the browser user agent string |
1250 | 1326 |
which we leverage. We also set similar prefs for controlling the |
1251 | 1327 |
Accept-Language and Accept-Charset headers, which we spoof to English by default. Additionally, we |
1252 |
-<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/95cd0e8071aa1fe3f4914331d4036f218007e31d" target="_top">remove |
|
1328 |
+<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=e9841ee41e7f3f1535be2d605084c41ee9faf6c2" target="_top">remove |
|
1253 | 1329 |
content script access</a> to Components.interfaces, which <a class="ulink" href="http://pseudo-flaw.net/tor/torbutton/fingerprint-firefox.html" target="_top">can be |
1254 | 1330 |
used</a> to fingerprint OS, platform, and Firefox minor version. </p></li><li class="listitem">Locale Fingerprinting |
1255 | 1331 |
<p> |
... | ... |
@@ -1263,7 +1339,7 @@ completeness, we attempt to maintain this property. |
1263 | 1339 |
|
1264 | 1340 |
We set the fallback character set to set to windows-1252 for all locales, via |
1265 | 1341 |
<span class="command"><strong>intl.charset.default</strong></span>. We also patch Firefox to allow us to |
1266 |
-<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/fe42a78575df7f460fa0ac48eabb57bc8812c23e" target="_top">instruct |
|
1342 |
+<a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=4545ecd6dc2ca7d10aefe36b81658547ea97b800" target="_top">instruct |
|
1267 | 1343 |
the JS engine</a> to use en-US as its internal C locale for all Date, Math, |
1268 | 1344 |
and exception handling. |
1269 | 1345 |
|
... | ... |
@@ -1320,10 +1396,12 @@ large number of people. |
1320 | 1396 |
|
1321 | 1397 |
</p><p><span class="command"><strong>Implementation Status:</strong></span> |
1322 | 1398 |
|
1323 |
-Currently, the only mitigation against performance fingerprinting is to |
|
1399 |
+Currently, the our mitigation against performance fingerprinting is to |
|
1324 | 1400 |
disable <a class="ulink" href="http://www.w3.org/TR/navigation-timing/" target="_top">Navigation |
1325 | 1401 |
Timing</a> through the Firefox preference |
1326 |
-<span class="command"><strong>dom.enable_performance</strong></span>. |
|
1402 |
+<span class="command"><strong>dom.enable_performance</strong></span>, and to disable the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement#Gecko-specific_properties" target="_top">Mozilla |
|
1403 |
+Video Statistics</a> API extensions via the preference |
|
1404 |
+<span class="command"><strong>media.video_stats.enabled</strong></span>. |
|
1327 | 1405 |
|
1328 | 1406 |
</p></li><li class="listitem">Keystroke Fingerprinting |
1329 | 1407 |
<p> |
... | ... |
@@ -1347,8 +1425,8 @@ characteristics of the operating system type may leak into content, and the |
1347 | 1425 |
comparatively low contribution of OS to overall entropy. In particular, there |
1348 | 1426 |
are likely to be many ways to measure the differences in widget size, |
1349 | 1427 |
scrollbar size, and other rendered details on a page. Also, directly exported |
1350 |
-OS routines, such as the Math library, expose differences in their |
|
1351 |
-implementations due to these results. |
|
1428 |
+OS routines (such as those from the standard C math library) expose |
|
1429 |
+differences in their implementations through their return values. |
|
1352 | 1430 |
|
1353 | 1431 |
</p><p><span class="command"><strong>Design Goal:</strong></span> |
1354 | 1432 |
|
... | ... |
@@ -1362,26 +1440,27 @@ tag on our bug tracker</a>. |
1362 | 1440 |
|
1363 | 1441 |
</p><p><span class="command"><strong>Implementation Status:</strong></span> |
1364 | 1442 |
|
1365 |
-At least two HTML5 features have different implementation status across the |
|
1366 |
-major OS vendors: the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/DOM/window.navigator.battery" target="_top">Battery |
|
1367 |
-API</a> and the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/DOM/window.navigator.connection" target="_top">Network |
|
1368 |
-Connection API</a>. We disable these APIs through the Firefox preferences |
|
1369 |
-<span class="command"><strong>dom.battery.enabled</strong></span> and |
|
1370 |
-<span class="command"><strong>dom.network.enabled</strong></span>. |
|
1443 |
+At least three HTML5 features have different implementation status across the |
|
1444 |
+major OS vendors and/or the underlying hardware: the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/DOM/window.navigator.battery" target="_top">Battery |
|
1445 |
+API</a>, the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/DOM/window.navigator.connection" target="_top">Network |
|
1446 |
+Connection API</a>, and the <a class="ulink" href="https://wiki.mozilla.org/Sensor_API" target="_top">Sensor API</a>. We disable these APIs through the Firefox preferences |
|
1447 |
+<span class="command"><strong>dom.battery.enabled</strong></span>, |
|
1448 |
+<span class="command"><strong>dom.network.enabled</strong></span>, and |
|
1449 |
+<span class="command"><strong>device.sensors.enabled</strong></span>. |
|
1371 | 1450 |
|
1372 |
- </p></li></ol></div></div><p> |
|
1451 |
+ </p></li></ol></div><p> |
|
1373 | 1452 |
For more details on fingerprinting bugs and enhancements, see the <a class="ulink" href="https://trac.torproject.org/projects/tor/query?keywords=~tbb-fingerprinting&status=!closed" target="_top">tbb-fingerprinting tag in our bug tracker</a> |
1374 |
- </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="new-identity"></a>4.7. Long-Term Unlinkability via "New Identity" button</h3></div></div></div><p> |
|
1453 |
+ </p></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="new-identity"></a>4.7. Long-Term Unlinkability via "New Identity" button</h3></div></div></div><p> |
|
1375 | 1454 |
|
1376 | 1455 |
In order to avoid long-term linkability, we provide a "New Identity" context |
1377 | 1456 |
menu option in Torbutton. This context menu option is active if Torbutton can |
1378 | 1457 |
read the environment variables $TOR_CONTROL_PASSWD and $TOR_CONTROL_PORT. |
1379 | 1458 |
|
1380 |
- </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp60545136"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"> |
|
1459 |
+ </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp54050880"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"> |
|
1381 | 1460 |
|
1382 | 1461 |
All linkable identifiers and browser state MUST be cleared by this feature. |
1383 | 1462 |
|
1384 |
- </blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp60546384"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p> |
|
1463 |
+ </blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp54052128"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p> |
|
1385 | 1464 |
|
1386 | 1465 |
First, Torbutton disables Javascript in all open tabs and windows by using |
1387 | 1466 |
both the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIDocShell#Attributes" target="_top">browser.docShell.allowJavascript</a> |
... | ... |
@@ -1409,8 +1488,13 @@ After the state is cleared, we then close all remaining HTTP keep-alive |
1409 | 1488 |
connections and then send the NEWNYM signal to the Tor control port to cause a |
1410 | 1489 |
new circuit to be created. |
1411 | 1490 |
</p><p> |
1491 |
+ |
|
1412 | 1492 |
Finally, a fresh browser window is opened, and the current browser window is |
1413 |
-closed (this does not spawn a new Firefox process, only a new window). |
|
1493 |
+closed (this does not spawn a new Firefox process, only a new window). Upon |
|
1494 |
+the close of the final window, an unload handler is fired to invoke the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIDOMWindowUtils#garbageCollect%28%29" target="_top">garbage |
|
1495 |
+collector</a>, which has the effect of immediately purging any blob:UUID |
|
1496 |
+URLs that were created by website content via <a class="ulink" href="https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL" target="_top">URL.createObjectURL</a>. |
|
1497 |
+ |
|
1414 | 1498 |
</p></blockquote></div><div class="blockquote"><blockquote class="blockquote"> |
1415 | 1499 |
If the user chose to "protect" any cookies by using the Torbutton Cookie |
1416 | 1500 |
Protections UI, those cookies are not cleared as part of the above. |
... | ... |
@@ -1423,45 +1507,58 @@ privacy and security issues. |
1423 | 1507 |
</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a id="security-slider"></a><span class="command"><strong>Security Slider</strong></span><p> |
1424 | 1508 |
|
1425 | 1509 |
In order to provide vulnerability surface reduction for users that need high |
1426 |
-security, we have implemented a "Security Slider" that essentially represents a |
|
1427 |
-tradeoff between usability and security. Using metrics collected from |
|
1428 |
-Mozilla's bug tracker, we analyzed the vulnerability counts of core components, |
|
1429 |
-and used <a class="ulink" href="https://github.com/iSECPartners/publications/tree/master/reports/Tor%20Browser%20Bundle" target="_top">information |
|
1510 |
+security, we have implemented a "Security Slider" to allow users to make a |
|
1511 |
+tradeoff between usability and security while minimizing the total number of |
|
1512 |
+choices (to reduce fingerprinting). Using metrics collected from |
|
1513 |
+Mozilla's bug tracker, we analyzed the vulnerability counts of core |
|
1514 |
+components, and used <a class="ulink" href="https://github.com/iSECPartners/publications/tree/master/reports/Tor%20Browser%20Bundle" target="_top">information |
|
1430 | 1515 |
gathered from a study performed by iSec Partners</a> to inform which |
1431 | 1516 |
features should be disabled at which security levels. |
1432 | 1517 |
|
1433 | 1518 |
</p><p> |
1434 | 1519 |
|
1435 |
-The Security Slider consists of four positions. At the lowest security level |
|
1436 |
-(the default), we disable |
|
1437 |
-<span class="command"><strong>gfx.font_rendering.graphite.enabled</strong></span> for Latin locales, as |
|
1438 |
-well as <span class="command"><strong>gfx.font_rendering.graphite.enabled</strong></span>. At the |
|
1439 |
-medium-low level, we disable most Javascript JIT and related optimizations |
|
1440 |
-(<span class="command"><strong>javascript.options.ion.content</strong></span>, |
|
1441 |
-<span class="command"><strong>javascript.options.typeinference</strong></span>, |
|
1442 |
-<span class="command"><strong>javascript.options.asmjs</strong></span>). We also make HTML5 media |
|
1443 |
-click-to-play (<span class="command"><strong>noscript.forbidMedia</strong></span>), and disable WebAudio |
|
1444 |
-(<span class="command"><strong>media.webaudio.enabled</strong></span>). At the medium-high level, we |
|
1445 |
-disable the baseline JIT |
|
1446 |
-(<span class="command"><strong>javascript.options.baselinejit.content</strong></span>), disable |
|
1447 |
-Javascript entirely all elements that are loaded when the URL bar is not |
|
1448 |
-HTTPS (<span class="command"><strong>noscript.globalHttpsWhitelist</strong></span>), and fully disable |
|
1449 |
-graphite font rendering for all locales |
|
1450 |
-(<span class="command"><strong>gfx.font_rendering.graphite.enable</strong></span>). At the highest level, |
|
1451 |
-Javascript is fully disabled (<span class="command"><strong>noscript.global</strong></span>), as well as |
|
1452 |
-all non-WebM HTML5 codecs (<span class="command"><strong>media.ogg.enabled</strong></span>, |
|
1453 |
-<span class="command"><strong>media.opus.enabled</strong></span>, <span class="command"><strong>media.opus.enabled</strong></span>, |
|
1454 |
-<span class="command"><strong>media.DirectShow.enabled</strong></span>, |
|
1455 |
-<span class="command"><strong>media.wave.enabled</strong></span>, and |
|
1456 |
-<span class="command"><strong>media.apple.mp3.enabled</strong></span>). |
|
1457 |
- |
|
1458 |
- </p></li><li class="listitem"><a id="traffic-fingerprinting-defenses"></a><span class="command"><strong>Website Traffic Fingerprinting Defenses</strong></span><p> |
|
1520 |
+The Security Slider consists of four positions: |
|
1521 |
+ |
|
1522 |
+ </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><span class="command"><strong>Low</strong></span><p> |
|
1523 |
+ |
|
1524 |
+At this security level, the preferences are the Tor Browser defaults. |
|
1525 |
+ |
|
1526 |
+ </p></li><li class="listitem"><span class="command"><strong>Medium-Low</strong></span><p> |
|
1527 |
+ |
|
1528 |
+At this security level, we disable the ION JIT |
|
1529 |
+(<span class="command"><strong>javascript.options.ion.content</strong></span>), TypeInference JIT |
|
1530 |
+(<span class="command"><strong>javascript.options.typeinference</strong></span>), ASM.JS |
|
1531 |
+(<span class="command"><strong>javascript.options.asmjs</strong></span>), WebAudio |
|
1532 |
+(<span class="command"><strong>media.webaudio.enabled</strong></span>), MathML |
|
1533 |
+(<span class="command"><strong>mathml.disabled</strong></span>), block remote JAR files |
|
1534 |
+(<span class="command"><strong>network.jar.block-remote-files</strong></span>), and make HTML5 audio and |
|
1535 |
+video click-to-play via NoScript (<span class="command"><strong>noscript.forbidMedia</strong></span>). |
|
1536 |
+ |
|
1537 |
+ </p></li><li class="listitem"><span class="command"><strong>Medium-High</strong></span><p> |
|
1538 |
+ |
|
1539 |
+This security level inherits the preferences from the Medium-Low level, and |
|
1540 |
+additionally disables the baseline JIT |
|
1541 |
+(<span class="command"><strong>javascript.options.baselinejit.content</strong></span>), disables graphite |
|
1542 |
+font rendering (<span class="command"><strong>gfx.font_rendering.graphite.enabled</strong></span>), and |
|
1543 |
+only allows Javascript to run if it is loaded over HTTPS and the URL bar is |
|
1544 |
+HTTPS (by setting <span class="command"><strong>noscript.global</strong></span> to false and |
|
1545 |
+<span class="command"><strong>noscript.globalHttpsWhitelist</strong></span> to true). |
|
1546 |
+ |
|
1547 |
+ </p></li><li class="listitem"><span class="command"><strong>High</strong></span><p> |
|
1548 |
+ |
|
1549 |
+This security level inherits the preferences from the Medium-Low and |
|
1550 |
+Medium-High levels, and additionally disables remote fonts |
|
1551 |
+(<span class="command"><strong>noscript.forbidFonts</strong></span>), completely disables Javascript (by |
|
1552 |
+unsetting <span class="command"><strong>noscript.globalHttpsWhitelist</strong></span>), and disables SVG |
|
1553 |
+images (<span class="command"><strong>svg.in-content.enabled</strong></span>). |
|
1554 |
+ |
|
1555 |
+ </p></li></ul></div></li><li class="listitem"><a id="traffic-fingerprinting-defenses"></a><span class="command"><strong>Website Traffic Fingerprinting Defenses</strong></span><p> |
|
1459 | 1556 |
|
1460 | 1557 |
<a class="link" href="#website-traffic-fingerprinting">Website Traffic |
1461 | 1558 |
Fingerprinting</a> is a statistical attack to attempt to recognize specific |
1462 | 1559 |
encrypted website activity. |
1463 | 1560 |
|
1464 |
- </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp60574784"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p> |
|
1561 |
+ </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp54085840"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p> |
|
1465 | 1562 |
|
1466 | 1563 |
We want to deploy a mechanism that reduces the accuracy of <a class="ulink" href="https://en.wikipedia.org/wiki/Feature_selection" target="_top">useful features</a> available |
1467 | 1564 |
for classification. This mechanism would either impact the true and false |
... | ... |
@@ -1483,8 +1580,8 @@ Congestion-Sensitive BUFLO</a>. It may be also possible to <a class="ulink" href |
1483 | 1580 |
defenses</a> such that they only use existing spare Guard bandwidth capacity in the Tor |
1484 | 1581 |
network, making them also effectively no-overhead. |
1485 | 1582 |
|
1486 |
- </p></blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp60581680"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p> |
|
1487 |
-Currently, we patch Firefox to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/27ef32d509ed1c9eeb28f7affee0f9ba11773f72" target="_top">randomize |
|
1583 |
+ </p></blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp54092736"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p> |
|
1584 |
+Currently, we patch Firefox to <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=20a59cec9886cf2575b1fd8e92b43e31ba053fbd" target="_top">randomize |
|
1488 | 1585 |
pipeline order and depth</a>. Unfortunately, pipelining is very fragile. |
1489 | 1586 |
Many sites do not support it, and even sites that advertise support for |
1490 | 1587 |
pipelining may simply return error codes for successive requests, effectively |
... | ... |
@@ -1493,7 +1590,7 @@ off and reduce or eliminate the pipeline if this happens. These |
1493 | 1590 |
shortcomings and fallback behaviors are the primary reason that Google |
1494 | 1591 |
developed SPDY as opposed simply extending HTTP to improve pipelining. It |
1495 | 1592 |
turns out that we could actually deploy exit-side proxies that allow us to |
1496 |
-<a class="ulink" href="https://gitweb.torproject.org/torspec.git/blob/HEAD:/proposals/ideas/xxx-using-spdy.txt" target="_top">use |
|
1593 |
+<a class="ulink" href="https://gitweb.torproject.org/torspec.git/tree/proposals/ideas/xxx-using-spdy.txt" target="_top">use |
|
1497 | 1594 |
SPDY from the client to the exit node</a>. This would make our defense not |
1498 | 1595 |
only free, but one that actually <span class="emphasis"><em>improves</em></span> performance. |
1499 | 1596 |
|
... | ... |
@@ -1535,7 +1632,7 @@ date. |
1535 | 1632 |
|
1536 | 1633 |
</p><p> |
1537 | 1634 |
|
1538 |
-We also make use of the in-browser Mozilla updater, and have <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commitdiff/777695d09e3cff4c79c48839e1c9d5102b772d6f" target="_top">patched |
|
1635 |
+We also make use of the in-browser Mozilla updater, and have <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&id=bcf51aae541fc28de251924ce9394224bd2b814c" target="_top">patched |
|
1539 | 1636 |
the updater</a> to avoid sending OS and Kernel version information as part |
1540 | 1637 |
of its update pings. |
1541 | 1638 |
|
... | ... |
@@ -1548,7 +1645,7 @@ contend with. For this reason, we have deployed a build system |
1548 | 1645 |
that allows anyone to use our source code to reproduce byte-for-byte identical |
1549 | 1646 |
binary packages to the ones that we distribute. |
1550 | 1647 |
|
1551 |
- </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp60597904"></a>5.1. Achieving Binary Reproducibility</h3></div></div></div><p> |
|
1648 |
+ </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp54108896"></a>5.1. Achieving Binary Reproducibility</h3></div></div></div><p> |
|
1552 | 1649 |
|
1553 | 1650 |
The GNU toolchain has been working on providing reproducible builds for some |
1554 | 1651 |
time, however a large software project such as Firefox typically ends up |
... | ... |
@@ -1598,9 +1695,9 @@ The fix for this is to perform an additional sorting step on the input list |
1598 | 1695 |
for archives, but care must be taken to instruct libc and other sorting routines |
1599 | 1696 |
to use a fixed locale to determine lexicographic ordering, or machines with |
1600 | 1697 |
different locale settings will produce different sort results. We chose the |
1601 |
-'C' locale for this purpose. We created wrapper scripts for <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/blob/HEAD:/gitian/build-helpers/dtar.sh" target="_top">tar</a>, |
|
1602 |
-<a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/blob/HEAD:/gitian/build-helpers/dzip.sh" target="_top">zip</a>, |
|
1603 |
-and <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/blob/HEAD:/gitian/build-helpers/ddmg.sh" target="_top">DMG</a> |
|
1698 |
+'C' locale for this purpose. We created wrapper scripts for <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/gitian/build-helpers/dtar.sh" target="_top">tar</a>, |
|
1699 |
+<a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/gitian/build-helpers/dzip.sh" target="_top">zip</a>, |
|
1700 |
+and <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/gitian/build-helpers/ddmg.sh" target="_top">DMG</a> |
|
1604 | 1701 |
to aid in reproducible archive creation. |
1605 | 1702 |
|
1606 | 1703 |
</p></li><li class="listitem">Uninitialized memory in toolchain/archivers |
... | ... |
@@ -1609,7 +1706,7 @@ to aid in reproducible archive creation. |
1609 | 1706 |
We ran into difficulties with both binutils and the DMG archive script using |
1610 | 1707 |
uninitialized memory in certain data structures that ended up written to disk. |
1611 | 1708 |
Our binutils fixes were merged upstream, but the DMG archive fix remains an |
1612 |
-<a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/blob/HEAD:/gitian/patches/libdmg.patch" target="_top">independent |
|
1709 |
+<a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/gitian/patches/libdmg.patch" target="_top">independent |
|
1613 | 1710 |
patch</a>. |
1614 | 1711 |
|
1615 | 1712 |
</p></li><li class="listitem">Fine-grained timestamps and timezone leaks |
... | ... |
@@ -1618,7 +1715,7 @@ patch</a>. |
1618 | 1715 |
The standard way of controlling timestamps in Gitian is to use libfaketime, |
1619 | 1716 |
which hooks time-related library calls to provide a fixed timestamp. However, |
1620 | 1717 |
due to our use of wine to run py2exe for python-based pluggable transports, |
1621 |
-pyc timestamps had to be address with an additional <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/blob/HEAD:/gitian/build-helpers/pyc-timestamp.sh" target="_top">helper |
|
1718 |
+pyc timestamps had to be address with an additional <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/gitian/build-helpers/pyc-timestamp.sh" target="_top">helper |
|
1622 | 1719 |
script</a>. The timezone leaks were addressed by setting the |
1623 | 1720 |
<span class="command"><strong>TZ</strong></span> environment variable to UTC in our descriptors. |
1624 | 1721 |
|
... | ... |
@@ -1665,7 +1762,7 @@ unitialized memory</a> that only appear in LXC mode, as well as |
1665 | 1762 |
<a class="ulink" href="https://trac.torproject.org/projects/tor/ticket/12240" target="_top">oddities related to |
1666 | 1763 |
time-based dependency tracking</a> that only appear in LXC containers. |
1667 | 1764 |
|
1668 |
- </p></li></ol></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp60632800"></a>5.2. Package Signatures and Verification</h3></div></div></div><p> |
|
1765 |
+ </p></li></ol></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp54129600"></a>5.2. Package Signatures and Verification</h3></div></div></div><p> |
|
1669 | 1766 |
|
1670 | 1767 |
The build process produces a single sha256sums.txt file that contains a sorted |
1671 | 1768 |
list of the SHA-256 hashes of every package produced for that build version. Each |
... | ... |
@@ -1693,13 +1790,12 @@ consensus, and encoding the package hashes in the Bitcoin blockchain. |
1693 | 1790 |
|
1694 | 1791 |
</p><p> |
1695 | 1792 |
|
1696 |
-At the time of this writing, we do not yet support native code signing for Mac |
|
1697 |
-OS or Windows. Because these signatures are embedded in the actual packages, |
|
1698 |
-and by their nature are based on non-public key material, providing native |
|
1699 |
-code-signed packages while still preserving ease of reproducibility |
|
1700 |
-verification has not yet been achieved. |
|
1793 |
+The Windows releases are also signed by a hardware token provided by Digicert. |
|
1794 |
+In order to verify package integrity, the signature must be stripped off using |
|
1795 |
+the osslsigncode tool, as described on the <a class="ulink" href="https://www.torproject.org/docs/verifying-signatures.html.en#BuildVerification" target="_top">Signature |
|
1796 |
+Verification</a> page. |
|
1701 | 1797 |
|
1702 |
- </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp60636736"></a>5.3. Anonymous Verification</h3></div></div></div><p> |
|
1798 |
+ </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp54134112"></a>5.3. Anonymous Verification</h3></div></div></div><p> |
|
1703 | 1799 |
|
1704 | 1800 |
Due to the fact that bit-identical packages can be produced by anyone, the |
1705 | 1801 |
security of this build system extends beyond the security of the official |
... | ... |
@@ -1718,6 +1814,22 @@ the public builders/signers, hopefully using a pseudonym or our anonymous |
1718 | 1814 |
bug tracker account, to avoid revealing the fact that they are a build |
1719 | 1815 |
verifier. |
1720 | 1816 |
|
1817 |
+ </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="update-safety"></a>5.4. Update Safety</h3></div></div></div><p> |
|
1818 |
+ |
|
1819 |
+We make use of the Firefox updater in order to provide automatic updates to |
|
1820 |
+users. We make use of certificate pinning to ensure that update checks |
|
1821 |
+be tampered with, and we sign the individual MAR update files with an offline |
|
1822 |
+signing key. |
|
1823 |
+ |
|
1824 |
+ </p><p> |
|
1825 |
+ |
|
1826 |
+The Firefox updater also has code to ensure that it can reliably access the |
|
1827 |
+update server to prevent availability attacks, and complains to the user of 48 |
|
1828 |
+hours go by without a successful response from the server. Additionally, we |
|
1829 |
+use Tor's SOCKS username and password isolation to ensure that every new |
|
1830 |
+request to the updater traverses a separate circuit, to avoid holdback attacks |
|
1831 |
+by exit nodes. |
|
1832 |
+ |
|
1721 | 1833 |
</p></div></div><div class="appendix"><h2 class="title" style="clear: both"><a id="Transparency"></a>A. Towards Transparency in Navigation Tracking</h2><p> |
1722 | 1834 |
|
1723 | 1835 |
The <a class="link" href="#privacy" title="2.2. Privacy Requirements">privacy properties</a> of Tor Browser are based |
... | ... |
@@ -1815,7 +1927,7 @@ possible for us to <a class="ulink" href="https://trac.torproject.org/projects/t |
1815 | 1927 |
ourselves</a>, as they are comparatively rare and can be handled with site |
1816 | 1928 |
permissions. |
1817 | 1929 |
|
1818 |
- </p></li></ol></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="idp60669376"></a>A.2. Promising Standards</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="ulink" href="http://web-send.org" target="_top">Web-Send Introducer</a><p> |
|
1930 |
+ </p></li></ol></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="idp54168528"></a>A.2. Promising Standards</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="ulink" href="http://web-send.org" target="_top">Web-Send Introducer</a><p> |
|
1819 | 1931 |
|
1820 | 1932 |
Web-Send is a browser-based link sharing and federated login widget that is |
1821 | 1933 |
designed to operate without relying on third-party tracking or abusing other |
1822 | 1934 |