Update Tor Browser design doc.
Mike Perry

Mike Perry commited on 2015-05-06 07:40:50
Zeige 1 geänderte Dateien mit 308 Einfügungen und 181 Löschungen.

... ...
@@ -1,5 +1,5 @@
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">&lt;<a class="email" href="mailto:mikeperry#torproject org">mikeperry#torproject org</a>&gt;</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">&lt;<a class="email" href="mailto:erinn#torproject org">erinn#torproject org</a>&gt;</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">&lt;<a class="email" href="mailto:sjmurdoch#torproject org">sjmurdoch#torproject org</a>&gt;</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>
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">&lt;<a class="email" href="mailto:mikeperry#torproject org">mikeperry#torproject org</a>&gt;</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">&lt;<a class="email" href="mailto:erinn#torproject org">erinn#torproject org</a>&gt;</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">&lt;<a class="email" href="mailto:sjmurdoch#torproject org">sjmurdoch#torproject org</a>&gt;</code></p></div></div></div></div><div><p class="pubdate">May 5th, 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="#idp64554400">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="#idp66457392">5.1. Achieving Binary Reproducibility</a></span></dt><dt><span class="sect2"><a href="#idp66479152">5.2. Package Signatures and Verification</a></span></dt><dt><span class="sect2"><a href="#idp66483680">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="#idp66520624">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="idp64554400"></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
... ...
@@ -129,16 +129,16 @@ to prefer one browser over another.
129 129
 
130 130
 For the purposes of the unlinkability requirements of this section as well as
131 131
 the descriptions in the <a class="link" href="#Implementation" title="4. Implementation">implementation
132
-section</a>, a <span class="command"><strong>url bar origin</strong></span> means at least the
132
+section</a>, a <span class="command"><strong>URL bar origin</strong></span> means at least the
133 133
 second-level DNS name.  For example, for mail.google.com, the origin would be
134
-google.com. Implementations MAY, at their option, restrict the url bar origin
134
+google.com. Implementations MAY, at their option, restrict the URL bar origin
135 135
 to be the entire fully qualified domain name.
136 136
 
137 137
    </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="link" href="#identifier-linkability" title="4.5. Cross-Origin Identifier Unlinkability"><span class="command"><strong>Cross-Origin
138 138
 Identifier Unlinkability</strong></span></a><p>
139 139
 
140
-User activity on one url bar origin MUST NOT be linkable to their activity in
141
-any other url bar origin by any third party automatically or without user
140
+User activity on one URL bar origin MUST NOT be linkable to their activity in
141
+any other URL bar origin by any third party automatically or without user
142 142
 interaction or approval. This requirement specifically applies to linkability
143 143
 from stored browser identifiers, authentication tokens, and shared state. The
144 144
 requirement does not apply to linkable information the user manually submits
... ...
@@ -149,8 +149,8 @@ login in a substantial way.
149 149
   </p></li><li class="listitem"><a class="link" href="#fingerprinting-linkability" title="4.6. Cross-Origin Fingerprinting Unlinkability"><span class="command"><strong>Cross-Origin
150 150
 Fingerprinting Unlinkability</strong></span></a><p>
151 151
 
152
-User activity on one url bar origin MUST NOT be linkable to their activity in
153
-any other url bar origin by any third party. This property specifically applies to
152
+User activity on one URL bar origin MUST NOT be linkable to their activity in
153
+any other URL bar origin by any third party. This property specifically applies to
154 154
 linkability from fingerprinting browser behavior.
155 155
 
156 156
   </p></li><li class="listitem"><a class="link" href="#new-identity" title="4.7. Long-Term Unlinkability via &quot;New Identity&quot; button"><span class="command"><strong>Long-Term
... ...
@@ -204,7 +204,7 @@ Therefore, if plugins are to be enabled in private browsing modes, they must
204 204
 be restricted from running automatically on every page (via click-to-play
205 205
 placeholders), and/or be sandboxed to restrict the types of system calls they
206 206
 can execute. If the user agent allows the user to craft an exemption to allow
207
-a plugin to be used automatically, it must only apply to the top level url bar
207
+a plugin to be used automatically, it must only apply to the top level URL bar
208 208
 domain, and not to all sites, to reduce cross-origin fingerprinting
209 209
 linkability.
210 210
 
... ...
@@ -220,10 +220,10 @@ system-wide and/or operating system provided addons or plugins.
220 220
      </p><p>
221 221
 Instead of global browser privacy options, privacy decisions should be made
222 222
 <a class="ulink" href="https://wiki.mozilla.org/Privacy/Features/Site-based_data_management_UI" target="_top">per
223
-url bar origin</a> to eliminate the possibility of linkability
223
+URL bar origin</a> to eliminate the possibility of linkability
224 224
 between domains. For example, when a plugin object (or a Javascript access of
225 225
 window.plugins) is present in a page, the user should be given the choice of
226
-allowing that plugin object for that url bar origin only. The same
226
+allowing that plugin object for that URL bar origin only. The same
227 227
 goes for exemptions to third party cookie policy, geolocation, and any other
228 228
 privacy permissions.
229 229
      </p><p>
... ...
@@ -241,7 +241,7 @@ third parties, rather than a list of specific URLs or hosts.
241 241
      </p><p>
242 242
 Filter-based addons can also introduce strange breakage and cause usability
243 243
 nightmares, and will also fail to do their job if an adversary simply
244
-registers a new domain or creates a new url path. Worse still, the unique
244
+registers a new domain or creates a new URL path. Worse still, the unique
245 245
 filter sets that each user creates or installs will provide a wealth of
246 246
 fingerprinting targets.
247 247
       </p><p>
... ...
@@ -300,7 +300,7 @@ In some cases, the adversary may opt for a heavy-handed approach, such as
300 300
 seizing the computers of all Tor users in an area (especially after narrowing
301 301
 the field by the above two pieces of information). History records and cache
302 302
 data are the primary goals here. Secondary goals may include confirming
303
-on-disk identifiers (such as hostname and disk-logged spoofed MAC adddress
303
+on-disk identifiers (such as hostname and disk-logged spoofed MAC address
304 304
 history) obtained by other means.
305 305
 
306 306
      </p></li></ol></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="adversary-positioning"></a>3.2. Adversary Capabilities - Positioning</h3></div></div></div><p>
... ...
@@ -553,8 +553,7 @@ are typically linked for these cases.
553 553
   </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="proxy-obedience"></a>4.1. Proxy Obedience</h3></div></div></div><p>
554 554
 
555 555
 Proxy obedience is assured through the following:
556
-   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">Firefox proxy settings, patches, and build flags
557
- <p>
556
+   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Firefox proxy settings, patches, and build flags</strong></span><p>
558 557
 
559 558
 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
560 559
 preferences file</a> sets the Firefox proxy settings to use Tor directly
... ...
@@ -589,16 +588,14 @@ activity in the source tree that did not use the browser proxy settings.
589 588
 
590 589
 We have verified that these settings and patches properly proxy HTTPS, OCSP,
591 590
 HTTP, FTP, gopher (now defunct), DNS, SafeBrowsing Queries, all JavaScript
592
-activity, including HTML5 audio and video objects, addon updates, wifi
591
+activity, including HTML5 audio and video objects, addon updates, WiFi
593 592
 geolocation queries, searchbox queries, XPCOM addon HTTPS/HTTP activity,
594 593
 WebSockets, and live bookmark updates. We have also verified that IPv6
595 594
 connections are not attempted, through the proxy or otherwise (Tor does not
596 595
 yet support IPv6). We have also verified that external protocol helpers, such
597 596
 as SMB URLs and other custom protocol handlers are all blocked.
598 597
 
599
- </p></li><li class="listitem">Disabling plugins
600
-
601
- <p>Plugins have the ability to make arbitrary OS system calls and  <a class="ulink" href="http://decloak.net/" target="_top">bypass proxy settings</a>. This includes
598
+ </p></li><li class="listitem"><span class="command"><strong>Disabling plugins</strong></span><p>Plugins have the ability to make arbitrary OS system calls and  <a class="ulink" href="http://decloak.net/" target="_top">bypass proxy settings</a>. This includes
602 599
 the ability to make UDP sockets and send arbitrary data independent of the
603 600
 browser proxy settings.
604 601
  </p><p>
... ...
@@ -619,8 +616,7 @@ prevent the load of any plugins except for Flash and Gnash</a>. Even for
619 616
 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&amp;id=e5531b1baa3c96dee7d8d4274791ff393bafd241" target="_top">prevent loading them into the
620 617
 address space</a> until they are explicitly enabled.
621 618
 
622
- </p></li><li class="listitem">External App Blocking and Drag Event Filtering
623
-  <p>
619
+ </p></li><li class="listitem"><span class="command"><strong>External App Blocking and Drag Event Filtering</strong></span><p>
624 620
 
625 621
 External apps can be induced to load files that perform network activity.
626 622
 Unfortunately, there are cases where such apps can be launched automatically
... ...
@@ -638,8 +634,7 @@ as simple as holding the mouse button down for slightly too long while
638 634
 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
639 635
 Torbutton</a> before the OS downloads the URLs the events contained.
640 636
 
641
-  </p></li><li class="listitem">Disabling system extensions and clearing the addon whitelist
642
-  <p>
637
+  </p></li><li class="listitem"><span class="command"><strong>Disabling system extensions and clearing the addon whitelist</strong></span><p>
643 638
 
644 639
 Firefox addons can perform arbitrary activity on your computer, including
645 640
 bypassing Tor. It is for this reason we disable the addon whitelist
... ...
@@ -660,13 +655,13 @@ system-wide extensions (through the use of
660 655
 disabled, which prevents Flash cookies from leaking from a pre-existing Flash
661 656
 directory.
662 657
 
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
+   </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="idp66162928"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote">
664 659
 
665 660
 The User Agent MUST (at user option) prevent all disk records of browser activity.
666 661
 The user should be able to optionally enable URL history and other history
667 662
 features if they so desire. 
668 663
 
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
+    </blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp66164288"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote">
670 665
 
671 666
 We achieve this goal through several mechanisms. First, we set the Firefox
672 667
 Private Browsing preference
... ...
@@ -718,43 +713,49 @@ To ensure TBB directory isolation, we set
718 713
 $HOME environment variable to be the TBB extraction directory.
719 714
    </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="identifier-linkability"></a>4.5. Cross-Origin Identifier Unlinkability</h3></div></div></div><p>
720 715
 
721
-The Tor Browser MUST prevent a user's activity on one site from being linked
722
-to their activity on another site. When this goal cannot yet be met with an
723
-existing web technology, that technology or functionality is disabled. Our
724
-<a class="link" href="#privacy" title="2.2. Privacy Requirements">design goal</a> is to ultimately eliminate the need to disable arbitrary
725
-technologies, and instead simply alter them in ways that allows them to
726
-function in a backwards-compatible way while avoiding linkability. Users
727
-should be able to use federated login of various kinds to explicitly inform
728
-sites who they are, but that information should not transparently allow a
729
-third party to record their activity from site to site without their prior
730
-consent.
716
+The Cross-Origin Identifier Unlinkability design requirement is satisfied
717
+through first party isolation of all browser identifier sources. First party
718
+isolation means that all identifier sources and browser state are scoped
719
+(isolated) using the URL bar domain. This scoping is performed in
720
+combination with any additional third party scope. When first party isolation
721
+is used with explicit identifier storage that already has a constrained third
722
+party scope (such as cookies, DOM storage, and cache), this approach is
723
+referred to as "double-keying".
731 724
 
732 725
    </p><p>
733 726
 
734 727
 The benefit of this approach comes not only in the form of reduced
735 728
 linkability, but also in terms of simplified privacy UI. If all stored browser
736
-state and permissions become associated with the url bar origin, the six or
729
+state and permissions become associated with the URL bar origin, the six or
737 730
 seven different pieces of privacy UI governing these identifiers and
738 731
 permissions can become just one piece of UI. For instance, a window that lists
739
-the url bar origin for which browser state exists, possibly with a
732
+the URL bar origin for which browser state exists, possibly with a
740 733
 context-menu option to drill down into specific types of state or permissions.
741 734
 An example of this simplification can be seen in Figure 1.
742 735
 
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>
736
+   </p><div class="figure"><a id="idp66186000"></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>
744 737
 
745 738
 This example UI is a mock-up of how isolating identifiers to the URL bar
746 739
 origin can simplify the privacy UI for all data - not just cookies. Once
747
-browser identifiers and site permissions operate on a url bar basis, the same
740
+browser identifiers and site permissions operate on a URL bar basis, the same
748 741
 privacy window can represent browsing history, DOM Storage, HTTP Auth, search
749 742
 form history, login values, and so on within a context menu for each site.
750 743
 
751
-</div></div></div><br class="figure-break" /><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">Cookies
752
-     <p><span class="command"><strong>Design Goal:</strong></span>
744
+</div></div></div><br class="figure-break" /><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp66189424"></a>Identifier Unlinkability Defenses in the Tor Browser</h4></div></div></div><p>
745
+
746
+Unfortunately, many aspects of browser state can serve as identifier storage,
747
+and no other browser vendor or standards body has invested the effort to
748
+enumerate or otherwise deal with these vectors for third party tracking. As
749
+such, we have had to enumerate and isolate these identifier sources on a
750
+piecemeal basis. Here is the list that we have discovered and dealt with to
751
+date:
753 752
 
754
-All cookies MUST be double-keyed to the url bar origin and third-party
753
+   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Cookies</strong></span><p><span class="command"><strong>Design Goal:</strong></span>
754
+
755
+All cookies MUST be double-keyed to the URL bar origin and third-party
755 756
 origin. There exists a <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=565965" target="_top">Mozilla bug</a>
756 757
 that contains a prototype patch, but it lacks UI, and does not apply to modern
757
-Firefoxes.
758
+Firefox versions.
758 759
 
759 760
      </p><p><span class="command"><strong>Implementation Status:</strong></span>
760 761
 
... ...
@@ -764,8 +765,7 @@ entirely disable 3rd party cookies by setting
764 765
 third party content continue to function, but we believe the requirement for 
765 766
 unlinkability trumps that desire.
766 767
 
767
-     </p></li><li class="listitem">Cache
768
-     <p>
768
+     </p></li><li class="listitem"><span class="command"><strong>Cache</strong></span><p>
769 769
 
770 770
 In Firefox, there are actually two distinct caching mechanisms: One for
771 771
 general content (HTML, Javascript, CSS), and one specifically for images. The
... ...
@@ -773,33 +773,29 @@ content cache is isolated to the URL bar domain by <a class="ulink" href="https:
773 773
 each cache key</a> to include an additional ID that includes the URL bar
774 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 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.
776
+property prepended, which will list the FQDN that was used to source it.
778 777
 
779 778
      </p><p>
780 779
 
781 780
 Additionally, because the image cache is a separate entity from the content
782 781
 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&amp;id=d8b98a75fb200268c40886d876adc19e00b933bf" target="_top">isolate
783
-this cache per url bar domain</a>.
782
+this cache per URL bar domain</a>.
784 783
 
785
-     </p></li><li class="listitem">HTTP Auth
786
-     <p>
784
+     </p></li><li class="listitem"><span class="command"><strong>HTTP Authentication</strong></span><p>
787 785
 
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
786
+HTTP Authorization headers can be used to encode <a class="ulink" href="http://jeremiahgrossman.blogspot.com/2007/04/tracking-users-without-cookies.html" target="_top">silent
789 787
 third party tracking identifiers</a>. To prevent this, we remove HTTP
790 788
 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&amp;id=b8ce4a0760759431f146c71184c89fbd5e1a27e4" target="_top">patch
791 789
 to nsHTTPChannel</a>.
792 790
 
793
-     </p></li><li class="listitem">DOM Storage
794
-     <p>
791
+     </p></li><li class="listitem"><span class="command"><strong>DOM Storage</strong></span><p>
795 792
 
796
-DOM storage for third party domains MUST be isolated to the url bar origin,
793
+DOM storage for third party domains MUST be isolated to the URL bar origin,
797 794
 to prevent linkability between sites. This functionality is provided through a
798 795
 <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&amp;id=97490c4a90ca1c43374486d9ec0c5593d5fe5720" target="_top">patch
799 796
 to Firefox</a>.
800 797
 
801
-     </p></li><li class="listitem">Flash cookies
802
-     <p><span class="command"><strong>Design Goal:</strong></span>
798
+     </p></li><li class="listitem"><span class="command"><strong>Flash cookies</strong></span><p><span class="command"><strong>Design Goal:</strong></span>
803 799
 
804 800
 Users should be able to click-to-play flash objects from trusted sites. To
805 801
 make this behavior unlinkable, we wish to include a settings file for all platforms that disables flash
... ...
@@ -812,10 +808,9 @@ We are currently <a class="ulink" href="https://trac.torproject.org/projects/tor
812 808
 difficulties</a> causing Flash player to use this settings
813 809
 file on Windows, so Flash remains difficult to enable.
814 810
 
815
-     </p></li><li class="listitem">SSL+TLS session resumption
816
-     <p><span class="command"><strong>Design Goal:</strong></span>
811
+     </p></li><li class="listitem"><span class="command"><strong>SSL+TLS session resumption</strong></span><p><span class="command"><strong>Design Goal:</strong></span>
817 812
 
818
-TLS session resumption tickets and SSL Session IDs MUST be limited to the url
813
+TLS session resumption tickets and SSL Session IDs MUST be limited to the URL
819 814
 bar origin.
820 815
 
821 816
      </p><p><span class="command"><strong>Implementation Status:</strong></span>
... ...
@@ -829,27 +824,24 @@ these performance optimizations, we also enable
829 824
 <a class="ulink" href="https://tools.ietf.org/html/draft-bmoeller-tls-falsestart-00" target="_top">TLS
830 825
 False Start</a> via the Firefox Pref
831 826
 <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>
827
+    </p></li><li class="listitem"><span class="command"><strong>Tor circuit and HTTP connection linkability</strong></span><p>
828
+
829
+Tor circuits and HTTP connections from a third party in one URL bar origin
830
+MUST NOT be reused for that same third party in another URL bar origin.
834 831
 
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.
838 832
      </p><p>
839 833
 
840 834
 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&amp;id=b3ea705cc35b79a9ba27323cb3e32d5d004ea113" target="_top">Firefox
841
-patch to allow SOCKS username and passwords</a>, as well as a Torbutton
835
+patch to allow SOCKS usernames and passwords</a>, as well as a Torbutton
842 836
 component that <a class="ulink" href="" target="_top">sets
843 837
 the SOCKS username and password for each request</a>. The Tor client has
844 838
 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.
839
+using the same Tor circuit. Firefox has existing logic to ensure that connections with
840
+SOCKS proxies do not re-use existing HTTP Keep-Alive connections unless the
841
+proxy settings match.  We extended this logic to cover SOCKS username and
842
+password authentication, providing us with HTTP Keep-Alive unlinkability.
850 843
 
851
-     </p></li><li class="listitem">SharedWorkers
852
-     <p>
844
+     </p></li><li class="listitem"><span class="command"><strong>SharedWorkers</strong></span><p>
853 845
 
854 846
 <a class="ulink" href="https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker" target="_top">SharedWorkers</a>
855 847
 are a special form of Javascript Worker Threads that have a shared scope
... ...
@@ -865,8 +857,7 @@ the objects created by that same third party loaded under another URL bar domain
865 857
 For now, we disable SharedWorkers via the pref
866 858
 <span class="command"><strong>dom.workers.sharedWorkers.enabled</strong></span>.
867 859
 
868
-     </p></li><li class="listitem">blob: URIs (URL.createObjectURL)
869
-     <p>
860
+     </p></li><li class="listitem"><span class="command"><strong>blob: URIs (URL.createObjectURL)</strong></span><p>
870 861
 
871 862
 The <a class="ulink" href="https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL" target="_top">URL.createObjectURL</a>
872 863
 API allows a site to load arbitrary content into a random UUID that is stored
... ...
@@ -881,23 +872,23 @@ interest to an adversary.
881 872
 URIs created with URL.createObjectURL MUST be limited in scope to the first
882 873
 party URL bar domain that created them. We provide this isolation in Tor
883 874
 Browser via a <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&amp;id=0d67ab406bdd3cf095802cb25c081641aa1f0bcc" target="_top">direct
884
-patch to Firefox</a>.
875
+patch to Firefox</a> and disable URL.createObjectURL in the WebWorker
876
+context as a stopgap, due to an edge case with enforcing this isolation in
877
+WebWorkers.
885 878
 
886
-     </p></li><li class="listitem">SPDY
887
-     <p>
879
+     </p></li><li class="listitem"><span class="command"><strong>SPDY</strong></span><p>
888 880
 
889 881
 Because SPDY can store identifiers, it is disabled through the
890 882
 Firefox preference <span class="command"><strong>network.http.spdy.enabled</strong></span>.
891 883
 
892
-     </p></li><li class="listitem">Automated cross-origin redirects MUST NOT store identifiers
893
-    <p><span class="command"><strong>Design Goal:</strong></span>
884
+     </p></li><li class="listitem"><span class="command"><strong>Automated cross-origin redirects</strong></span><p><span class="command"><strong>Design Goal:</strong></span>
894 885
 
895 886
 To prevent attacks aimed at subverting the Cross-Origin Identifier
896 887
 Unlinkability <a class="link" href="#privacy" title="2.2. Privacy Requirements">privacy requirement</a>, the browser
897 888
 MUST NOT store any identifiers (cookies, cache, DOM storage, HTTP auth, etc)
898 889
 for cross-origin redirect intermediaries that do not prompt for user input.
899
-For example, if a user clicks on a bit.ly url that redirects to a
900
-doubleclick.net url that finally redirects to a cnn.com url, only cookies from
890
+For example, if a user clicks on a bit.ly URL that redirects to a
891
+doubleclick.net URL that finally redirects to a cnn.com URL, only cookies from
901 892
 cnn.com should be retained after the redirect chain completes.
902 893
 
903 894
     </p><p>
... ...
@@ -911,8 +902,7 @@ There are numerous ways for the user to be redirected, and the Firefox API
911 902
 support to detect each of them is poor. We have a <a class="ulink" href="https://trac.torproject.org/projects/tor/ticket/3600" target="_top">trac bug
912 903
 open</a> to implement what we can.
913 904
 
914
-    </p></li><li class="listitem">window.name
915
-     <p>
905
+    </p></li><li class="listitem"><span class="command"><strong>window.name</strong></span><p>
916 906
 
917 907
 <a class="ulink" href="https://developer.mozilla.org/En/DOM/Window.name" target="_top">window.name</a> is
918 908
 a magical DOM property that for some reason is allowed to retain a persistent value
... ...
@@ -927,10 +917,9 @@ that utilize this property to function, we reset the window.name property of
927 917
 tabs in Torbutton every time we encounter a blank Referer. This behavior
928 918
 allows window.name to persist for the duration of a click-driven navigation
929 919
 session, but as soon as the user enters a new URL or navigates between
930
-https/http schemes, the property is cleared.
920
+HTTPS/HTTP schemes, the property is cleared.
931 921
 
932
-     </p></li><li class="listitem">Auto form-fill
933
-     <p>
922
+     </p></li><li class="listitem"><span class="command"><strong>Auto form-fill</strong></span><p>
934 923
 
935 924
 We disable the password saving functionality in the browser as part of our
936 925
 <a class="link" href="#disk-avoidance" title="4.3. Disk Avoidance">Disk Avoidance</a> requirement. However,
... ...
@@ -940,8 +929,7 @@ preference to false to prevent saved values from immediately populating
940 929
 fields upon page load. Since Javascript can read these values as soon as they
941 930
 appear, setting this preference prevents automatic linkability from stored passwords.
942 931
 
943
-     </p></li><li class="listitem">HSTS supercookies
944
-      <p>
932
+     </p></li><li class="listitem"><span class="command"><strong>HSTS supercookies</strong></span><p>
945 933
 
946 934
 An extreme (but not impossible) attack to mount is the creation of <a class="ulink" href="http://www.leviathansecurity.com/blog/archives/12-The-Double-Edged-Sword-of-HSTS-Persistence-and-Privacy.html" target="_top">HSTS
947 935
 supercookies</a>. Since HSTS effectively stores one bit of information per domain
... ...
@@ -952,7 +940,7 @@ cookies based on stored HSTS state.
952 940
 
953 941
 There appears to be three options for us: 1. Disable HSTS entirely, and rely
954 942
 instead on HTTPS-Everywhere to crawl and ship rules for HSTS sites. 2.
955
-Restrict the number of HSTS-enabled third parties allowed per url bar origin.
943
+Restrict the number of HSTS-enabled third parties allowed per URL bar origin.
956 944
 3. Prevent third parties from storing HSTS rules. We have not yet decided upon
957 945
 the best approach.
958 946
 
... ...
@@ -962,7 +950,7 @@ defend against the creation of these cookies between <span class="command"><stro
962 950
 Identity</strong></span> invocations.
963 951
       </p></li></ol></div><p>
964 952
 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&amp;status=!closed" target="_top">tbb-linkability tag in our bugtracker</a>
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>
953
+  </p></div></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>
966 954
 
967 955
 Browser fingerprinting is the act of inspecting browser behaviors and features in
968 956
 an attempt to differentiate and track individual users. Fingerprinting attacks
... ...
@@ -987,8 +975,17 @@ severe, and how to study the efficacy of defenses properly.
987 975
 
988 976
     </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 977
 
990
-All fingerprinting issues arise from one of four primary sources. In order
991
-from most severe to least severe, these sources are:
978
+All browser fingerprinting issues arise from one of four primary sources:
979
+end-user configuration details, device and hardware characteristics, operating
980
+system vendor and version differences, and browser vendor and version
981
+differences. Additionally, user behavior itself provides one more source of
982
+potential fingerprinting.
983
+
984
+    </p><p>
985
+
986
+In order to help prioritize and inform defenses, we now list these sources in
987
+order from most severe to least severe in terms of the amount of information
988
+they reveal, and describe them in more detail.
992 989
 
993 990
     </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>End-user Configuration Details</strong></span><p>
994 991
 
... ...
@@ -1004,13 +1001,15 @@ do so only on a per-site basis via site permissions, to avoid linkability.
1004 1001
 
1005 1002
      </p></li><li class="listitem"><span class="command"><strong>Device and Hardware Characteristics</strong></span><p>
1006 1003
 
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.
1004
+Device and hardware characteristics can be determined in three ways: they can
1005
+be reported explicitly by the browser, they can be inferred through browser
1006
+functionality, or they can be extracted through statistical measurements of
1007
+system performance. We are most concerned with the cases where this
1008
+information is either directly reported or can be determined via a single use
1009
+of an API or feature, and prefer to place such APIs either behind site
1010
+permissions, alter their functionality to prevent exposing the most variable
1011
+aspects of these characteristics, or disable them entirely.
1012
+
1014 1013
       </p><p>
1015 1014
 
1016 1015
 On the other hand, because statistical inference of system performance
... ...
@@ -1033,6 +1032,16 @@ completely concealed, though we recognize that it is useful to reduce this
1033 1032
 differentiation ability where possible, especially for cases where the
1034 1033
 specific version of a system can be inferred.
1035 1034
 
1035
+      </p></li><li class="listitem"><span class="command"><strong>User Behavior</strong></span><p>
1036
+
1037
+While somewhat outside the scope of browser fingerprinting, for completeness
1038
+it is important to mention that users themselves theoretically might be
1039
+fingerprinted through their behavior while interacting with a website. This
1040
+behavior includes e.g. keystrokes, mouse movements, click speed, and writing
1041
+style. Basic vectors such as keystroke and mouse usage fingerprinting can be
1042
+mitigated by altering Javascript's notion of time. More advanced issues like
1043
+writing style fingerprinting are the domain of <a class="ulink" href="https://github.com/psal/anonymouth" target="_top">other tools</a>.
1044
+
1036 1045
       </p></li><li class="listitem"><span class="command"><strong>Browser Vendor and Version Differences</strong></span><p>
1037 1046
 
1038 1047
 Due to vast differences in feature set and implementation behavior even
... ...
@@ -1047,7 +1056,150 @@ of the fingerprintability of a population is largely useless for evaluating
1047 1056
 either attacks or defenses. Unfortunately, this includes popular large-scale
1048 1057
 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 1058
 
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>
1059
+      </p></li></ol></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="fingerprinting-defenses-general"></a>General Fingerprinting Defenses</h4></div></div></div><p>
1060
+
1061
+To date, the Tor Browser team has concerned itself only with developing
1062
+defenses for APIs that have already been standardized and deployed.  Once an
1063
+API or feature has been standardized and widely deployed, defenses to the
1064
+associated fingerprinting issues tend to have only a few options available to
1065
+address the lack up-front privacy design. In our experience, these options
1066
+tend to be limited to value spoofing, subsystem reimplementation,
1067
+virtualization, site permissions, and feature removal. We will now describe
1068
+these options and the fingerprinting sources they tend to work best with.
1069
+
1070
+    </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Value Spoofing</strong></span><p>
1071
+
1072
+Value spoofing can be used for simple cases where the browser directly
1073
+provides some aspect of the user's configuration details, devices, hardware,
1074
+or operating system directly to a website. It becomes less useful when the
1075
+fingerprinting method relies on behavior to infer aspects of the hardware or
1076
+operating system, rather than obtain them directly.
1077
+
1078
+     </p></li><li class="listitem"><span class="command"><strong>Subsystem Reimplementation</strong></span><p>
1079
+
1080
+In cases where simple spoofing is not enough to properly conceal underlying
1081
+device characteristics or operating system details, the underlying
1082
+subsystem that provides the functionality for a feature or API may need
1083
+to be completely reimplemented. This is most common in cases where
1084
+customizable or version-specific aspects of the user's operating system are
1085
+visible through the browser's featureset or APIs, usually because the browser
1086
+directly exposes OS-provided implementations of underlying features. In these
1087
+cases, such OS-provided implementations must be replaced by a generic
1088
+implementation, or at least an implementation wrapper that makes effort to
1089
+conceal any user-customized aspects of the system.
1090
+
1091
+   </p></li><li class="listitem"><span class="command"><strong>Virtualization</strong></span><p>
1092
+
1093
+Virtualization is needed when simply reimplementing a feature in a different
1094
+way is insufficient to fully conceal the underlying behavior. This is most
1095
+common in instances of device and hardware fingerprinting, but since the
1096
+notion of time can also be virtualized, virtualization also can apply to any
1097
+instance where an accurate measurement of wall clock time is required for a
1098
+fingerprinting vector to attain high accuracy.
1099
+
1100
+   </p></li><li class="listitem"><span class="command"><strong>Site Permissions</strong></span><p>
1101
+
1102
+In the event that reimplementation or virtualization is too expensive in terms
1103
+of performance or engineering effort, and the relative expected usage of a
1104
+feature is rare, site permissions can be used to prevent the usage of a
1105
+feature except in cases where the user actually wishes to use it.
1106
+Unfortunately, this mechanism becomes less effective once a feature becomes
1107
+widely overused and abused by many websites, as warning fatigue quickly sets
1108
+in for most users.
1109
+
1110
+   </p></li><li class="listitem"><span class="command"><strong>Feature/Functionality Removal</strong></span><p>
1111
+
1112
+Due to the current bias in favor of invasive APIs that expose the maximum
1113
+amount of platform information, some features and APIs are simply not
1114
+salvageable in their current form. When such invasive features serve only a
1115
+narrow domain or use case, or when there are alternate ways of accomplishing
1116
+the same task, these features and/or certain aspects of their functionality
1117
+may be simply removed.
1118
+
1119
+   </p></li></ol></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp66282416"></a>Randomization or Uniformity?</h4></div></div></div><p>
1120
+
1121
+When applying a form of defense to a specific fingerprinting vector or source, 
1122
+there are two general strategies available. Either the implementation for all
1123
+users of a single browser implementation can be made to behave as uniformly as
1124
+possible, or the user agent can attempt to randomize its behavior, so that
1125
+each interaction between a user and a site provides a different fingerprint.
1126
+
1127
+    </p><p>
1128
+
1129
+Although <a class="ulink" href="http://research.microsoft.com/pubs/209989/tr1.pdf" target="_top">some
1130
+research suggests</a> that randomization can be effective, so far striving
1131
+for uniformity has generally proved to be a better strategy for Tor Browser
1132
+for the following reasons:
1133
+
1134
+    </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Randomization is not a shortcut</strong></span><p>
1135
+
1136
+While many end-user configuration details that the browser currently exposes
1137
+may be safely replaced by false information, randomization of these details
1138
+must be just as exhaustive as an approach that seeks to make these behaviors
1139
+uniform. In the face of either strategy, the adversary can still make use of
1140
+those features which have not been altered to be either sufficiently uniform
1141
+or sufficiently random.
1142
+
1143
+     </p><p>
1144
+
1145
+Furthermore, the randomization approach seems to break down when it is applied
1146
+to deeper issues where underlying system functionality is directly exposed. In
1147
+particular, it is not clear how to randomize the capabilities of hardware
1148
+attached to a computer in such a way that it either convincingly behaves like
1149
+other hardware, or where the exact properties of the hardware that vary from
1150
+user to user are sufficiently randomized. Similarly, truly concealing operating
1151
+system version differences through randomization may require reimplementation
1152
+of the underlying operating system functionality to ensure that every version
1153
+that your randomization is trying to blend in with is covered by the range of
1154
+possible behaviors.
1155
+
1156
+     </p></li><li class="listitem"><span class="command"><strong>Evaluation and measurement difficulties</strong></span><p>
1157
+
1158
+The fact that randomization causes behaviors to differ slightly with every
1159
+site visit makes it appealing at first glance, but this same property makes it
1160
+very difficult to objectively measure its effectiveness. By contrast, an
1161
+implementation that strives for uniformity is very simple to measure. Despite
1162
+their current flaws, a properly designed version of <a class="ulink" href="https://panopticlick.eff.org/" target="_top">Panopticlick</a> or <a class="ulink" href="https://amiunique.org/" target="_top">Am I Unique</a> could report the entropy and
1163
+uniqueness rates for all users of a single user agent version, without the
1164
+need for complicated statistics about the variance of the measured behaviors.
1165
+
1166
+      </p><p>
1167
+
1168
+Randomization (especially incomplete randomization) may also provide a false
1169
+sense of security. When a fingerprinting attempt makes naive use of randomized
1170
+information, a fingerprint will appear unstable, but may not actually be
1171
+sufficiently randomized to prevent a dedicated adversary.  Sophisticated
1172
+fingerprinting mechanisms may either ignore randomized information, or
1173
+incorporate knowledge of the distribution and range of randomized values into
1174
+the creation of a more stable fingerprint (by either removing the randomness,
1175
+modeling it, or averaging it).
1176
+
1177
+      </p></li><li class="listitem"><span class="command"><strong>Usability issues</strong></span><p>
1178
+
1179
+When randomization is introduced to features that affect site behavior, it can
1180
+be very distracting for this behavior to change between visits of a given
1181
+site. For simple cases such as when this information affects layout behavior, 
1182
+this will lead to visual nuisances. However, when this information affects
1183
+reported functionality or hardware characteristics, sometimes a site will
1184
+function one way on one visit, and another way on a subsequent visit.
1185
+
1186
+      </p></li><li class="listitem"><span class="command"><strong>Performance costs</strong></span><p>
1187
+
1188
+Randomizing involves performance costs. This is especially true if the
1189
+fingerprinting surface is large (like in a modern browser) and one needs more
1190
+elaborate randomizing strategies (including randomized virtualization) to
1191
+ensure that the randomization fully conceals the true behavior. Many calls to
1192
+a cryptographically secure random number generator during the course of a page
1193
+load will both serve to exhaust available entropy pools, as well as lead to
1194
+increased computation while loading a page.
1195
+
1196
+      </p></li><li class="listitem"><span class="command"><strong>Increased vulnerability surface</strong></span><p>
1197
+
1198
+Improper randomization might introduce a new fingerprinting vector, as the
1199
+process of generating the values for the fingerprintable attributes could be
1200
+itself susceptible to side-channel attacks, analysis, or exploitation.
1201
+
1202
+      </p></li></ol></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="fingerprinting-defenses"></a>Specific Fingerprinting Defenses in the Tor Browser</h4></div></div></div><p>
1051 1203
 
1052 1204
 The following defenses are listed roughly in order of most severe
1053 1205
 fingerprinting threat first. This ordering is based on the above intuition
... ...
@@ -1061,8 +1213,7 @@ Where our actual implementation differs from an ideal solution, we separately
1061 1213
 describe our <span class="command"><strong>Design Goal</strong></span> and our <span class="command"><strong>Implementation
1062 1214
 Status</strong></span>.
1063 1215
 
1064
-   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">Plugins
1065
-     <p>
1216
+   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Plugins</strong></span><p>
1066 1217
 
1067 1218
 Plugins add to fingerprinting risk via two main vectors: their mere presence
1068 1219
 in window.navigator.plugins (because they are optional, end-user installed
... ...
@@ -1092,8 +1243,7 @@ section</a>. We also set the Firefox
1092 1243
 preference <span class="command"><strong>plugin.expose_full_path</strong></span> to false, to avoid
1093 1244
 leaking plugin installation information.
1094 1245
 
1095
-     </p></li><li class="listitem">HTML5 Canvas Image Extraction
1096
-     <p>
1246
+     </p></li><li class="listitem"><span class="command"><strong>HTML5 Canvas Image Extraction</strong></span><p>
1097 1247
 
1098 1248
 After plugins and plugin-provided information, we believe that the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/HTML/Canvas" target="_top">HTML5
1099 1249
 Canvas</a> is the single largest fingerprinting threat browsers face
... ...
@@ -1113,14 +1263,13 @@ fingerprinting vectors. If WebGL is normalized through software rendering,
1113 1263
 system colors were standardized, and the browser shipped a fixed collection of
1114 1264
 fonts (see later points in this list), it might not be necessary to create a
1115 1265
 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&amp;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.
1266
+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&amp;id=6a169ef0166b268b1a27546a17b3d7470330917d" target="_top">prompt before returning valid image data</a> to the Canvas APIs,
1267
+and for <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&amp;id=7d51acca6383732480b49ccdb5506ad6fb92e651" target="_top">access to isPointInPath and related functions</a>.
1268
+If the user hasn't previously allowed the site in the URL bar to access Canvas
1269
+image data, pure white image data is returned to the Javascript APIs.
1120 1270
 
1121 1271
      </p><p>
1122
-     </p></li><li class="listitem">Open TCP Port Fingerprinting
1123
-     <p>
1272
+     </p></li><li class="listitem"><span class="command"><strong>Open TCP Port and Local Network Fingerprinting</strong></span><p>
1124 1273
 
1125 1274
 In Firefox, by using either WebSockets or XHR, it is possible for remote
1126 1275
 content to <a class="ulink" href="http://www.andlabs.org/tools/jsrecon.html" target="_top">enumerate
... ...
@@ -1143,8 +1292,7 @@ Tor client then rejects them, since it is configured to proxy for internal IP
1143 1292
 addresses by default. Access to the local network is forbidden via the same
1144 1293
 mechanism.
1145 1294
 
1146
-     </p></li><li class="listitem">Invasive Authentication Mechanisms (NTLM and SPNEGO)
1147
-     <p>
1295
+     </p></li><li class="listitem"><span class="command"><strong>Invasive Authentication Mechanisms (NTLM and SPNEGO)</strong></span><p>
1148 1296
 
1149 1297
 Both NTLM and SPNEGO authentication mechanisms can leak the hostname, and in
1150 1298
 some cases the current username. The only reason why these aren't a more
... ...
@@ -1155,8 +1303,7 @@ them to reveal machine information and still fail silently prior to the
1155 1303
 password prompt, these authentication mechanisms should either be disabled, or
1156 1304
 placed behind a site permission before their use. We simply disable them.
1157 1305
 
1158
-     </p></li><li class="listitem">USB Device ID Enumeration
1159
-     <p>
1306
+     </p></li><li class="listitem"><span class="command"><strong>USB Device ID Enumeration</strong></span><p>
1160 1307
 
1161 1308
 The <a class="ulink" href="https://developer.mozilla.org/en-US/docs/Web/Guide/API/Gamepad" target="_top">GamePad
1162 1309
 API</a> provides web pages with the <a class="ulink" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Gamepad-id" target="_top">USB
... ...
@@ -1166,8 +1313,7 @@ should be behind a site permission in Private Browsing Modes, or should present
1166 1313
 controller type (perhaps a two button controller that can be mapped to the keyboard) in all cases.
1167 1314
 We simply disable it via the pref <span class="command"><strong>dom.gamepad.enabled</strong></span>.
1168 1315
 
1169
-     </p></li><li class="listitem">Fonts
1170
-     <p>
1316
+     </p></li><li class="listitem"><span class="command"><strong>Fonts</strong></span><p>
1171 1317
 
1172 1318
 According to the Panopticlick study, fonts provide the most linkability when
1173 1319
 they are provided as an enumerable list in file system order, via either the
... ...
@@ -1188,7 +1334,7 @@ and <a class="ulink" href="https://fedorahosted.org/lohit/" target="_top">Lohit
1188 1334
 font set is fairly complete by itself, but Nanum and Lohit have smaller
1189 1335
 versions of many South Asian languages. When combined in a way that chooses the
1190 1336
 smallest font implementations for each locale, these three font sets provide
1191
-poverage for the all languages used on Wikipedia with more than
1337
+coverage for the all languages used on Wikipedia with more than
1192 1338
 10,000 articles, and several others as well, in approximately 3MB of compressed
1193 1339
 overhead. The <a class="ulink" href="https://www.google.com/get/noto/" target="_top">Noto font
1194 1340
 set</a> is another font set that aims for complete coverage, but is
... ...
@@ -1212,8 +1358,7 @@ To improve rendering, we exempt remote <a class="ulink" href="https://developer.
1212 1358
 fonts</a> from these counts, and if a font-family CSS rule lists a remote
1213 1359
 font (in any order), we use that font instead of any of the named local fonts.
1214 1360
 
1215
-     </p></li><li class="listitem">Monitor, Widget, and OS Desktop Resolution
1216
-     <p>
1361
+     </p></li><li class="listitem"><span class="command"><strong>Monitor, Widget, and OS Desktop Resolution</strong></span><p>
1217 1362
 
1218 1363
 Both CSS and Javascript have access to a lot of information about the screen
1219 1364
 resolution, usable desktop size, OS widget size, toolbar size, title bar size,
... ...
@@ -1243,24 +1388,21 @@ this scheme.
1243 1388
      </p><p><span class="command"><strong>Implementation Status:</strong></span>
1244 1389
 
1245 1390
 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&amp;id=bd3b1ed32a9c21fdc92fc35f2ec0a41badc378d5" target="_top">for
1391
+a window observer <a class="ulink" href="https://gitweb.torproject.org/torbutton.git/tree/src/chrome/content/torbutton.js#n3361" target="_top">based
1392
+on desktop resolution</a>. To minimize the effect of the long tail of large
1393
+monitor sizes, we also cap the window size at 1000 pixels in each direction.
1394
+Additionally, we patch 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&amp;id=bd3b1ed32a9c21fdc92fc35f2ec0a41badc378d5" target="_top">for
1251 1395
 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&amp;id=a5648c8d80f396caf294d761cc4a9a76c0b33a9d" target="_top">report
1252 1396
 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&amp;id=3c02858027634ffcfbd97047dfdf170c19ca29ec" target="_top">patch
1253
-DOM events to return content window relative points</a>. We also 
1397
+DOM events to return content window relative points</a>.
1254 1398
 
1255
-We also force
1256
-popups to open in new tabs (via
1399
+We also force popups to open in new tabs (via
1257 1400
 <span class="command"><strong>browser.link.open_newwindow.restriction</strong></span>), to avoid
1258 1401
 full-screen popups inferring information about the browser resolution. In
1259 1402
 addition, we prevent auto-maximizing on browser start, and inform users that
1260 1403
 maximized windows are detrimental to privacy in this mode.
1261 1404
 
1262
-     </p></li><li class="listitem">Display Media information
1263
-     <p>
1405
+     </p></li><li class="listitem"><span class="command"><strong>Display Media information</strong></span><p>
1264 1406
 
1265 1407
 Beyond simple resolution information, a large amount of so-called "Media"
1266 1408
 information is also exported to content. Even without Javascript, CSS has
... ...
@@ -1286,8 +1428,7 @@ detection of font smoothing on OSX</a>. We also always
1286 1428
 <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&amp;id=e17d60442ab0db92664ff68d90fe7bf737374912" target="_top">report
1287 1429
 landscape-primary</a> for the screen orientation.
1288 1430
 
1289
-     </p></li><li class="listitem">WebGL
1290
-     <p>
1431
+     </p></li><li class="listitem"><span class="command"><strong>WebGL</strong></span><p>
1291 1432
 
1292 1433
 WebGL is fingerprintable both through information that is exposed about the
1293 1434
 underlying driver and optimizations, as well as through performance
... ...
@@ -1312,8 +1453,7 @@ Another option for WebGL might be to use software-only rendering, using a
1312 1453
 library such as <a class="ulink" href="http://www.mesa3d.org/" target="_top">Mesa</a>. The use of
1313 1454
 such a library would avoid hardware-specific rendering differences.
1314 1455
 
1315
-     </p></li><li class="listitem">User Agent and HTTP Headers
1316
-     <p><span class="command"><strong>Design Goal:</strong></span>
1456
+     </p></li><li class="listitem"><span class="command"><strong>User Agent and HTTP Headers</strong></span><p><span class="command"><strong>Design Goal:</strong></span>
1317 1457
 
1318 1458
 All Tor Browser users MUST provide websites with an identical user agent and
1319 1459
 HTTP header set for a given request type. We omit the Firefox minor revision,
... ...
@@ -1327,8 +1467,7 @@ which we leverage. We also set similar prefs for controlling the
1327 1467
 Accept-Language and Accept-Charset headers, which we spoof to English by default. Additionally, we
1328 1468
 <a class="ulink" href="https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-31.6.0esr-4.5-1&amp;id=e9841ee41e7f3f1535be2d605084c41ee9faf6c2" target="_top">remove
1329 1469
 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
1330
-used</a> to fingerprint OS, platform, and Firefox minor version.  </p></li><li class="listitem">Locale Fingerprinting
1331
-     <p>
1470
+used</a> to fingerprint OS, platform, and Firefox minor version.  </p></li><li class="listitem"><span class="command"><strong>Locale Fingerprinting</strong></span><p>
1332 1471
 
1333 1472
 In Tor Browser, we provide non-English users the option of concealing their OS
1334 1473
 and browser locale from websites. It is debatable if this should be as high of
... ...
@@ -1343,8 +1482,7 @@ We set the fallback character set to set to windows-1252 for all locales, via
1343 1482
 the JS engine</a> to use en-US as its internal C locale for all Date, Math,
1344 1483
 and exception handling.
1345 1484
 
1346
-     </p></li><li class="listitem">Timezone and Clock Offset
1347
-     <p>
1485
+     </p></li><li class="listitem"><span class="command"><strong>Timezone and Clock Offset</strong></span><p>
1348 1486
 
1349 1487
 While the latency in Tor connections varies anywhere from milliseconds to
1350 1488
 a few seconds, it is still possible for the remote site to detect large
... ...
@@ -1367,8 +1505,7 @@ the browser can obtain this clock skew via a mechanism similar to that used in
1367 1505
 We set the timezone using the TZ environment variable, which is supported on
1368 1506
 all platforms.
1369 1507
 
1370
-     </p></li><li class="listitem">Javascript Performance Fingerprinting
1371
-     <p>
1508
+     </p></li><li class="listitem"><span class="command"><strong>Javascript Performance Fingerprinting</strong></span><p>
1372 1509
 
1373 1510
 <a class="ulink" href="http://w2spconf.com/2011/papers/jspriv.pdf" target="_top">Javascript performance
1374 1511
 fingerprinting</a> is the act of profiling the performance
... ...
@@ -1396,15 +1533,14 @@ large number of people.
1396 1533
 
1397 1534
      </p><p><span class="command"><strong>Implementation Status:</strong></span>
1398 1535
 
1399
-Currently, the our mitigation against performance fingerprinting is to
1536
+Currently, our mitigation against performance fingerprinting is to
1400 1537
 disable <a class="ulink" href="http://www.w3.org/TR/navigation-timing/" target="_top">Navigation
1401 1538
 Timing</a> through the Firefox preference
1402 1539
 <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 1540
 Video Statistics</a> API extensions via the preference
1404 1541
 <span class="command"><strong>media.video_stats.enabled</strong></span>.
1405 1542
 
1406
-     </p></li><li class="listitem">Keystroke Fingerprinting
1407
-     <p>
1543
+     </p></li><li class="listitem"><span class="command"><strong>Keystroke Fingerprinting</strong></span><p>
1408 1544
 
1409 1545
 Keystroke fingerprinting is the act of measuring key strike time and key
1410 1546
 flight time. It is seeing increasing use as a biometric.
... ...
@@ -1416,8 +1552,7 @@ fingerprinting: timestamp quantization and jitter.
1416 1552
 
1417 1553
      </p><p><span class="command"><strong>Implementation Status:</strong></span>
1418 1554
 We have no implementation as of yet.
1419
-     </p></li><li class="listitem">Operating System Type Fingerprinting
1420
-     <p>
1555
+     </p></li><li class="listitem"><span class="command"><strong>Operating System Type Fingerprinting</strong></span><p>
1421 1556
 
1422 1557
 As we mentioned in the introduction of this section, OS type fingerprinting is
1423 1558
 currently considered a lower priority, due simply to the numerous ways that
... ...
@@ -1456,11 +1591,11 @@ In order to avoid long-term linkability, we provide a "New Identity" context
1456 1591
 menu option in Torbutton. This context menu option is active if Torbutton can
1457 1592
 read the environment variables $TOR_CONTROL_PASSWD and $TOR_CONTROL_PORT.
1458 1593
 
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">
1594
+   </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp66398752"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote">
1460 1595
 
1461 1596
 All linkable identifiers and browser state MUST be cleared by this feature.
1462 1597
 
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>
1598
+    </blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp66400000"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p>
1464 1599
 
1465 1600
 First, Torbutton disables Javascript in all open tabs and windows by using
1466 1601
 both the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIDocShell#Attributes" target="_top">browser.docShell.allowJavascript</a>
... ...
@@ -1538,10 +1673,11 @@ video click-to-play via NoScript (<span class="command"><strong>noscript.forbidM
1538 1673
 
1539 1674
 This security level inherits the preferences from the Medium-Low level, and
1540 1675
 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
1676
+(<span class="command"><strong>javascript.options.baselinejit.content</strong></span>), disables Graphite
1677
+(<span class="command"><strong>gfx.font_rendering.graphite.enabled</strong></span>) and SVG OpenType font
1678
+rendering (<span class="command"><strong>gfx.font_rendering.opentype_svg.enabled</strong></span>) and only
1679
+allows Javascript to run if it is loaded over HTTPS and the URL bar is HTTPS
1680
+(by setting <span class="command"><strong>noscript.global</strong></span> to false and
1545 1681
 <span class="command"><strong>noscript.globalHttpsWhitelist</strong></span> to true).
1546 1682
 
1547 1683
        </p></li><li class="listitem"><span class="command"><strong>High</strong></span><p>
... ...
@@ -1558,7 +1694,7 @@ images (<span class="command"><strong>svg.in-content.enabled</strong></span>).
1558 1694
 Fingerprinting</a> is a statistical attack to attempt to recognize specific
1559 1695
 encrypted website activity.
1560 1696
 
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>
1697
+     </p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp66434336"></a>Design Goal:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p>
1562 1698
 
1563 1699
 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
1564 1700
 for classification. This mechanism would either impact the true and false
... ...
@@ -1580,7 +1716,7 @@ Congestion-Sensitive BUFLO</a>. It may be also possible to <a class="ulink" href
1580 1716
 defenses</a> such that they only use existing spare Guard bandwidth capacity in the Tor
1581 1717
 network, making them also effectively no-overhead.
1582 1718
 
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>
1719
+     </p></blockquote></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a id="idp66441232"></a>Implementation Status:</h4></div></div></div><div class="blockquote"><blockquote class="blockquote"><p>
1584 1720
 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&amp;id=20a59cec9886cf2575b1fd8e92b43e31ba053fbd" target="_top">randomize
1585 1721
 pipeline order and depth</a>. Unfortunately, pipelining is very fragile.
1586 1722
 Many sites do not support it, and even sites that advertise support for
... ...
@@ -1588,7 +1724,7 @@ pipelining may simply return error codes for successive requests, effectively
1588 1724
 forcing the browser into non-pipelined behavior. Firefox also has code to back
1589 1725
 off and reduce or eliminate the pipeline if this happens. These
1590 1726
 shortcomings and fallback behaviors are the primary reason that Google
1591
-developed SPDY as opposed simply extending HTTP to improve pipelining. It
1727
+developed SPDY as opposed to simply extending HTTP to improve pipelining. It
1592 1728
 turns out that we could actually deploy exit-side proxies that allow us to
1593 1729
 <a class="ulink" href="https://gitweb.torproject.org/torspec.git/tree/proposals/ideas/xxx-using-spdy.txt" target="_top">use
1594 1730
 SPDY from the client to the exit node</a>. This would make our defense not
... ...
@@ -1645,7 +1781,7 @@ contend with. For this reason, we have deployed a build system
1645 1781
 that allows anyone to use our source code to reproduce byte-for-byte identical
1646 1782
 binary packages to the ones that we distribute.
1647 1783
 
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>
1784
+  </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp66457392"></a>5.1. Achieving Binary Reproducibility</h3></div></div></div><p>
1649 1785
 
1650 1786
 The GNU toolchain has been working on providing reproducible builds for some
1651 1787
 time, however a large software project such as Firefox typically ends up
... ...
@@ -1679,8 +1815,7 @@ the build environment's hostname, username, build path, uname output,
1679 1815
 toolchain versions, and time. On top of what Gitian provides, we also had to
1680 1816
 address the following additional sources of non-determinism:
1681 1817
 
1682
-   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">Filesystem and archive reordering
1683
-    <p>
1818
+   </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Filesystem and archive reordering</strong></span><p>
1684 1819
 
1685 1820
 The most prevalent source of non-determinism in the components of Tor Browser
1686 1821
 by far was various ways that archives (such as zip, tar, jar/ja, DMG, and
... ...
@@ -1700,8 +1835,7 @@ different locale settings will produce different sort results. We chose the
1700 1835
 and <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/gitian/build-helpers/ddmg.sh" target="_top">DMG</a>
1701 1836
 to aid in reproducible archive creation.
1702 1837
 
1703
-    </p></li><li class="listitem">Uninitialized memory in toolchain/archivers
1704
-    <p>
1838
+    </p></li><li class="listitem"><span class="command"><strong>Uninitialized memory in toolchain/archivers</strong></span><p>
1705 1839
 
1706 1840
 We ran into difficulties with both binutils and the DMG archive script using
1707 1841
 uninitialized memory in certain data structures that ended up written to disk.
... ...
@@ -1709,18 +1843,16 @@ Our binutils fixes were merged upstream, but the DMG archive fix remains an
1709 1843
 <a class="ulink" href="https://gitweb.torproject.org/builders/tor-browser-bundle.git/tree/gitian/patches/libdmg.patch" target="_top">independent
1710 1844
 patch</a>.
1711 1845
 
1712
-    </p></li><li class="listitem">Fine-grained timestamps and timezone leaks
1713
-    <p>
1846
+    </p></li><li class="listitem"><span class="command"><strong>Fine-grained timestamps and timezone leaks</strong></span><p>
1714 1847
 
1715 1848
 The standard way of controlling timestamps in Gitian is to use libfaketime,
1716 1849
 which hooks time-related library calls to provide a fixed timestamp. However,
1717 1850
 due to our use of wine to run py2exe for python-based pluggable transports,
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
1851
+pyc timestamps had to be addressed 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
1719 1852
 script</a>. The timezone leaks were addressed by setting the
1720 1853
 <span class="command"><strong>TZ</strong></span> environment variable to UTC in our descriptors.
1721 1854
 
1722
-    </p></li><li class="listitem">Deliberately generated entropy
1723
-    <p>
1855
+    </p></li><li class="listitem"><span class="command"><strong>Deliberately generated entropy</strong></span><p>
1724 1856
 
1725 1857
 In two circumstances, deliberately generated entropy was introduced in various
1726 1858
 components of the build process. First, the BuildID Debuginfo identifier
... ...
@@ -1744,8 +1876,7 @@ both OS and co-processor assistance. Download package signatures make sense of
1744 1876
 course, but we handle those another way (as mentioned above).
1745 1877
 
1746 1878
 
1747
-    </p></li><li class="listitem">LXC-specific leaks
1748
-   <p>
1879
+    </p></li><li class="listitem"><span class="command"><strong>LXC-specific leaks</strong></span><p>
1749 1880
 
1750 1881
 Gitian provides an option to use LXC containers instead of full qemu-kvm
1751 1882
 virtualization. Unfortunately, these containers can allow additional details
... ...
@@ -1757,14 +1888,13 @@ directly patching the aspects of the Firefox build process that included this
1757 1888
 information into the build. It also turns out that some libraries (in
1758 1889
 particular: libgmp) attempt to detect the current CPU to determine which
1759 1890
 optimizations to compile in. This CPU type is uniform on our KVM instances,
1760
-but differs under LXC. We are also investigating currently <a class="ulink" href="https://trac.torproject.org/projects/tor/ticket/12239" target="_top">unknown sources of
1761
-unitialized memory</a> that only appear in LXC mode, as well as
1891
+but differs under LXC. We are also investigating currently
1762 1892
 <a class="ulink" href="https://trac.torproject.org/projects/tor/ticket/12240" target="_top">oddities related to
1763 1893
 time-based dependency tracking</a> that only appear in LXC containers.
1764 1894
 
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>
1895
+   </p></li></ol></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp66479152"></a>5.2. Package Signatures and Verification</h3></div></div></div><p>
1766 1896
 
1767
-The build process produces a single sha256sums.txt file that contains a sorted
1897
+The build process generates a single sha256sums.txt file that contains a sorted
1768 1898
 list of the SHA-256 hashes of every package produced for that build version. Each
1769 1899
 official builder uploads this file and a GPG signature of it to a directory
1770 1900
 on a Tor Project's web server. The build scripts have an optional matching
... ...
@@ -1795,7 +1925,7 @@ In order to verify package integrity, the signature must be stripped off using
1795 1925
 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 1926
 Verification</a> page.
1797 1927
 
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>
1928
+    </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a id="idp66483680"></a>5.3. Anonymous Verification</h3></div></div></div><p>
1799 1929
 
1800 1930
 Due to the fact that bit-identical packages can be produced by anyone, the
1801 1931
 security of this build system extends beyond the security of the official
... ...
@@ -1817,18 +1947,18 @@ verifier.
1817 1947
    </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 1948
 
1819 1949
 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
1950
+users. We make use of certificate pinning to ensure that update checks cannot
1821 1951
 be tampered with, and we sign the individual MAR update files with an offline
1822 1952
 signing key.
1823 1953
 
1824 1954
    </p><p>
1825 1955
 
1826 1956
 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
1957
+update server to prevent availability attacks, and complains to the user after 48
1828 1958
 hours go by without a successful response from the server. Additionally, we
1829 1959
 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.
1960
+request to the updater (provided the former got issued more than 10 minutes ago)
1961
+traverses a separate circuit, to avoid holdback attacks by exit nodes.
1832 1962
 
1833 1963
    </p></div></div><div class="appendix"><h2 class="title" style="clear: both"><a id="Transparency"></a>A. Towards Transparency in Navigation Tracking</h2><p>
1834 1964
 
... ...
@@ -1862,15 +1992,14 @@ also describe auditable alternatives and promising web draft standards that woul
1862 1992
 preserve this functionality while still providing transparency when tracking is
1863 1993
 occurring. 
1864 1994
 
1865
-</p><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="deprecate"></a>A.1. Deprecation Wishlist</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">The Referer Header
1866
-  <p>
1995
+</p><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="deprecate"></a>A.1. Deprecation Wishlist</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>The Referer Header</strong></span><p>
1867 1996
 
1868 1997
 We haven't disabled or restricted the Referer ourselves because of the
1869 1998
 non-trivial number of sites that rely on the Referer header to "authenticate"
1870 1999
 image requests and deep-link navigation on their sites. Furthermore, there
1871 2000
 seems to be no real privacy benefit to taking this action by itself in a
1872 2001
 vacuum, because many sites have begun encoding Referer URL information into
1873
-GET parameters when they need it to cross http to https scheme transitions.
2002
+GET parameters when they need it to cross HTTP to HTTPS scheme transitions.
1874 2003
 Google's +1 buttons are the best example of this activity.
1875 2004
 
1876 2005
   </p><p>
... ...
@@ -1895,8 +2024,7 @@ for the destination URL). This same UI notification can also be used for links
1895 2024
 with the <a class="ulink" href="https://developer.mozilla.org/en-US/docs/HTML/Element/a#Attributes" target="_top">"ping"</a>
1896 2025
 attribute.
1897 2026
 
1898
-  </p></li><li class="listitem">window.name
1899
-   <p>
2027
+  </p></li><li class="listitem"><span class="command"><strong>window.name</strong></span><p>
1900 2028
 <a class="ulink" href="https://developer.mozilla.org/En/DOM/Window.name" target="_top">window.name</a> is
1901 2029
 a DOM property that for some reason is allowed to retain a persistent value
1902 2030
 for the lifespan of a browser tab. It is possible to utilize this property for
... ...
@@ -1908,8 +2036,7 @@ XSRF protection and federated login.
1908 2036
 It's our opinion that the contents of window.name should not be preserved for
1909 2037
 cross-origin navigation, but doing so may break federated login for some sites.
1910 2038
 
1911
-   </p></li><li class="listitem">Javascript link rewriting
1912
-   <p>
2039
+   </p></li><li class="listitem"><span class="command"><strong>Javascript link rewriting</strong></span><p>
1913 2040
 
1914 2041
 In general, it should not be possible for onclick handlers to alter the
1915 2042
 navigation destination of 'a' tags, silently transform them into POST
... ...
@@ -1927,7 +2054,7 @@ possible for us to <a class="ulink" href="https://trac.torproject.org/projects/t
1927 2054
 ourselves</a>, as they are comparatively rare and can be handled with site
1928 2055
 permissions.
1929 2056
 
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>
2057
+   </p></li></ol></div></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="idp66520624"></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>
1931 2058
 
1932 2059
 Web-Send is a browser-based link sharing and federated login widget that is
1933 2060
 designed to operate without relying on third-party tracking or abusing other
1934 2061