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"><<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> |
|
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">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 "New Identity" 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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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 |