Changes between Version 2 and Version 3 of Fingerprinting
- Timestamp:
- Dec 29, 2010, 4:41:00 AM (14 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Fingerprinting
v2 v3 22 22 be considered. 23 23 24 The WebKitbugzilla entry for tracking progress against items in this page is:24 The bugzilla entry for tracking progress against items in this page is: 25 25 * https://bugs.webkit.org/show_bug.cgi?id=41801 26 26 … … 49 49 WebKit defines private browsing as: 50 50 {{{ 51 // When this option is set, WebCore will avoid storing any record of browsing 52 activity 51 // When this option is set, WebCore will avoid storing any record of browsing activity 53 52 // that may persist on disk or remain displayed when the option is reset. 54 53 // This option does not affect the storage of such information in RAM. … … 84 83 == Things that aren't 'Private Browsing' but are 'Fingerprinting' == 85 84 86 === 1. Session Isolation === 85 === 1. Session Isolation === #SessionIsolation 87 86 If you have implemented an anti-fingerprinting mode you don't want a website 88 87 to access information from the browser's normal mode - doing so might reveal … … 110 109 sidechannel-cookies such as 'window.name'. 111 110 111 == A 'Tracking-Resistant Mode' vs 'A Tracking-Resistant Browser' == 112 If you implement a tracking-resistant mode which users can switch in and out of then 113 you need to worry about SessionIsolation. If websites can read cookies and cache objects 114 from your browser's 'normal' mode that will undo a lot of the work you have put into 115 managing the user's fingerprint in tracking-resistant mode. This means you will have to 116 ensure the browser maintains separate profiles for each mode and no information is shared 117 between them. 118 119 This is not a concern if you are impementing a browser that is always tracking-resistant, since 120 you can purge cookies and cache objects without having to worry about the state of any other 121 sessions maintained by the user. 122 112 123 == Creating a Common Fingerprint == 113 124 This page is premised on the notion that the best way to mitigate against … … 125 136 hard to implement and even harder to get right. 126 137 127 = Creating a Static and CommonFingerprint for your WebKit Browser =138 = Creating a Static Fingerprint for your WebKit Browser = 128 139 129 140 == 1. Javascript Objects == … … 146 157 147 158 The document.referrer property needs to be managed in the same way as 148 [Referer Header and Origin Header] below. 149 150 === ii. History Object === 151 152 history.length:: 153 This value has potential, in cases where it is unusually high due to prolonged 154 use of a single browser/tab session, to assist sites in tracking the 155 user. That said, such users already have a pretty revealing cache and 156 coookie data set. 159 [#RefererHeader Referer Header and Origin Header] below. 160 161 === ii. Window.History Object === 162 163 [https://developer.mozilla.org/en/DOM/window.history history.length] has the potential, in cases where it is unusually high due to prolonged 164 use of a single browser/tab session, to assist sites in tracking the user. In the case of long-running sessions you may need 165 to update the value periodically so that it does not become revealing. 157 166 158 167 === iii. Window object === … … 190 199 === v. Screen object === 191 200 192 Torbutton and Tororause the following values for the Screen object's201 [http://www.torproject.org/torbutton/index.html.en Torbutton] and [https://github.com/mwenge/torora Torora] use the following values for the Screen object's 193 202 properties: 194 203 … … 204 213 }}} 205 214 206 Entropy for the values provided here isas much as 4.83 bits.215 Entropy for the values in the Screen object can be as much as 4.83 bits. 207 216 208 217 === vi. Navigator Object === … … 210 219 object and decide on a set of values that can remain static across many 211 220 releases as long as possible. You will also need to ensure that the values 212 decided upon here are also presented in the user-agent HTTP headerby your221 decided upon here are also presented in the [#UserAgentHeader user-agent HTTP header] by your 213 222 browser. 214 223 … … 217 226 it - making it a relatively safe option to follow IE's suit. If you do expose 218 227 a list of plugins through this property you will need to ensure your decision 219 is consistent with the behaviour you have implemented under Pluginsbelow.228 is consistent with the behaviour you have implemented under [#InstalledPlugins Plugins] below. 220 229 221 230 === vii. Date Object === … … 277 286 * https://bugs.webkit.org/show_bug.cgi?id=46566 278 287 279 == 3. CSS == 288 == 3. Form Auto-Filling == 289 Javascript can inspect the contents of form fields at any time so auto-completing forms with 290 cached values should be avoided. At the very least you will want to ensure that values cached 291 from the normal browsing mode are not used when in tracking-resistant mode. The safest bet is 292 to disable auto-completion altogether. 293 294 == 4. CSS == 280 295 281 296 === i. CSS Media Queries === … … 292 307 CSS rules may be used to inspect locally available fonts. A working example of 293 308 this 'font introspection' using simple CSS rules can be found at 294 http://flippingtypical. org.309 http://flippingtypical.com. 295 310 296 311 WebKit currently does not offer a means of countering this. … … 299 314 fonts are locally available when CSS rules are evaluated. 300 315 301 See also Fonts.316 See also [#Fonts Fonts] below. 302 317 303 318 === iii. Querying Page History with CSS === … … 316 331 317 332 318 == 4. Plugins and Java Applets ==333 == 5. Plugins and Java Applets == 319 334 320 335 If you want complete control over the information your browser reveals to … … 330 345 still scope for collecting a lot of information. 331 346 332 === i. Using the List of Installed Plugins To Build Up A Fingerprint === 347 === i. Using the List of Installed Plugins To Build Up A Fingerprint === #InstalledPlugins 333 348 334 349 As well as isolating users who have an exotic set of installed plugins, a major … … 394 409 395 410 396 == 5. SilverLight And ActiveX ==411 == 6. SilverLight And ActiveX == 397 412 TBC 398 413 399 == 6. Fonts ==414 == 7. Fonts == #Fonts 400 415 401 416 A site may render a page in a number of different fonts and then use … … 408 423 409 424 410 == 7. Cookies ==425 == 8. Cookies == 411 426 412 427 You either have these (i) disabled completely, (ii) clear them every time a new … … 416 431 your implementation of the Page Cache. 417 432 418 == 8. Third Party Cookies ==433 == 9. Third Party Cookies == 419 434 420 435 If you are clearing all cookies periodically then third-party cookies are not … … 426 441 bug. 427 442 428 Most WebKit ports offer you the possibility of managin third-party cookies443 Most WebKit ports offer you the possibility of managing third-party cookies 429 444 however you choose, and the default behaviour between WebKit ports often 430 445 differs - Safari is the most restrictive as it does not allow 3rd parties to … … 438 453 * https://bugs.webkit.org/show_bug.cgi?id=45455 439 454 440 == 9. Page Cache ==455 == 10. Page Cache == 441 456 442 457 The [http://samy.pl/evercookie/ evercookie] is an excellent practical … … 447 462 the page cache in the same way. 448 463 449 == 1 0. HTTP Headers ==464 == 11. HTTP Headers == 450 465 451 466 You will need to decide what to do with the Referer header, the Origin header, 452 467 the Accept header, and the Accept-Language header. 453 468 454 === i. User-Agent Header === 469 === Manipulating HTTP headers in QtWebKit === 470 In QtWebKit you can manipulate HTTP headers by subclassing QNetworkAccessManager and 471 reimplementing: 472 {{{ 473 QNetworkReply * QNetworkAccessManager::createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 ) 474 }}} 475 476 You could then perform the following: 477 478 {{{ 479 if (req.hasRawHeader("Referer")) 480 req.setRawHeader("Referer", "/"); 481 if (req.hasRawHeader("Origin")) 482 req.setRawHeader("Origin", "/"); 483 }}} 484 485 === i. User-Agent Header === #UserAgentHeader 455 486 456 487 Whatever decision you make about the User-Agent header, be prepared to stick 457 with the values you set initially for as long as possible. 458 459 === ii. Referer Header and Origin Header === 488 with the values you set initially for as long as possible. The simple reason for this is that 489 every change to the user-agent will divide your userbase into those who have the old header and those 490 who have the new one - creating new, unnecessary entropy each time. 491 492 === ii. Referer Header and Origin Header === #RefererHeader 460 493 461 494 Manipulating these headers isn't strictly a fingerprinting-resistance … … 490 523 aggressive cache-clearing policy. 491 524 492 == 1 1. DOM LocalStorage/DOM SessionStorage/DOM GlobalStorage ==525 == 12. DOM LocalStorage/DOM SessionStorage/DOM GlobalStorage == 493 526 Private browsing in WebKit denies read and write access to DOM storage since 494 527 https://bugs.webkit.org/show_bug.cgi?id=49329. 495 528 496 == 12. GeoLocation == 529 == 13. TLS/SSL Session IDs == #SessionIDs 530 WebKit does not implement your TLS/SSL network connections, but if you are offering 531 a tracking-resistant mode to users you will need to ensure that you keep a separate 532 TLS session cache for tracking-resistant mode. 533 534 You need to avoid the situation where a user can go to https://gmail.com in 535 ordinary mode, open a window in tracking-resistant mode, go to https://gmail.com and 536 use the same TLS Session ID from ordinary mode to resume that TLS session. 537 538 For more information see: 539 * http://code.google.com/p/chromium/issues/detail?id=30877 540 541 == 14. TLS/SSL Client Certificates == 542 As with [#SessionIDs Session IDs], WebKit is not responsible for your SSL stack. But you will need to ensure 543 that you keep a separate certificate store for use in tracking-resistant mode. 544 545 See also: 546 * http://code.google.com/p/chromium/issues/detail?id=47129 547 548 == 15. GeoLocation == 497 549 498 550 You will, um, need to ensure you disable geolocation if it supported by your … … 504 556 * https://www.torproject.org/torbutton/design/#FirefoxBugs 505 557 * http://browserspy.dk 506 *http://blog.torproject.org/blog/firefox-private-browsing-mode-torbutton-and- 507 fingerprinting 558 * http://blog.torproject.org/blog/firefox-private-browsing-mode-torbutton-and-fingerprinting 508 559 * http://www.collinjackson.com/research/private-browsing.pdf 509 560 * https://wiki.mozilla.org/Security/Anonymous_Browsing … … 513 564 * https://wiki.mozilla.org/Thirdparty 514 565 * http://lists.macosforge.org/pipermail/webkit-dev/2009-May/007788.html 515 * http://flippingtypical.org 566 * http://flippingtypical.com 567