Andrew Lewman commited on 2009-12-31 03:42:43
              Zeige 7 geänderte Dateien mit 4390 Einfügungen und 0 Löschungen.
            
| ... | ... | 
                      @@ -0,0 +1,120 @@  | 
                  
| 1 | 
                        +- Investigation of Privacy Mode:  | 
                    |
| 2 | 
                        + - Good:  | 
                    |
| 3 | 
                        + - Cookies Cleared+memory only  | 
                    |
| 4 | 
                        + - Cache cleared and memory-only  | 
                    |
| 5 | 
                        + - History not available via javascript or CSS  | 
                    |
| 6 | 
                        + - Safe because currently unsupported:  | 
                    |
| 7 | 
                        + - Geolocation not supported in browser  | 
                    |
| 8 | 
                        + - DOM Storage not supported  | 
                    |
| 9 | 
                        + - HTML5 Storage not supported  | 
                    |
| 10 | 
                        + - Http auth is cleared  | 
                    |
| 11 | 
                        + - Do they have a session store?  | 
                    |
| 12 | 
                        + - Yes. It is disabled.  | 
                    |
| 13 | 
                        + - Form history disabled  | 
                    |
| 14 | 
                        + - But non-private entries still available  | 
                    |
| 15 | 
                        + - Malware and phishing protection  | 
                    |
| 16 | 
                        + - Per-url check?  | 
                    |
| 17 | 
                        + - Doesn't seem like it..  | 
                    |
| 18 | 
                        + - Bad:  | 
                    |
| 19 | 
                        + - RLZ Identifier sent with all queries even in Incognito mode  | 
                    |
| 20 | 
                        + - http://www.google.com/support/chrome/bin/answer.py?hl=en&answer=107684  | 
                    |
| 21 | 
                        + - Flash cookies not cleared  | 
                    |
| 22 | 
                        + - Google gears are still available  | 
                    |
| 23 | 
                        + - Do they have their own storage?  | 
                    |
| 24 | 
                        + - Yes. Completely ignores private mode.  | 
                    |
| 25 | 
                        + - Safebrowsing API key not cleared?  | 
                    |
| 26 | 
                        + - but updates may not happen "under" the incognito window  | 
                    |
| 27 | 
                        + - Desktop resolution available  | 
                    |
| 28 | 
                        + - Browser resolution is available  | 
                    |
| 29 | 
                        + - SSL session keys  | 
                    |
| 30 | 
                        + - Not cleared!  | 
                    |
| 31 | 
                        + - They clear trusted certs tho  | 
                    |
| 32 | 
                        + - Timezone not spoofed  | 
                    |
| 33 | 
                        +  | 
                    |
| 34 | 
                        +- Misc Features we definitely need:  | 
                    |
| 35 | 
                        + - Incognito-specific proxy settings  | 
                    |
| 36 | 
                        + - Browser proxy settings currently do not apply immediately  | 
                    |
| 37 | 
                        + - Plugin enable/disable controls  | 
                    |
| 38 | 
                        + - Spoof user agent  | 
                    |
| 39 | 
                        + - Referer alteration API  | 
                    |
| 40 | 
                        + - Autolaunching of remote apps needs to be disabled  | 
                    |
| 41 | 
                        + - API to opt-out of all the opt-in tracking for incognito mode  | 
                    |
| 42 | 
                        + - Cookie API would be nice  | 
                    |
| 43 | 
                        + - Need network.security.ports.banned  | 
                    |
| 44 | 
                        + - http://www.remote.org/jochen/sec/hfpa/hfpa.pdf  | 
                    |
| 45 | 
                        + - Resize windows (content-window side possibly ok)  | 
                    |
| 46 | 
                        +  | 
                    |
| 47 | 
                        +- Future investigation  | 
                    |
| 48 | 
                        + - Non-private form history still available  | 
                    |
| 49 | 
                        + - Forms seem to not be auto-filled, but this may be different  | 
                    |
| 50 | 
                        + for some fields?  | 
                    |
| 51 | 
                        + - How evil is google update? will it happen over incognito?  | 
                    |
| 52 | 
                        + - http://en.wikipedia.org/wiki/Google_Updater#Google_Updater  | 
                    |
| 53 | 
                        + - http://en.wikipedia.org/wiki/SRWare_Iron#Differences_from_Chrome  | 
                    |
| 54 | 
                        + - http://foliovision.com/2008/12/09/adwords-ppc-organic-rlz/  | 
                    |
| 55 | 
                        + - Test in more detail with sysinternals for disk writes  | 
                    |
| 56 | 
                        + - What about safebrowsing requests? Can they bypass proxy?  | 
                    |
| 57 | 
                        + - Video tag supports H264 and ogg via ffmpeg  | 
                    |
| 58 | 
                        + - Hrmm.. proxy bypass ability?  | 
                    |
| 59 | 
                        +  | 
                    |
| 60 | 
                        +- Test results. Used Incognito Mode with the test suites from:  | 
                    |
| 61 | 
                        + https://www.torproject.org/torbutton/design/#SingleStateTesting  | 
                    |
| 62 | 
                        + - Decloak.net:  | 
                    |
| 63 | 
                        + - Recovers IP and DNS via Java  | 
                    |
| 64 | 
                        + - Recovers IP via flash  | 
                    |
| 65 | 
                        + - Deanonymizer.com  | 
                    |
| 66 | 
                        + - Failed NNTP and FTP quicktime  | 
                    |
| 67 | 
                        + - JohnDo's hated some headers  | 
                    |
| 68 | 
                        + - Mr. T got a lot of shit wrong...  | 
                    |
| 69 | 
                        + - http://labs.isecpartners.com/breadcrumbs/breadcrumbs.html  | 
                    |
| 70 | 
                        +  | 
                    |
| 71 | 
                        +- Comparison with Torora  | 
                    |
| 72 | 
                        + - http://github.com/mwenge/torora/tree/master/doc/DESIGN.torora  | 
                    |
| 73 | 
                        + - Good ideas for both chrome and torbutton:  | 
                    |
| 74 | 
                        + - Cache/Cookie expiry every 24hrs  | 
                    |
| 75 | 
                        + - Random preturbation on Date() object..  | 
                    |
| 76 | 
                        + - No longer possible without js hooks :/  | 
                    |
| 77 | 
                        + - Possible if Chrome allows non-delatable shadowing of window.Date()  | 
                    |
| 78 | 
                        + from user scripts. ECMA says it should  | 
                    |
| 79 | 
                        +  | 
                    |
| 80 | 
                        +==========================================  | 
                    |
| 81 | 
                        +  | 
                    |
| 82 | 
                        +- Incognito Issues:  | 
                    |
| 83 | 
                        + - SSL session keys  | 
                    |
| 84 | 
                        + - Not cleared!  | 
                    |
| 85 | 
                        + - Flash cookies not cleared  | 
                    |
| 86 | 
                        + - Better Privacy? Permissions?  | 
                    |
| 87 | 
                        + - Google gears are still available  | 
                    |
| 88 | 
                        + - Do they have their own storage?  | 
                    |
| 89 | 
                        + - Yes. Completely ignores private mode.  | 
                    |
| 90 | 
                        + - RLZ override/disable for incognito  | 
                    |
| 91 | 
                        + - Opt out of opt-in tracking?  | 
                    |
| 92 | 
                        + - Source code:  | 
                    |
| 93 | 
                        + http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/profile.cc  | 
                    |
| 94 | 
                        +  | 
                    |
| 95 | 
                        +- Privacy Enhancing API Wishlist (remove existing items):  | 
                    |
| 96 | 
                        + - http://code.google.com/chrome/extensions/devguide.html  | 
                    |
| 97 | 
                        + - Prefs (copy-on-write for incognito mode)  | 
                    |
| 98 | 
                        + - Incognito-specific proxy settings  | 
                    |
| 99 | 
                        + - Should not be used for safebrowsing or app/addon update  | 
                    |
| 100 | 
                        + - pref to disable autolaunch of apps/warn user  | 
                    |
| 101 | 
                        + - network.security.ports.banned  | 
                    |
| 102 | 
                        + - User agent (that also govern navigator.*)  | 
                    |
| 103 | 
                        + - could be done (better) via http headers and good hook support  | 
                    |
| 104 | 
                        + - Core APIs:  | 
                    |
| 105 | 
                        + - Per-Plugin enable/disable controls  | 
                    |
| 106 | 
                        + - Cookie API  | 
                    |
| 107 | 
                        + - Cache control  | 
                    |
| 108 | 
                        +    - HTTP header alteration ("on-modify-request")
                       | 
                    |
| 109 | 
                        + - Referrer, accept, user agent  | 
                    |
| 110 | 
                        + - Javascript hooks:  | 
                    |
| 111 | 
                        + - http://code.google.com/chrome/extensions/content_scripts.html  | 
                    |
| 112 | 
                        + - Bleh, these suck... Too limited.  | 
                    |
| 113 | 
                        + - ECMA compliance  | 
                    |
| 114 | 
                        + - desktop+screen resolution  | 
                    |
| 115 | 
                        + - Date hooking  | 
                    |
| 116 | 
                        + - navigator.* hooking  | 
                    |
| 117 | 
                        +  | 
                    |
| 118 | 
                        +- Posted at:  | 
                    |
| 119 | 
                        + - http://groups.google.com/group/chromium-extensions/t/ceba26ca9e2f6a78  | 
                    |
| 120 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,195 @@  | 
                  
| 1 | 
                        +First pass: Quick Review of Firefox Features  | 
                    |
| 2 | 
                        +- Video Tag  | 
                    |
| 3 | 
                        + - Docs:  | 
                    |
| 4 | 
                        + - https://developer.mozilla.org/En/HTML/Element/Audio  | 
                    |
| 5 | 
                        + - https://developer.mozilla.org/En/HTML/Element/Video  | 
                    |
| 6 | 
                        + - https://developer.mozilla.org/En/HTML/Element/Source  | 
                    |
| 7 | 
                        + - https://developer.mozilla.org/En/Manipulating_video_using_canvas  | 
                    |
| 8 | 
                        + - https://developer.mozilla.org/En/nsIDOMHTMLMediaElement  | 
                    |
| 9 | 
                        + - https://developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements  | 
                    |
| 10 | 
                        + - http://en.flossmanuals.net/TheoraCookbook  | 
                    |
| 11 | 
                        + - nsIContentPolicy is checked on load  | 
                    |
| 12 | 
                        + - Uses NSIChannels for initial load  | 
                    |
| 13 | 
                        + - Wrapped in nsHTMLMediaElement::mDecoder  | 
                    |
| 14 | 
                        + - is nsOggDecoder() or nsWaveDecoder()  | 
                    |
| 15 | 
                        + - liboggplay  | 
                    |
| 16 | 
                        + - Governed by media.* prefs  | 
                    |
| 17 | 
                        + - Preliminary audit shows they do not use the liboggplay tcp functions  | 
                    |
| 18 | 
                        +- Geolocation  | 
                    |
| 19 | 
                        + - Wifi:  | 
                    |
| 20 | 
                        + - https://developer.mozilla.org/En/Monitoring_WiFi_access_points  | 
                    |
| 21 | 
                        + - Requires security policy to allow. Then still prompted  | 
                    |
| 22 | 
                        + - navigator.geolocation  | 
                    |
| 23 | 
                        + - Governed by geo.enabled  | 
                    |
| 24 | 
                        + - "2 week access token" is set  | 
                    |
| 25 | 
                        + - geo.wifi.access_token.. Clearing is prob a good idea  | 
                    |
| 26 | 
                        + - http://mxr.mozilla.org/mozilla1.9.1/source/dom/src/geolocation/NetworkGeolocationProvider.js  | 
                    |
| 27 | 
                        + - https://developer.mozilla.org/En/Using_geolocation  | 
                    |
| 28 | 
                        +- DNS prefetching after toggle  | 
                    |
| 29 | 
                        + - prefetch pref? Always disable for now?  | 
                    |
| 30 | 
                        + - network.dns.disablePrefetch  | 
                    |
| 31 | 
                        + - Also disabled in netwerk/dns/src/nsDNSService2.cpp when manual proxies  | 
                    |
| 32 | 
                        + are set..  | 
                    |
| 33 | 
                        + - This should prevent prefetching of non-tor urls in tor mode..  | 
                    |
| 34 | 
                        + - But the reverse is unclear.  | 
                    |
| 35 | 
                        + - DocShell attribute!!1 YAY  | 
                    |
| 36 | 
                        + - http://www.oxymoronical.com/experiments/apidocs/interface/nsIDocShell  | 
                    |
| 37 | 
                        + - "Takes effect for the NEXT document loaded...."  | 
                    |
| 38 | 
                        + - Do we win this race? hrmm.. If we do, the tor->nontor direction  | 
                    |
| 39 | 
                        + should also be safe.  | 
                    |
| 40 | 
                        + - Content policy called?  | 
                    |
| 41 | 
                        + - No. See content/html/content/src/nsHTMLDNSPrefetch.cpp  | 
                    |
| 42 | 
                        +- Storage  | 
                    |
| 43 | 
                        + - https://developer.mozilla.org/en/Storage  | 
                    |
| 44 | 
                        + - "It is available to trusted callers, meaning extensions and Firefox  | 
                    |
| 45 | 
                        + components only."  | 
                    |
| 46 | 
                        +- New content policy  | 
                    |
| 47 | 
                        + - Content Security Policy. Addon-only  | 
                    |
| 48 | 
                        +- "Offline resources"  | 
                    |
| 49 | 
                        + - https://developer.mozilla.org/en/Offline_resources_in_Firefox  | 
                    |
| 50 | 
                        + - https://developer.mozilla.org/en/nsIApplicationCache  | 
                    |
| 51 | 
                        + - browser.cache.offline.enable toggles  | 
                    |
| 52 | 
                        + - browser.cache.disk.enable does not apply. Seperate "device".  | 
                    |
| 53 | 
                        + - Does our normal cache clearing mechanism apply?  | 
                    |
| 54 | 
                        + - We call nsICacheService.evictEntries()  | 
                    |
| 55 | 
                        + - May need: nsOfflineCacheDevice::EvictEntries(NULL)  | 
                    |
| 56 | 
                        + - Code is smart enough to behave cleanly if we simply set  | 
                    |
| 57 | 
                        + browser.cache.offline.enable or enable private browsing.  | 
                    |
| 58 | 
                        +- Mouse gesture and other new DOM events  | 
                    |
| 59 | 
                        +- Fonts  | 
                    |
| 60 | 
                        + - Remote fonts obey content policy. Good.  | 
                    |
| 61 | 
                        + - XXX: Are they cached independent of regular cache? Prob not.  | 
                    |
| 62 | 
                        + - Hrmm can probe for installed fonts:  | 
                    |
| 63 | 
                        + http://remysharp.com/2008/07/08/how-to-detect-if-a-font-is-installed-only-using-javascript/  | 
                    |
| 64 | 
                        + http://www.lalit.org/lab/javascript-css-font-detect  | 
                    |
| 65 | 
                        + http://www.ajaxupdates.com/cssjavascript-font-detector/  | 
                    |
| 66 | 
                        + http://code.google.com/p/jquery-fontavailable/  | 
                    |
| 67 | 
                        +- Drag and drop  | 
                    |
| 68 | 
                        + - https://developer.mozilla.org/En/DragDrop/Drag_and_Drop  | 
                    |
| 69 | 
                        + - https://developer.mozilla.org/En/DragDrop/Drag_Operations  | 
                    |
| 70 | 
                        + - https://developer.mozilla.org/En/DragDrop/Dragging_and_Dropping_Multiple_Items  | 
                    |
| 71 | 
                        + - https://developer.mozilla.org/En/DragDrop/Recommended_Drag_Types  | 
                    |
| 72 | 
                        + - https://developer.mozilla.org/En/DragDrop/DataTransfer  | 
                    |
| 73 | 
                        + - Should be no different than normal url handling..  | 
                    |
| 74 | 
                        +- Local Storage  | 
                    |
| 75 | 
                        + - https://developer.mozilla.org/en/DOM/Storage#localStorage  | 
                    |
| 76 | 
                        + - Disabled by dom storage pref..  | 
                    |
| 77 | 
                        + - Private browsing mode has its own DB  | 
                    |
| 78 | 
                        + - Memory only?  | 
                    |
| 79 | 
                        + - Disk Avoidance of gStorage and local storage:  | 
                    |
| 80 | 
                        + - mSessionOnly set via nsDOMStorage::CanUseStorage()  | 
                    |
| 81 | 
                        + - Seems to be set to true if cookies are session-only or private  | 
                    |
| 82 | 
                        + browsing mode  | 
                    |
| 83 | 
                        + - Our cookies are NOT session-only with dual cookie jars  | 
                    |
| 84 | 
                        + - but this is ok if we clear the session storage..  | 
                    |
| 85 | 
                        + - XXX: Technically clearing session storage may break  | 
                    |
| 86 | 
                        + sites if cookies remain though  | 
                    |
| 87 | 
                        + - nsDOMStoragePersistentDB not used if mSessionOnly  | 
                    |
| 88 | 
                        + - Can clear with nsDOMStorage::ClearAll() or nsIDOMStorage2::clear()?  | 
                    |
| 89 | 
                        + - These only work for a particular storage. There's both global now  | 
                    |
| 90 | 
                        + and per-origin storage instances  | 
                    |
| 91 | 
                        + - Each docshell has tons of storages for each origin contained in it  | 
                    |
| 92 | 
                        + - Toggling dom.storage.enabled does not clear existing storage  | 
                    |
| 93 | 
                        + - Oh HOT! cookie-changed to clear cookies clears all storages!  | 
                    |
| 94 | 
                        + - happens for both ff3.0 and 3.5 in dom/src/storage/nsDOMStorage.cpp  | 
                    |
| 95 | 
                        + - Conclusion:  | 
                    |
| 96 | 
                        + - can safely enable dom storage  | 
                    |
| 97 | 
                        + - May have minor buggy usability issues unless we preserve it  | 
                    |
| 98 | 
                        + when user is preserving cookies..  | 
                    |
| 99 | 
                        +  | 
                    |
| 100 | 
                        +Second Pass: Verification of all Torbutton Assumptions  | 
                    |
| 101 | 
                        +- "Better privacy controls"  | 
                    |
| 102 | 
                        + - Basically UI stuff for prefs we set already  | 
                    |
| 103 | 
                        + - address bar search disable option is interesting, but not  | 
                    |
| 104 | 
                        + torbutton's job to toggle. Users will hate us.  | 
                    |
| 105 | 
                        +- Private browsing  | 
                    |
| 106 | 
                        + - https://developer.mozilla.org/En/Supporting_private_browsing_mode  | 
                    |
| 107 | 
                        + - We should consider an option (off by default) to enable PBM during  | 
                    |
| 108 | 
                        + toggle  | 
                    |
| 109 | 
                        + - It is a good idea because it will let our users use DOM storage  | 
                    |
| 110 | 
                        + safely and also may cause their plugins and other addons to be  | 
                    |
| 111 | 
                        + safe  | 
                    |
| 112 | 
                        + - Doing it always will cause the user to lose fine-grained control  | 
                    |
| 113 | 
                        + of many settings  | 
                    |
| 114 | 
                        + - Also we'll need to prevent them from leaving without toggling tor  | 
                    |
| 115 | 
                        + - Stuff the emit does (grep for NS_PRIVATE_BROWSING_SWITCH_TOPIC and  | 
                    |
| 116 | 
                        + "private-browsing")  | 
                    |
| 117 | 
                        + - XXX: clear mozilla.org/security/sdr;1. We should too! Wtf is it??  | 
                    |
| 118 | 
                        + - Neg. Best to let them handle this. Users will be annoyed  | 
                    |
| 119 | 
                        + at having to re-enter their passwords..  | 
                    |
| 120 | 
                        + - They also clear the console service..  | 
                    |
| 121 | 
                        + - Recommend watching private-browsing-cancel-vote and blocking if  | 
                    |
| 122 | 
                        + we are performing a db operation  | 
                    |
| 123 | 
                        + - Maybe we want to block transitions during our toggle for safety  | 
                    |
| 124 | 
                        + - XXX: They also clear general.open_location.last_url  | 
                    |
| 125 | 
                        + - XXX: mozilla.org/permissionmanager  | 
                    |
| 126 | 
                        + - XXX: mozilla.org/content-pref/service  | 
                    |
| 127 | 
                        + - XXX: Sets browser.zoom.siteSpecific to false  | 
                    |
| 128 | 
                        + - Interesting.. They clear their titles.. I wonder if some  | 
                    |
| 129 | 
                        + window managers log titles.. But that level of surveillance is  | 
                    |
| 130 | 
                        + unbeatable..  | 
                    |
| 131 | 
                        + - XXX: Unless there is some way for flash or script to read titles?  | 
                    |
| 132 | 
                        + - They empty the clipboard..  | 
                    |
| 133 | 
                        + - Can js access the clipboard?? ...  | 
                    |
| 134 | 
                        + - Yes, but needs special pref+confirmation box  | 
                    |
| 135 | 
                        + - http://www.dynamic-tools.net/toolbox/copyToClipboard/  | 
                    |
| 136 | 
                        + - They clear cache..  | 
                    |
| 137 | 
                        + - Cookies:  | 
                    |
| 138 | 
                        + - Use in-memory table that is different than their default  | 
                    |
| 139 | 
                        + - This could fuck up our cookie storage options  | 
                    |
| 140 | 
                        + - We could maybe prevent them from getting this  | 
                    |
| 141 | 
                        + event by wrapping nsCookieService::Observe(). Lullz..  | 
                    |
| 142 | 
                        + - NavHistory:  | 
                    |
| 143 | 
                        + - XXX: nsNavHistory::AutoCompleteFeedback() doesn't track  | 
                    |
| 144 | 
                        + awesomebar choices for feedback.. Is this done on disk?  | 
                    |
| 145 | 
                        + - Don't add history entries  | 
                    |
| 146 | 
                        + - We should block this observe event too if we can..  | 
                    |
| 147 | 
                        + - The session store stops storing tabs  | 
                    |
| 148 | 
                        + - We could block this observe  | 
                    |
| 149 | 
                        + - XXX: They expunge private temporary files on exit from PMB  | 
                    |
| 150 | 
                        + - This is not done normally until browser exit or  | 
                    |
| 151 | 
                        + "on-profile-change"  | 
                    |
| 152 | 
                        + - emits browser:purge-domain-data.. Mostly just for session  | 
                    |
| 153 | 
                        + editing it appears  | 
                    |
| 154 | 
                        + - Direct component query for pbs.privateBrowsingEnabled  | 
                    |
| 155 | 
                        + - This is where we have no ability to provide certain option  | 
                    |
| 156 | 
                        + control  | 
                    |
| 157 | 
                        + - browser.js seems to prevent user from allowing blocked  | 
                    |
| 158 | 
                        + popups?  | 
                    |
| 159 | 
                        + - Some items in some places context menu get blocked:  | 
                    |
| 160 | 
                        + - Can't delete items from history? placesContext_deleteHost  | 
                    |
| 161 | 
                        + - nsCookiePermission::InPrivateBrowsing() calls direct  | 
                    |
| 162 | 
                        + - but is irellevant  | 
                    |
| 163 | 
                        + - Form history cannot be saved while in PBM.. :(  | 
                    |
| 164 | 
                        + - User won't be prompted for adding login passwords..  | 
                    |
| 165 | 
                        + - Can't remember prefs on content types  | 
                    |
| 166 | 
                        + - Many components read this value upon init:  | 
                    |
| 167 | 
                        + - This fucks up our observer game if tor starts enabled  | 
                    |
| 168 | 
                        + - NavHistory and cookie and dl manager  | 
                    |
| 169 | 
                        + - We could just wrap the bool on startup and lie  | 
                    |
| 170 | 
                        + and emit later... :/  | 
                    |
| 171 | 
                        + - Or! emit an exit and an enter always at startup if tor is  | 
                    |
| 172 | 
                        + enabled.  | 
                    |
| 173 | 
                        + - Read iSec report  | 
                    |
| 174 | 
                        + - Compare to Chrome  | 
                    |
| 175 | 
                        + - API use cases  | 
                    |
| 176 | 
                        +- SessionStore  | 
                    |
| 177 | 
                        + - Has been reworked with observers and write methods. Should use those.  | 
                    |
| 178 | 
                        +- security.enable_ssl2 to clear session id  | 
                    |
| 179 | 
                        + - Still cleared  | 
                    |
| 180 | 
                        +- browser.sessionstore.max_tabs_undo  | 
                    |
| 181 | 
                        + - Yep.  | 
                    |
| 182 | 
                        +- SafeBrowsing Update Key removed on cookie clear still?  | 
                    |
| 183 | 
                        + - Yep.  | 
                    |
| 184 | 
                        +- Livemark updates have kill events now  | 
                    |
| 185 | 
                        +- Test if nsICertStore is still buggy...  | 
                    |
| 186 | 
                        +  | 
                    |
| 187 | 
                        +Third Pass: Exploit Auditing  | 
                    |
| 188 | 
                        +- Remote fonts  | 
                    |
| 189 | 
                        +- SVG with HTML  | 
                    |
| 190 | 
                        +- Javascript threads+locking  | 
                    |
| 191 | 
                        +- Ogg theora and vorbis codecs  | 
                    |
| 192 | 
                        +- SQLite  | 
                    |
| 193 | 
                        +  | 
                    |
| 194 | 
                        +  | 
                    |
| 195 | 
                        +- https://developer.mozilla.org/en/Firefox_3_for_developers  | 
                    
| ... | ... | 
                      @@ -0,0 +1 @@  | 
                  
| 1 | 
                        +xsltproc --output index.html.en --stringparam section.autolabel.max.depth 2 --stringparam section.autolabel 1 /usr/share/sgml/docbook/xsl-stylesheets-1.75.2/xhtml/docbook.xsl design.xml  | 
                    
| ... | ... | 
                      @@ -0,0 +1,2640 @@  | 
                  
| 1 | 
                        +<?xml version="1.0" encoding="ISO-8859-1"?>  | 
                    |
| 2 | 
                        +<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"  | 
                    |
| 3 | 
                        + "file:///usr/share/sgml/docbook/xml-dtd-4.4-1.0-30.1/docbookx.dtd">  | 
                    |
| 4 | 
                        +  | 
                    |
| 5 | 
                        +<article id="design">  | 
                    |
| 6 | 
                        + <articleinfo>  | 
                    |
| 7 | 
                        + <title>Torbutton Design Documentation</title>  | 
                    |
| 8 | 
                        + <author>  | 
                    |
| 9 | 
                        + <firstname>Mike</firstname><surname>Perry</surname>  | 
                    |
| 10 | 
                        + <affiliation>  | 
                    |
| 11 | 
                        + <address><email>mikeperry.fscked/org</email></address>  | 
                    |
| 12 | 
                        + </affiliation>  | 
                    |
| 13 | 
                        + </author>  | 
                    |
| 14 | 
                        + <pubdate>Dec 15 2009</pubdate>  | 
                    |
| 15 | 
                        + </articleinfo>  | 
                    |
| 16 | 
                        +  | 
                    |
| 17 | 
                        +<sect1>  | 
                    |
| 18 | 
                        + <title>Introduction</title>  | 
                    |
| 19 | 
                        + <para>  | 
                    |
| 20 | 
                        +  | 
                    |
| 21 | 
                        +This document describes the goals, operation, and testing procedures of the  | 
                    |
| 22 | 
                        +Torbutton Firefox extension. It is current as of Torbutton 1.2.4.  | 
                    |
| 23 | 
                        +  | 
                    |
| 24 | 
                        + </para>  | 
                    |
| 25 | 
                        + <sect2 id="adversary">  | 
                    |
| 26 | 
                        + <title>Adversary Model</title>  | 
                    |
| 27 | 
                        + <para>  | 
                    |
| 28 | 
                        +  | 
                    |
| 29 | 
                        +A Tor web browser adversary has a number of goals, capabilities, and attack  | 
                    |
| 30 | 
                        +types that can be used to guide us towards a set of requirements for the  | 
                    |
| 31 | 
                        +Torbutton extension. Let's start with the goals.  | 
                    |
| 32 | 
                        +  | 
                    |
| 33 | 
                        + </para>  | 
                    |
| 34 | 
                        + <sect3 id="adversarygoals">  | 
                    |
| 35 | 
                        + <title>Adversary Goals</title>  | 
                    |
| 36 | 
                        + <orderedlist>  | 
                    |
| 37 | 
                        +<!-- These aren't really commands.. But it's the closest I could find in an  | 
                    |
| 38 | 
                        +acceptable style.. Don't really want to make my own stylesheet -->  | 
                    |
| 39 | 
                        + <listitem><command>Bypassing proxy settings</command>  | 
                    |
| 40 | 
                        + <para>The adversary's primary goal is direct compromise and bypass of  | 
                    |
| 41 | 
                        +Tor, causing the user to directly connect to an IP of the adversary's  | 
                    |
| 42 | 
                        +choosing.</para>  | 
                    |
| 43 | 
                        + </listitem>  | 
                    |
| 44 | 
                        + <listitem><command>Correlation of Tor vs Non-Tor Activity</command>  | 
                    |
| 45 | 
                        + <para>If direct proxy bypass is not possible, the adversary will likely  | 
                    |
| 46 | 
                        +happily settle for the ability to correlate something a user did via Tor with  | 
                    |
| 47 | 
                        +their non-Tor activity. This can be done with cookies, cache identifiers,  | 
                    |
| 48 | 
                        +javascript events, and even CSS. Sometimes the fact that a user uses Tor may  | 
                    |
| 49 | 
                        +be enough for some authorities.</para>  | 
                    |
| 50 | 
                        + </listitem>  | 
                    |
| 51 | 
                        + <listitem><command>History disclosure</command>  | 
                    |
| 52 | 
                        + <para>  | 
                    |
| 53 | 
                        +The adversary may also be interested in history disclosure: the ability to  | 
                    |
| 54 | 
                        +query a user's history to see if they have issued certain censored search  | 
                    |
| 55 | 
                        +queries, or visited censored sites.  | 
                    |
| 56 | 
                        + </para>  | 
                    |
| 57 | 
                        + </listitem>  | 
                    |
| 58 | 
                        + <listitem><command>Location information</command>  | 
                    |
| 59 | 
                        + <para>  | 
                    |
| 60 | 
                        +  | 
                    |
| 61 | 
                        +Location information such as timezone and locality can be useful for the  | 
                    |
| 62 | 
                        +adversary to determine if a user is in fact originating from one of the  | 
                    |
| 63 | 
                        +regions they are attempting to control, or to zero-in on the geographical  | 
                    |
| 64 | 
                        +location of a particular dissident or whistleblower.  | 
                    |
| 65 | 
                        +  | 
                    |
| 66 | 
                        + </para>  | 
                    |
| 67 | 
                        + </listitem>  | 
                    |
| 68 | 
                        + <listitem><command>Miscellaneous anonymity set reduction</command>  | 
                    |
| 69 | 
                        + <para>  | 
                    |
| 70 | 
                        +  | 
                    |
| 71 | 
                        +Anonymity set reduction is also useful in attempting to zero in on a  | 
                    |
| 72 | 
                        +particular individual. If the dissident or whistleblower is using a rare build  | 
                    |
| 73 | 
                        +of Firefox for an obscure operating system, this can be very useful  | 
                    |
| 74 | 
                        +information for tracking them down, or at least <link  | 
                    |
| 75 | 
                        +linkend="fingerprinting">tracking their activities</link>.  | 
                    |
| 76 | 
                        +  | 
                    |
| 77 | 
                        + </para>  | 
                    |
| 78 | 
                        + </listitem>  | 
                    |
| 79 | 
                        + <listitem><command>History records and other on-disk  | 
                    |
| 80 | 
                        +information</command>  | 
                    |
| 81 | 
                        + <para>  | 
                    |
| 82 | 
                        +In some cases, the adversary may opt for a heavy-handed approach, such as  | 
                    |
| 83 | 
                        +seizing the computers of all Tor users in an area (especially after narrowing  | 
                    |
| 84 | 
                        +the field by the above two pieces of information). History records and cache  | 
                    |
| 85 | 
                        +data are the primary goals here.  | 
                    |
| 86 | 
                        + </para>  | 
                    |
| 87 | 
                        + </listitem>  | 
                    |
| 88 | 
                        + </orderedlist>  | 
                    |
| 89 | 
                        + </sect3>  | 
                    |
| 90 | 
                        +  | 
                    |
| 91 | 
                        + <sect3 id="adversarypositioning">  | 
                    |
| 92 | 
                        + <title>Adversary Capabilities - Positioning</title>  | 
                    |
| 93 | 
                        + <para>  | 
                    |
| 94 | 
                        +The adversary can position themselves at a number of different locations in  | 
                    |
| 95 | 
                        +order to execute their attacks.  | 
                    |
| 96 | 
                        + </para>  | 
                    |
| 97 | 
                        + <orderedlist>  | 
                    |
| 98 | 
                        + <listitem><command>Exit Node or Upstream Router</command>  | 
                    |
| 99 | 
                        + <para>  | 
                    |
| 100 | 
                        +The adversary can run exit nodes, or alternatively, they may control routers  | 
                    |
| 101 | 
                        +upstream of exit nodes. Both of these scenarios have been observed in the  | 
                    |
| 102 | 
                        +wild.  | 
                    |
| 103 | 
                        + </para>  | 
                    |
| 104 | 
                        + </listitem>  | 
                    |
| 105 | 
                        + <listitem><command>Adservers and/or Malicious Websites</command>  | 
                    |
| 106 | 
                        + <para>  | 
                    |
| 107 | 
                        +The adversary can also run websites, or more likely, they can contract out  | 
                    |
| 108 | 
                        +ad space from a number of different adservers and inject content that way. For  | 
                    |
| 109 | 
                        +some users, the adversary may be the adservers themselves. It is not  | 
                    |
| 110 | 
                        +inconceivable that adservers may try to subvert or reduce a user's anonymity  | 
                    |
| 111 | 
                        +through Tor for marketing purposes.  | 
                    |
| 112 | 
                        + </para>  | 
                    |
| 113 | 
                        + </listitem>  | 
                    |
| 114 | 
                        + <listitem><command>Local Network/ISP/Upstream Router</command>  | 
                    |
| 115 | 
                        + <para>  | 
                    |
| 116 | 
                        +The adversary can also inject malicious content at the user's upstream router  | 
                    |
| 117 | 
                        +when they have Tor disabled, in an attempt to correlate their Tor and Non-Tor  | 
                    |
| 118 | 
                        +activity.  | 
                    |
| 119 | 
                        + </para>  | 
                    |
| 120 | 
                        + </listitem>  | 
                    |
| 121 | 
                        + <listitem><command>Physical Access</command>  | 
                    |
| 122 | 
                        + <para>  | 
                    |
| 123 | 
                        +Some users face adversaries with intermittent or constant physical access.  | 
                    |
| 124 | 
                        +Users in Internet cafes, for example, face such a threat. In addition, in  | 
                    |
| 125 | 
                        +countries where simply using tools like Tor is illegal, users may face  | 
                    |
| 126 | 
                        +confiscation of their computer equipment for excessive Tor usage or just  | 
                    |
| 127 | 
                        +general suspicion.  | 
                    |
| 128 | 
                        + </para>  | 
                    |
| 129 | 
                        + </listitem>  | 
                    |
| 130 | 
                        + </orderedlist>  | 
                    |
| 131 | 
                        + </sect3>  | 
                    |
| 132 | 
                        +  | 
                    |
| 133 | 
                        + <sect3 id="attacks">  | 
                    |
| 134 | 
                        + <title>Adversary Capabilities - Attacks</title>  | 
                    |
| 135 | 
                        + <para>  | 
                    |
| 136 | 
                        +  | 
                    |
| 137 | 
                        +The adversary can perform the following attacks from a number of different  | 
                    |
| 138 | 
                        +positions to accomplish various aspects of their goals. It should be noted  | 
                    |
| 139 | 
                        +that many of these attacks (especially those involving IP address leakage) are  | 
                    |
| 140 | 
                        +often performed by accident by websites that simply have Javascript, dynamic  | 
                    |
| 141 | 
                        +CSS elements, and plugins. Others are performed by adservers seeking to  | 
                    |
| 142 | 
                        +correlate users' activity across different IP addresses, and still others are  | 
                    |
| 143 | 
                        +performed by malicious agents on the Tor network and at national firewalls.  | 
                    |
| 144 | 
                        +  | 
                    |
| 145 | 
                        + </para>  | 
                    |
| 146 | 
                        + <orderedlist>  | 
                    |
| 147 | 
                        + <listitem><command>Inserting Javascript</command>  | 
                    |
| 148 | 
                        + <para>  | 
                    |
| 149 | 
                        +If not properly disabled, Javascript event handlers and timers  | 
                    |
| 150 | 
                        +can cause the browser to perform network activity after Tor has been disabled,  | 
                    |
| 151 | 
                        +thus allowing the adversary to correlate Tor and Non-Tor activity and reveal  | 
                    |
| 152 | 
                        +a user's non-Tor IP address. Javascript  | 
                    |
| 153 | 
                        +also allows the adversary to execute <ulink  | 
                    |
| 154 | 
                        +url="http://whattheinternetknowsaboutyou.com/">history disclosure attacks</ulink>:  | 
                    |
| 155 | 
                        +to query the history via the different attributes of 'visited' links to search  | 
                    |
| 156 | 
                        +for particular google queries, sites, or even to <ulink  | 
                    |
| 157 | 
                        +url="http://www.mikeonads.com/2008/07/13/using-your-browser-url-history-estimate-gender/">profile  | 
                    |
| 158 | 
                        +users based on gender and other classifications</ulink>. Finally,  | 
                    |
| 159 | 
                        +Javascript can be used to query the user's timezone via the  | 
                    |
| 160 | 
                        +<function>Date()</function> object, and to reduce the anonymity set by querying  | 
                    |
| 161 | 
                        +the <function>navigator</function> object for operating system, CPU, locale,  | 
                    |
| 162 | 
                        +and user agent information.  | 
                    |
| 163 | 
                        + </para>  | 
                    |
| 164 | 
                        + </listitem>  | 
                    |
| 165 | 
                        +  | 
                    |
| 166 | 
                        + <listitem><command>Inserting Plugins</command>  | 
                    |
| 167 | 
                        + <para>  | 
                    |
| 168 | 
                        +  | 
                    |
| 169 | 
                        +Plugins are abysmal at obeying the proxy settings of the browser. Every plugin  | 
                    |
| 170 | 
                        +capable of performing network activity that the author has  | 
                    |
| 171 | 
                        +investigated is also capable of performing network activity independent of  | 
                    |
| 172 | 
                        +browser proxy settings - and often independent of its own proxy settings.  | 
                    |
| 173 | 
                        +Sites that have plugin content don't even have to be malicious to obtain a  | 
                    |
| 174 | 
                        +user's  | 
                    |
| 175 | 
                        +Non-Tor IP (it usually leaks by itself), though <ulink  | 
                    |
| 176 | 
                        +url="http://decloak.net">plenty of active  | 
                    |
| 177 | 
                        +exploits</ulink> are possible as well. In addition, plugins can be used to store unique identifiers that are more  | 
                    |
| 178 | 
                        +difficult to clear than standard cookies.  | 
                    |
| 179 | 
                        +<ulink url="http://epic.org/privacy/cookies/flash.html">Flash-based  | 
                    |
| 180 | 
                        +cookies</ulink> fall into this category, but there are likely numerous other  | 
                    |
| 181 | 
                        +examples.  | 
                    |
| 182 | 
                        +  | 
                    |
| 183 | 
                        + </para>  | 
                    |
| 184 | 
                        + </listitem>  | 
                    |
| 185 | 
                        + <listitem><command>Inserting CSS</command>  | 
                    |
| 186 | 
                        + <para>  | 
                    |
| 187 | 
                        +  | 
                    |
| 188 | 
                        +CSS can also be used to correlate Tor and Non-Tor activity and reveal a user's  | 
                    |
| 189 | 
                        +Non-Tor IP address, via the usage of  | 
                    |
| 190 | 
                        +<ulink url="http://www.tjkdesign.com/articles/css%20pop%20ups/">CSS  | 
                    |
| 191 | 
                        +popups</ulink> - essentially CSS-based event handlers that fetch content via  | 
                    |
| 192 | 
                        +CSS's onmouseover attribute. If these popups are allowed to perform network  | 
                    |
| 193 | 
                        +activity in a different Tor state than they were loaded in, they can easily  | 
                    |
| 194 | 
                        +correlate Tor and Non-Tor activity and reveal a user's IP address. In  | 
                    |
| 195 | 
                        +addition, CSS can also be used without Javascript to perform <ulink  | 
                    |
| 196 | 
                        +url="http://ha.ckers.org/weird/CSS-history.cgi">CSS-only history disclosure  | 
                    |
| 197 | 
                        +attacks</ulink>.  | 
                    |
| 198 | 
                        + </para>  | 
                    |
| 199 | 
                        + </listitem>  | 
                    |
| 200 | 
                        + <listitem><command>Read and insert cookies</command>  | 
                    |
| 201 | 
                        + <para>  | 
                    |
| 202 | 
                        +  | 
                    |
| 203 | 
                        +An adversary in a position to perform MITM content alteration can inject  | 
                    |
| 204 | 
                        +document content elements to both read and inject cookies for  | 
                    |
| 205 | 
                        +arbitrary domains. In fact, many "SSL secured" websites are vulnerable to this  | 
                    |
| 206 | 
                        +sort of <ulink url="http://seclists.org/bugtraq/2007/Aug/0070.html">active  | 
                    |
| 207 | 
                        +sidejacking</ulink>.  | 
                    |
| 208 | 
                        +  | 
                    |
| 209 | 
                        + </para>  | 
                    |
| 210 | 
                        + </listitem>  | 
                    |
| 211 | 
                        + <listitem><command>Create arbitrary cached content</command>  | 
                    |
| 212 | 
                        + <para>  | 
                    |
| 213 | 
                        +  | 
                    |
| 214 | 
                        +Likewise, the browser cache can also be used to <ulink  | 
                    |
| 215 | 
                        +url="http://crypto.stanford.edu/sameorigin/safecachetest.html">store unique  | 
                    |
| 216 | 
                        +identifiers</ulink>. Since by default the cache has no same-origin policy,  | 
                    |
| 217 | 
                        +these identifiers can be read by any domain, making them an ideal target for  | 
                    |
| 218 | 
                        +adserver-class adversaries.  | 
                    |
| 219 | 
                        +  | 
                    |
| 220 | 
                        + </para>  | 
                    |
| 221 | 
                        + </listitem>  | 
                    |
| 222 | 
                        + <listitem id="fingerprinting"><command>Fingerprint users based on browser  | 
                    |
| 223 | 
                        +attributes</command>  | 
                    |
| 224 | 
                        +<para>  | 
                    |
| 225 | 
                        +  | 
                    |
| 226 | 
                        +There is an absurd amount of information available to websites via attributes  | 
                    |
| 227 | 
                        +of the browser. This information can be used to reduce anonymity set, or even  | 
                    |
| 228 | 
                        +<ulink url="http://mandark.fr/0x000000/articles/Total_Recall_On_Firefox..html">uniquely  | 
                    |
| 229 | 
                        +fingerprint individual users</ulink>. </para>  | 
                    |
| 230 | 
                        +<para>  | 
                    |
| 231 | 
                        +For illustration, let's perform a  | 
                    |
| 232 | 
                        +back-of-the-envelope calculation on the number of anonymity sets for just the  | 
                    |
| 233 | 
                        +resolution information available in the <ulink  | 
                    |
| 234 | 
                        +url="http://developer.mozilla.org/en/docs/DOM:window">window</ulink> and  | 
                    |
| 235 | 
                        +<ulink  | 
                    |
| 236 | 
                        +url="http://developer.mozilla.org/en/docs/DOM:window.screen">window.screen</ulink>  | 
                    |
| 237 | 
                        +objects. Browser window resolution information provides something like  | 
                    |
| 238 | 
                        +(1280-640)*(1024-480)=348160 different anonymity sets. Desktop resolution  | 
                    |
| 239 | 
                        +information contributes about another factor of 5 (for about 5 resolutions in  | 
                    |
| 240 | 
                        +typical use). In addition, the dimensions and position of the desktop taskbar  | 
                    |
| 241 | 
                        +are available, which can reveal hints on OS information. This boosts the count  | 
                    |
| 242 | 
                        +by a factor of 5 (for each of the major desktop taskbars - Windows, OSX, KDE  | 
                    |
| 243 | 
                        +and Gnome, and None). Subtracting the browser content window  | 
                    |
| 244 | 
                        +size from the browser outer window size provide yet more information.  | 
                    |
| 245 | 
                        +Firefox toolbar presence gives about a factor of 8 (3 toolbars on/off give  | 
                    |
| 246 | 
                        +2<superscript>3</superscript>=8). Interface effects such as titlebar fontsize  | 
                    |
| 247 | 
                        +and window manager settings gives a factor of about 9 (say 3 common font sizes  | 
                    |
| 248 | 
                        +for the titlebar and 3 common sizes for browser GUI element fonts).  | 
                    |
| 249 | 
                        +Multiply this all out, and you have (1280-640)*(1024-480)*5*5*8*9 ~=  | 
                    |
| 250 | 
                        +2<superscript>29</superscript>, or a 29 bit identifier based on resolution  | 
                    |
| 251 | 
                        +information alone. </para>  | 
                    |
| 252 | 
                        +  | 
                    |
| 253 | 
                        +<para>  | 
                    |
| 254 | 
                        +  | 
                    |
| 255 | 
                        +Of course, this space is non-uniform and prone to incremental changes.  | 
                    |
| 256 | 
                        +However, if a bit vector space consisting of the above extracted attributes  | 
                    |
| 257 | 
                        +were used instead of the hash approach from <ulink  | 
                    |
| 258 | 
                        +url="http://mandark.fr/0x000000/articles/Total_Recall_On_Firefox..html">The Hacker  | 
                    |
| 259 | 
                        +Webzine article above</ulink>, minor changes in browser window resolution will  | 
                    |
| 260 | 
                        +no longer generate totally new identifiers.  | 
                    |
| 261 | 
                        +  | 
                    |
| 262 | 
                        +</para>  | 
                    |
| 263 | 
                        +<para>  | 
                    |
| 264 | 
                        +  | 
                    |
| 265 | 
                        +To add insult to injury, <ulink  | 
                    |
| 266 | 
                        +url="http://pseudo-flaw.net/content/tor/torbutton/">chrome URL disclosure  | 
                    |
| 267 | 
                        +attacks</ulink> mean that each and every extension on <ulink  | 
                    |
| 268 | 
                        +url="https://addons.mozilla.org">addons.mozilla.org</ulink> adds another bit  | 
                    |
| 269 | 
                        +to that 2<superscript>29</superscript>. With hundreds of popular extensions  | 
                    |
| 270 | 
                        +and thousands of extensions total, it is easy to see that this sort of  | 
                    |
| 271 | 
                        +information is an impressively powerful identifier if used properly by a  | 
                    |
| 272 | 
                        +competent and determined adversary such as an ad network. Again, a  | 
                    |
| 273 | 
                        +nearest-neighbor bit vector space approach here would also gracefully handle  | 
                    |
| 274 | 
                        +incremental changes to installed extensions.  | 
                    |
| 275 | 
                        +  | 
                    |
| 276 | 
                        +</para>  | 
                    |
| 277 | 
                        +  | 
                    |
| 278 | 
                        + </listitem>  | 
                    |
| 279 | 
                        + <listitem><command>Remotely or locally exploit browser and/or  | 
                    |
| 280 | 
                        +OS</command>  | 
                    |
| 281 | 
                        + <para>  | 
                    |
| 282 | 
                        +Last, but definitely not least, the adversary can exploit either general  | 
                    |
| 283 | 
                        +browser vulnerabilities, plugin vulnerabilities, or OS vulnerabilities to  | 
                    |
| 284 | 
                        +install malware and surveillance software. An adversary with physical access  | 
                    |
| 285 | 
                        +can perform similar actions. Regrettably, this last attack capability is  | 
                    |
| 286 | 
                        +outside of Torbutton's ability to defend against, but it is worth mentioning  | 
                    |
| 287 | 
                        +for completeness.  | 
                    |
| 288 | 
                        + </para>  | 
                    |
| 289 | 
                        + </listitem>  | 
                    |
| 290 | 
                        + </orderedlist>  | 
                    |
| 291 | 
                        + </sect3>  | 
                    |
| 292 | 
                        +  | 
                    |
| 293 | 
                        + </sect2>  | 
                    |
| 294 | 
                        +  | 
                    |
| 295 | 
                        + <sect2 id="requirements">  | 
                    |
| 296 | 
                        + <title>Torbutton Requirements</title>  | 
                    |
| 297 | 
                        +<note>  | 
                    |
| 298 | 
                        +  | 
                    |
| 299 | 
                        +Since many settings satisfy multiple requirements, this design document is  | 
                    |
| 300 | 
                        +organized primarily by Torbutton components and settings. However, if you are  | 
                    |
| 301 | 
                        +the type that would rather read the document from the requirements  | 
                    |
| 302 | 
                        +perspective, it is in fact possible to search for each of the following  | 
                    |
| 303 | 
                        +requirement phrases in the text to find the relevant features that help meet  | 
                    |
| 304 | 
                        +that requirement.  | 
                    |
| 305 | 
                        +  | 
                    |
| 306 | 
                        +</note>  | 
                    |
| 307 | 
                        + <para>  | 
                    |
| 308 | 
                        +  | 
                    |
| 309 | 
                        +From the above Adversary Model, a number of requirements become clear.  | 
                    |
| 310 | 
                        +  | 
                    |
| 311 | 
                        + </para>  | 
                    |
| 312 | 
                        +  | 
                    |
| 313 | 
                        +<orderedlist>  | 
                    |
| 314 | 
                        +<!-- These aren't really commands.. But it's the closest I could find in an  | 
                    |
| 315 | 
                        +acceptable style.. Don't really want to make my own stylesheet -->  | 
                    |
| 316 | 
                        + <listitem id="proxy"><command>Proxy Obedience</command>  | 
                    |
| 317 | 
                        + <para>The browser  | 
                    |
| 318 | 
                        +MUST NOT bypass Tor proxy settings for any content.</para></listitem>  | 
                    |
| 319 | 
                        + <listitem id="isolation"><command>Network Isolation</command>  | 
                    |
| 320 | 
                        + <para>Pages MUST NOT perform any network activity in a Tor state different  | 
                    |
| 321 | 
                        + from the state they were originally loaded in.</para></listitem>  | 
                    |
| 322 | 
                        + <listitem id="state"><command>State Separation</command>  | 
                    |
| 323 | 
                        + <para>Browser state (cookies, cache, history, 'DOM storage'), accumulated in  | 
                    |
| 324 | 
                        + one Tor state MUST NOT be accessible via the network in  | 
                    |
| 325 | 
                        + another Tor state.</para></listitem>  | 
                    |
| 326 | 
                        + <listitem id="undiscoverability"><command>Tor Undiscoverability</command><para>With  | 
                    |
| 327 | 
                        +the advent of bridge support in Tor 0.2.0.x, there are now a class of Tor  | 
                    |
| 328 | 
                        +users whose network fingerprint does not obviously betray the fact that they  | 
                    |
| 329 | 
                        +are using Tor. This should extend to the browser as well - Torbutton MUST NOT  | 
                    |
| 330 | 
                        +reveal its presence while Tor is disabled.</para></listitem>  | 
                    |
| 331 | 
                        + <listitem id="disk"><command>Disk Avoidance</command><para>The browser SHOULD NOT write any Tor-related state to disk, or store it  | 
                    |
| 332 | 
                        + in memory beyond the duration of one Tor toggle.</para></listitem>  | 
                    |
| 333 | 
                        + <listitem id="location"><command>Location Neutrality</command><para>The browser SHOULD NOT leak location-specific information, such as  | 
                    |
| 334 | 
                        + timezone or locale via Tor.</para></listitem>  | 
                    |
| 335 | 
                        + <listitem id="setpreservation"><command>Anonymity Set  | 
                    |
| 336 | 
                        +Preservation</command><para>The browser SHOULD NOT leak any other anonymity set reducing information  | 
                    |
| 337 | 
                        + (such as user agent, extension presence, and resolution information)  | 
                    |
| 338 | 
                        +automatically via Tor. The assessment of the attacks above should make it clear  | 
                    |
| 339 | 
                        +that anonymity set reduction is a very powerful method of tracking and  | 
                    |
| 340 | 
                        +eventually identifying anonymous users.  | 
                    |
| 341 | 
                        +</para></listitem>  | 
                    |
| 342 | 
                        + <listitem id="updates"><command>Update Safety</command><para>The browser  | 
                    |
| 343 | 
                        +SHOULD NOT perform unauthenticated updates or upgrades via Tor.</para></listitem>  | 
                    |
| 344 | 
                        + <listitem id="interoperate"><command>Interoperability</command><para>Torbutton SHOULD interoperate with third-party proxy switchers that  | 
                    |
| 345 | 
                        + enable the user to switch between a number of different proxies. It MUST  | 
                    |
| 346 | 
                        + provide full Tor protection in the event a third-party proxy switcher has  | 
                    |
| 347 | 
                        + enabled the Tor proxy settings.</para></listitem>  | 
                    |
| 348 | 
                        +</orderedlist>  | 
                    |
| 349 | 
                        + </sect2>  | 
                    |
| 350 | 
                        + <sect2 id="layout">  | 
                    |
| 351 | 
                        + <title>Extension Layout</title>  | 
                    |
| 352 | 
                        +  | 
                    |
| 353 | 
                        +<para>Firefox extensions consist of two main categories of code: 'Components' and  | 
                    |
| 354 | 
                        +'Chrome'. Components are a fancy name for classes that implement a given  | 
                    |
| 355 | 
                        +interface or interfaces. In Firefox, components <ulink  | 
                    |
| 356 | 
                        +url="https://developer.mozilla.org/en/XPCOM">can be  | 
                    |
| 357 | 
                        +written</ulink> in C++,  | 
                    |
| 358 | 
                        +Javascript, or a mixture of both. Components have two identifiers: their  | 
                    |
| 359 | 
                        +'<ulink  | 
                    |
| 360 | 
                        +url="http://www.mozilla.org/projects/xpcom/book/cxc/html/quicktour2.html#1005005">Contract  | 
                    |
| 361 | 
                        +ID</ulink>' (a human readable path-like string), and their '<ulink  | 
                    |
| 362 | 
                        +url="http://www.mozilla.org/projects/xpcom/book/cxc/html/quicktour2.html#1005329">Class  | 
                    |
| 363 | 
                        +ID</ulink>' (a GUID hex-string). In addition, the interfaces they implement each have a hex  | 
                    |
| 364 | 
                        +'Interface ID'. It is possible to 'hook' system components - to reimplement  | 
                    |
| 365 | 
                        +their interface members with your own wrappers - but only if the rest of the  | 
                    |
| 366 | 
                        +browser refers to the component by its Contract ID. If the browser refers to  | 
                    |
| 367 | 
                        +the component by Class ID, it bypasses your hooks in that use case.  | 
                    |
| 368 | 
                        +Technically, it may be possible to hook Class IDs by unregistering the  | 
                    |
| 369 | 
                        +original component, and then re-registering your own, but this relies on  | 
                    |
| 370 | 
                        +obsolete and deprecated interfaces and has proved to be less than  | 
                    |
| 371 | 
                        +stable.</para>  | 
                    |
| 372 | 
                        +  | 
                    |
| 373 | 
                        +<para>'Chrome' is a combination of XML and Javascript used to describe a window.  | 
                    |
| 374 | 
                        +Extensions are allowed to create 'overlays' that are 'bound' to existing XML  | 
                    |
| 375 | 
                        +window definitions, or they can create their own windows. The DTD for this XML  | 
                    |
| 376 | 
                        +is called <ulink  | 
                    |
| 377 | 
                        +url="http://developer.mozilla.org/en/docs/XUL_Reference">XUL</ulink>.</para>  | 
                    |
| 378 | 
                        + </sect2>  | 
                    |
| 379 | 
                        +</sect1>  | 
                    |
| 380 | 
                        +<sect1>  | 
                    |
| 381 | 
                        + <title>Components</title>  | 
                    |
| 382 | 
                        + <para>  | 
                    |
| 383 | 
                        +  | 
                    |
| 384 | 
                        +Torbutton installs components for two purposes: hooking existing components to  | 
                    |
| 385 | 
                        +reimplement their interfaces; and creating new components that provide  | 
                    |
| 386 | 
                        +services to other pieces of the extension.  | 
                    |
| 387 | 
                        +  | 
                    |
| 388 | 
                        + </para>  | 
                    |
| 389 | 
                        +  | 
                    |
| 390 | 
                        + <sect2>  | 
                    |
| 391 | 
                        + <title>Hooked Components</title>  | 
                    |
| 392 | 
                        +  | 
                    |
| 393 | 
                        +<para>Torbutton makes extensive use of Contract ID hooking, and implements some  | 
                    |
| 394 | 
                        +of its own standalone components as well. Let's discuss the hooked components  | 
                    |
| 395 | 
                        +first.</para>  | 
                    |
| 396 | 
                        +  | 
                    |
| 397 | 
                        +<sect3 id="sessionstore">  | 
                    |
| 398 | 
                        + <title><ulink  | 
                    |
| 399 | 
                        +url="http://developer.mozilla.org/en/docs/nsISessionStore">@mozilla.org/browser/sessionstore;1</ulink> -  | 
                    |
| 400 | 
                        +<ulink  | 
                    |
| 401 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/nsSessionStore36.js">components/nsSessionStore36.js</ulink></title>  | 
                    |
| 402 | 
                        +  | 
                    |
| 403 | 
                        +<para>These components address the <link linkend="disk">Disk Avoidance</link>  | 
                    |
| 404 | 
                        +requirements of Torbutton. As stated in the requirements, Torbutton needs to  | 
                    |
| 405 | 
                        +prevent Tor tabs from being written to disk by the Firefox session store for a  | 
                    |
| 406 | 
                        +number of reasons, primary among them is the fact that Firefox can crash at  | 
                    |
| 407 | 
                        +any time, and a restart can cause you to fetch tabs in the incorrect Tor  | 
                    |
| 408 | 
                        +state.</para>  | 
                    |
| 409 | 
                        +  | 
                    |
| 410 | 
                        +<para>These components illustrate a complication with Firefox hooking: you can  | 
                    |
| 411 | 
                        +only hook member functions of a class if they are published in an  | 
                    |
| 412 | 
                        +interface that the class implements. Unfortunately, the sessionstore has no  | 
                    |
| 413 | 
                        +published interface that is amenable to disabling the writing out of Tor tabs  | 
                    |
| 414 | 
                        +in specific. As such, Torbutton had to include the <emphasis>entire</emphasis>  | 
                    |
| 415 | 
                        +nsSessionStore from both Firefox 2.0, 3.0, 3.5 and 3.6  | 
                    |
| 416 | 
                        +with a couple of modifications to prevent tabs that were loaded with Tor  | 
                    |
| 417 | 
                        +enabled from being written to disk, and some version detection code to  | 
                    |
| 418 | 
                        +determine which component to load. The <ulink  | 
                    |
| 419 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/nsSessionStore36.diff">diff against the original session  | 
                    |
| 420 | 
                        +store</ulink> is included in the git repository.</para>  | 
                    |
| 421 | 
                        +</sect3>  | 
                    |
| 422 | 
                        +<sect3 id="appblocker">  | 
                    |
| 423 | 
                        + <title><ulink  | 
                    |
| 424 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/uriloader/external-protocol-service%3B1">@mozilla.org/uriloader/external-protocol-service;1  | 
                    |
| 425 | 
                        +</ulink>, <ulink  | 
                    |
| 426 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/uriloader/external-helper-app-service%3B1">@mozilla.org/uriloader/external-helper-app-service;1</ulink>,  | 
                    |
| 427 | 
                        +and <ulink url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/mime%3B1">@mozilla.org/mime;1</ulink>  | 
                    |
| 428 | 
                        +- <ulink  | 
                    |
| 429 | 
                        + url="https://git.torproject.org/checkout/torbutton/master/src/components/external-app-blocker.js">components/external-app-blocker.js</ulink></title>  | 
                    |
| 430 | 
                        + <para>  | 
                    |
| 431 | 
                        +Due to <link linkend="FirefoxBugs">Firefox Bug</link> <ulink  | 
                    |
| 432 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=440892">440892</ulink> allowing Firefox 3.x to automatically launch some  | 
                    |
| 433 | 
                        +applications without user intervention, Torbutton had to wrap the three  | 
                    |
| 434 | 
                        +components involved in launching external applications to provide user  | 
                    |
| 435 | 
                        +confirmation before doing so while Tor is enabled. Since external applications  | 
                    |
| 436 | 
                        +do not obey proxy settings, they can be manipulated to automatically connect  | 
                    |
| 437 | 
                        +back to arbitrary servers outside of Tor with no user intervention. Fixing  | 
                    |
| 438 | 
                        +this issue helps to satisfy Torbutton's <link linkend="proxy">Proxy  | 
                    |
| 439 | 
                        +Obedience</link> Requirement.  | 
                    |
| 440 | 
                        + </para>  | 
                    |
| 441 | 
                        +</sect3>  | 
                    |
| 442 | 
                        +<sect3>  | 
                    |
| 443 | 
                        +<title><ulink  | 
                    |
| 444 | 
                        +url="http://lxr.mozilla.org/seamonkey/source/browser/components/sessionstore/src/nsSessionStartup.js">@mozilla.org/browser/sessionstartup;1</ulink> -  | 
                    |
| 445 | 
                        + <ulink  | 
                    |
| 446 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js">components/crash-observer.js</ulink></title>  | 
                    |
| 447 | 
                        +  | 
                    |
| 448 | 
                        +<para>This component wraps the Firefox Session Startup component that is in  | 
                    |
| 449 | 
                        +charge of <ulink  | 
                    |
| 450 | 
                        +url="http://developer.mozilla.org/en/docs/Session_store_API">restoring saved  | 
                    |
| 451 | 
                        +sessions</ulink>. The wrapper's only job is to intercept the  | 
                    |
| 452 | 
                        +<function>doRestore()</function> function, which is called by Firefox if it is determined that the  | 
                    |
| 453 | 
                        +browser crashed and the session needs to be restored. The wrapper notifies the  | 
                    |
| 454 | 
                        +Torbutton chrome that the browser crashed by setting the pref  | 
                    |
| 455 | 
                        +<command>extensions.torbutton.crashed</command>, or that it is a normal  | 
                    |
| 456 | 
                        +startup via the pref <command>extensions.torbutton.noncrashed</command>. The Torbutton Chrome <ulink  | 
                    |
| 457 | 
                        +url="https://developer.mozilla.org/en/NsIPrefBranch2#addObserver.28.29">listens for a  | 
                    |
| 458 | 
                        +preference change</ulink> for this value and then does the appropriate cleanup. This  | 
                    |
| 459 | 
                        +includes setting the Tor state to the one the user selected for crash recovery  | 
                    |
| 460 | 
                        +in the preferences window (<command>extensions.torbutton.restore_tor</command>), and  | 
                    |
| 461 | 
                        +restoring cookies for the corresponding cookie jar, if it exists.</para>  | 
                    |
| 462 | 
                        +  | 
                    |
| 463 | 
                        +<para>By performing this notification, this component assists in the  | 
                    |
| 464 | 
                        +<link linkend="proxy">Proxy Obedience</link>, and <link  | 
                    |
| 465 | 
                        +linkend="isolation">Network Isolation</link> requirements.  | 
                    |
| 466 | 
                        +</para>  | 
                    |
| 467 | 
                        +  | 
                    |
| 468 | 
                        +  | 
                    |
| 469 | 
                        +</sect3>  | 
                    |
| 470 | 
                        +<sect3>  | 
                    |
| 471 | 
                        +<title><ulink url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/global-history;2">@mozilla.org/browser/global-history;2</ulink>  | 
                    |
| 472 | 
                        +- <ulink  | 
                    |
| 473 | 
                        + url="https://git.torproject.org/checkout/torbutton/master/src/components/ignore-history.js">components/ignore-history.js</ulink></title>  | 
                    |
| 474 | 
                        +  | 
                    |
| 475 | 
                        +<para>This component was contributed by <ulink  | 
                    |
| 476 | 
                        +url="http://www.collinjackson.com/">Collin Jackson</ulink> as a method for defeating  | 
                    |
| 477 | 
                        +CSS and Javascript-based methods of history disclosure. The global-history  | 
                    |
| 478 | 
                        +component is what is used by Firefox to determine if a link was visited or not  | 
                    |
| 479 | 
                        +(to apply the appropriate style to the link). By hooking the <ulink  | 
                    |
| 480 | 
                        +url="https://developer.mozilla.org/en/nsIGlobalHistory2#isVisited.28.29">isVisited</ulink>  | 
                    |
| 481 | 
                        +and <ulink  | 
                    |
| 482 | 
                        +url="https://developer.mozilla.org/en/nsIGlobalHistory2#addURI.28.29">addURI</ulink>  | 
                    |
| 483 | 
                        +methods, Torbutton is able to selectively prevent history items from being  | 
                    |
| 484 | 
                        +added or being displayed as visited, depending on the Tor state and the user's  | 
                    |
| 485 | 
                        +preferences.  | 
                    |
| 486 | 
                        +</para>  | 
                    |
| 487 | 
                        +<para>  | 
                    |
| 488 | 
                        +This component helps satisfy the <link linkend="state">State Separation</link>  | 
                    |
| 489 | 
                        +and <link linkend="disk">Disk Avoidance</link> requirements of Torbutton.  | 
                    |
| 490 | 
                        +</para>  | 
                    |
| 491 | 
                        +</sect3>  | 
                    |
| 492 | 
                        +<sect3 id="livemarks">  | 
                    |
| 493 | 
                        +<title><ulink  | 
                    |
| 494 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/livemark-service;2">@mozilla.org/browser/livemark-service;2</ulink>  | 
                    |
| 495 | 
                        +- <ulink  | 
                    |
| 496 | 
                        + url="https://git.torproject.org/checkout/torbutton/master/src/components/block-livemarks.js">components/block-livemarks.js</ulink></title>  | 
                    |
| 497 | 
                        +<para>  | 
                    |
| 498 | 
                        +  | 
                    |
| 499 | 
                        +The <ulink  | 
                    |
| 500 | 
                        +url="http://www.mozilla.com/en-US/firefox/livebookmarks.html">livemark</ulink> service  | 
                    |
| 501 | 
                        +is started by a timer that runs 5 seconds after Firefox  | 
                    |
| 502 | 
                        +startup. As a result, we cannot simply call the stopUpdateLivemarks() method to  | 
                    |
| 503 | 
                        +disable it. We must wrap the component to prevent this start() call from  | 
                    |
| 504 | 
                        +firing in the event the browser starts in Tor mode.  | 
                    |
| 505 | 
                        +  | 
                    |
| 506 | 
                        +</para>  | 
                    |
| 507 | 
                        +<para>  | 
                    |
| 508 | 
                        +This component helps satisfy the <link linkend="isolation">Network  | 
                    |
| 509 | 
                        +Isolation</link> and <link linkend="setpreservation">Anonymity Set  | 
                    |
| 510 | 
                        +Preservation</link> requirements.  | 
                    |
| 511 | 
                        +</para>  | 
                    |
| 512 | 
                        +</sect3>  | 
                    |
| 513 | 
                        +</sect2>  | 
                    |
| 514 | 
                        +<sect2>  | 
                    |
| 515 | 
                        +<title>New Components</title>  | 
                    |
| 516 | 
                        +  | 
                    |
| 517 | 
                        +<para>Torbutton creates four new components that are used throughout the  | 
                    |
| 518 | 
                        +extension. These components do not hook any interfaces, nor are they used  | 
                    |
| 519 | 
                        +anywhere besides Torbutton itself.</para>  | 
                    |
| 520 | 
                        +  | 
                    |
| 521 | 
                        +<sect3>  | 
                    |
| 522 | 
                        +<title><ulink  | 
                    |
| 523 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js">@torproject.org/cookie-jar-selector;2  | 
                    |
| 524 | 
                        +- components/cookie-jar-selector.js</ulink></title>  | 
                    |
| 525 | 
                        +  | 
                    |
| 526 | 
                        +<para>The cookie jar selector (also based on code from <ulink  | 
                    |
| 527 | 
                        +url="http://www.collinjackson.com/">Collin  | 
                    |
| 528 | 
                        +Jackson</ulink>) is used by the Torbutton chrome to switch between  | 
                    |
| 529 | 
                        +Tor and Non-Tor cookies. Its operations are simple: sync cookies to disk, then  | 
                    |
| 530 | 
                        +move the current cookies.txt file to the appropriate backup location  | 
                    |
| 531 | 
                        +(cookies-tor.txt or cookies-nontor.txt), and then moving the other cookie jar  | 
                    |
| 532 | 
                        +into place.</para>  | 
                    |
| 533 | 
                        +  | 
                    |
| 534 | 
                        +<para>  | 
                    |
| 535 | 
                        +This component helps to address the <link linkend="state">State  | 
                    |
| 536 | 
                        +Isolation</link> requirement of Torbutton.  | 
                    |
| 537 | 
                        +</para>  | 
                    |
| 538 | 
                        +  | 
                    |
| 539 | 
                        +</sect3>  | 
                    |
| 540 | 
                        +<sect3>  | 
                    |
| 541 | 
                        +<title><ulink  | 
                    |
| 542 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/torbutton-logger.js">@torproject.org/torbutton-logger;1  | 
                    |
| 543 | 
                        +- components/torbutton-logger.js</ulink></title>  | 
                    |
| 544 | 
                        +  | 
                    |
| 545 | 
                        +<para>The torbutton logger component allows on-the-fly redirection of torbutton  | 
                    |
| 546 | 
                        +logging messages to either Firefox stderr  | 
                    |
| 547 | 
                        +(<command>extensions.torbutton.logmethod=0</command>), the Javascript error console  | 
                    |
| 548 | 
                        +(<command>extensions.torbutton.logmethod=1</command>), or the DebugLogger extension (if  | 
                    |
| 549 | 
                        +available - <command>extensions.torbutton.logmethod=2</command>). It also allows you to  | 
                    |
| 550 | 
                        +change the loglevel on the fly by changing  | 
                    |
| 551 | 
                        +<command>extensions.torbutton.loglevel</command> (1-5, 1 is most verbose).  | 
                    |
| 552 | 
                        +</para>  | 
                    |
| 553 | 
                        +</sect3>  | 
                    |
| 554 | 
                        +<sect3 id="windowmapper">  | 
                    |
| 555 | 
                        +  | 
                    |
| 556 | 
                        +<title><ulink  | 
                    |
| 557 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/window-mapper.js">@torproject.org/content-window-mapper;1  | 
                    |
| 558 | 
                        +- components/window-mapper.js</ulink></title>  | 
                    |
| 559 | 
                        +  | 
                    |
| 560 | 
                        +<para>Torbutton tags Firefox <ulink  | 
                    |
| 561 | 
                        +url="https://developer.mozilla.org/en/XUL_Tutorial/Tabboxes">tabs</ulink> with a special variable that indicates the Tor  | 
                    |
| 562 | 
                        +state the tab was most recently used under to fetch a page. The problem is  | 
                    |
| 563 | 
                        +that for many Firefox events, it is not possible to determine the tab that is  | 
                    |
| 564 | 
                        +actually receiving the event. The Torbutton window mapper allows the Torbutton  | 
                    |
| 565 | 
                        +chrome and other components to look up a <ulink  | 
                    |
| 566 | 
                        +url="https://developer.mozilla.org/en/XUL/tabbrowser">browser  | 
                    |
| 567 | 
                        +tab</ulink> for a given <ulink  | 
                    |
| 568 | 
                        +url="https://developer.mozilla.org/en/nsIDOMWindow">HTML content  | 
                    |
| 569 | 
                        +window</ulink>. It does this by traversing all windows and all browsers, until it  | 
                    |
| 570 | 
                        +finds the browser with the requested <ulink  | 
                    |
| 571 | 
                        +url="https://developer.mozilla.org/en/XUL/tabbrowser#p-contentWindow">contentWindow</ulink> element. Since the content policy  | 
                    |
| 572 | 
                        +and page loading in general can generate hundreds of these lookups, this  | 
                    |
| 573 | 
                        +result is cached inside the component.  | 
                    |
| 574 | 
                        +</para>  | 
                    |
| 575 | 
                        +</sect3>  | 
                    |
| 576 | 
                        +<sect3 id="contentpolicy">  | 
                    |
| 577 | 
                        +<title><ulink  | 
                    |
| 578 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cssblocker.js">@torproject.org/cssblocker;1  | 
                    |
| 579 | 
                        +- components/cssblocker.js</ulink></title>  | 
                    |
| 580 | 
                        +  | 
                    |
| 581 | 
                        +<para>This is a key component to Torbutton's security measures. When Tor is  | 
                    |
| 582 | 
                        +toggled, Javascript is disabled, and pages are instructed to stop loading.  | 
                    |
| 583 | 
                        +However, CSS is still able to perform network operations by loading styles for  | 
                    |
| 584 | 
                        +onmouseover events and other operations. In addition, favicons can still be  | 
                    |
| 585 | 
                        +loaded by the browser. The cssblocker component prevents this by implementing  | 
                    |
| 586 | 
                        +and registering an <ulink  | 
                    |
| 587 | 
                        +url="https://developer.mozilla.org/en/nsIContentPolicy">nsIContentPolicy</ulink>.  | 
                    |
| 588 | 
                        +When an nsIContentPolicy is registered, Firefox checks every attempted network  | 
                    |
| 589 | 
                        +request against its <ulink  | 
                    |
| 590 | 
                        +url="https://developer.mozilla.org/en/nsIContentPolicy#shouldLoad()">shouldLoad</ulink>  | 
                    |
| 591 | 
                        +member function to determine if the load should proceed. In Torbutton's case,  | 
                    |
| 592 | 
                        +the content policy looks up the appropriate browser tab using the <link  | 
                    |
| 593 | 
                        +linkend="windowmapper">window mapper</link>,  | 
                    |
| 594 | 
                        +and checks that tab's load tag against the current Tor state. If the tab was  | 
                    |
| 595 | 
                        +loaded in a different state than the current state, the fetch is denied.  | 
                    |
| 596 | 
                        +Otherwise, it is allowed.</para> This helps to achieve the <link  | 
                    |
| 597 | 
                        +linkend="isolation">Network  | 
                    |
| 598 | 
                        +Isolation</link> requirements of Torbutton.  | 
                    |
| 599 | 
                        +  | 
                    |
| 600 | 
                        +<para>In addition, the content policy also blocks website javascript from  | 
                    |
| 601 | 
                        +<ulink url="http://pseudo-flaw.net/content/tor/torbutton/">querying for  | 
                    |
| 602 | 
                        +versions and existence of extension chrome</ulink> while Tor is enabled, and  | 
                    |
| 603 | 
                        +also masks the presence of Torbutton to website javascript while Tor is  | 
                    |
| 604 | 
                        +disabled. </para>  | 
                    |
| 605 | 
                        +  | 
                    |
| 606 | 
                        +<para>  | 
                    |
| 607 | 
                        +  | 
                    |
| 608 | 
                        +Finally, some of the work that logically belongs to the content policy is  | 
                    |
| 609 | 
                        +instead handled by the <command>torbutton_http_observer</command> and  | 
                    |
| 610 | 
                        +<command>torbutton_weblistener</command> in <ulink  | 
                    |
| 611 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js">torbutton.js</ulink>. These two objects handle blocking of  | 
                    |
| 612 | 
                        +Firefox 3 favicon loads, popups, and full page plugins, which for whatever  | 
                    |
| 613 | 
                        +reason are not passed to the Firefox content policy itself (see Firefox Bugs  | 
                    |
| 614 | 
                        +<ulink  | 
                    |
| 615 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=437014">437014</ulink> and  | 
                    |
| 616 | 
                        +<ulink  | 
                    |
| 617 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=401296">401296</ulink>).  | 
                    |
| 618 | 
                        +  | 
                    |
| 619 | 
                        +</para>  | 
                    |
| 620 | 
                        +  | 
                    |
| 621 | 
                        +<!--  | 
                    |
| 622 | 
                        +FIXME: Hrmm, the content policy doesn't really lend itself well to display  | 
                    |
| 623 | 
                        +this way.. People looking for this much detail should consult the source.  | 
                    |
| 624 | 
                        +  | 
                    |
| 625 | 
                        +<para>  | 
                    |
| 626 | 
                        + <table rowheader="firstcol" frame='all'><title>Access Permissions Table</title>  | 
                    |
| 627 | 
                        + <tgroup cols='5' align='left' colsep='1' rowsep='1'>  | 
                    |
| 628 | 
                        + <tbody>  | 
                    |
| 629 | 
                        + <row>  | 
                    |
| 630 | 
                        + <entry></entry>  | 
                    |
| 631 | 
                        + <entry>chrome/resource</entry>  | 
                    |
| 632 | 
                        + <entry>a3</entry>  | 
                    |
| 633 | 
                        + <entry>a4</entry>  | 
                    |
| 634 | 
                        + <entry>a5</entry>  | 
                    |
| 635 | 
                        + </row>  | 
                    |
| 636 | 
                        + <row>  | 
                    |
| 637 | 
                        + <entry>file</entry>  | 
                    |
| 638 | 
                        + <entry>b2</entry>  | 
                    |
| 639 | 
                        + <entry>b3</entry>  | 
                    |
| 640 | 
                        + <entry>b4</entry>  | 
                    |
| 641 | 
                        + <entry>b5</entry>  | 
                    |
| 642 | 
                        + </row>  | 
                    |
| 643 | 
                        + <row>  | 
                    |
| 644 | 
                        + <entry>c1</entry>  | 
                    |
| 645 | 
                        + <entry>c2</entry>  | 
                    |
| 646 | 
                        + <entry>c3</entry>  | 
                    |
| 647 | 
                        + <entry>c4</entry>  | 
                    |
| 648 | 
                        + <entry>c5</entry>  | 
                    |
| 649 | 
                        + </row>  | 
                    |
| 650 | 
                        + <row>  | 
                    |
| 651 | 
                        + <entry>d1</entry>  | 
                    |
| 652 | 
                        + <entry>d2</entry>  | 
                    |
| 653 | 
                        + <entry>d3</entry>  | 
                    |
| 654 | 
                        + <entry>d4</entry>  | 
                    |
| 655 | 
                        + <entry>d5</entry>  | 
                    |
| 656 | 
                        + </row>  | 
                    |
| 657 | 
                        + </tbody>  | 
                    |
| 658 | 
                        + </tgroup>  | 
                    |
| 659 | 
                        + </table>  | 
                    |
| 660 | 
                        +</para>  | 
                    |
| 661 | 
                        +-->  | 
                    |
| 662 | 
                        +  | 
                    |
| 663 | 
                        +<para>  | 
                    |
| 664 | 
                        +  | 
                    |
| 665 | 
                        +This helps to fulfill both the <link  | 
                    |
| 666 | 
                        +linkend="setpreservation">Anonymity Set Preservation</link> and the <link  | 
                    |
| 667 | 
                        +linkend="undiscoverability">Tor Undiscoverability</link> requirements of  | 
                    |
| 668 | 
                        +Torbutton.</para>  | 
                    |
| 669 | 
                        +  | 
                    |
| 670 | 
                        +</sect3>  | 
                    |
| 671 | 
                        +</sect2>  | 
                    |
| 672 | 
                        +</sect1>  | 
                    |
| 673 | 
                        +<sect1>  | 
                    |
| 674 | 
                        + <title>Chrome</title>  | 
                    |
| 675 | 
                        +  | 
                    |
| 676 | 
                        +<para>The chrome is where all the torbutton graphical elements and windows are  | 
                    |
| 677 | 
                        +located. Each window is described as an <ulink  | 
                    |
| 678 | 
                        +url="http://developer.mozilla.org/en/docs/XUL_Reference">XML file</ulink>, with zero or more Javascript  | 
                    |
| 679 | 
                        +files attached. The scope of these Javascript files is their containing  | 
                    |
| 680 | 
                        +window.</para>  | 
                    |
| 681 | 
                        +  | 
                    |
| 682 | 
                        +<sect2 id="browseroverlay">  | 
                    |
| 683 | 
                        +<title>Browser Overlay - <ulink  | 
                    |
| 684 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.xul">torbutton.xul</ulink></title>  | 
                    |
| 685 | 
                        +  | 
                    |
| 686 | 
                        +<para>The browser overlay, torbutton.xul, defines the toolbar button, the status  | 
                    |
| 687 | 
                        +bar, and events for toggling the button. The overlay code is in <ulink  | 
                    |
| 688 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js">chrome/content/torbutton.js</ulink>.  | 
                    |
| 689 | 
                        +It contains event handlers for preference update, shutdown, upgrade, and  | 
                    |
| 690 | 
                        +location change events.</para>  | 
                    |
| 691 | 
                        +  | 
                    |
| 692 | 
                        +<para>The <ulink  | 
                    |
| 693 | 
                        +url="https://developer.mozilla.org/en/nsIWebProgressListener#onLocationChange">location  | 
                    |
| 694 | 
                        +change</ulink> <ulink  | 
                    |
| 695 | 
                        +url="https://developer.mozilla.org/en/nsIWebProgress">webprogress  | 
                    |
| 696 | 
                        +listener</ulink>, <command>torbutton_weblistener</command> is one of the most  | 
                    |
| 697 | 
                        +important parts of the chrome from a security standpoint. It is a <ulink  | 
                    |
| 698 | 
                        +url="https://developer.mozilla.org/en/nsIWebProgressListener">webprogress  | 
                    |
| 699 | 
                        +listener</ulink> that handles receiving an event every time a page load or  | 
                    |
| 700 | 
                        +iframe load occurs. This class eventually calls down to  | 
                    |
| 701 | 
                        +<function>torbutton_update_tags()</function> and  | 
                    |
| 702 | 
                        +<function>torbutton_hookdoc()</function>, which apply the browser Tor load  | 
                    |
| 703 | 
                        +state tags, plugin permissions, and install the Javascript hooks to hook the  | 
                    |
| 704 | 
                        +<ulink  | 
                    |
| 705 | 
                        +url="https://developer.mozilla.org/en/DOM/window.screen">window.screen</ulink>  | 
                    |
| 706 | 
                        +object to obfuscate browser and desktop resolution information.  | 
                    |
| 707 | 
                        +  | 
                    |
| 708 | 
                        +</para>  | 
                    |
| 709 | 
                        +  | 
                    |
| 710 | 
                        +<para>  | 
                    |
| 711 | 
                        +The browser overlay helps to satisfy a number of Torbutton requirements. These  | 
                    |
| 712 | 
                        +are better enumerated in each of the Torbutton preferences below. However,  | 
                    |
| 713 | 
                        +there are also a number of Firefox preferences set in  | 
                    |
| 714 | 
                        +<function>torbutton_update_status()</function> that aren't governed by any  | 
                    |
| 715 | 
                        +Torbutton setting. These are:  | 
                    |
| 716 | 
                        +</para>  | 
                    |
| 717 | 
                        +<orderedlist>  | 
                    |
| 718 | 
                        +  | 
                    |
| 719 | 
                        +<!--  | 
                    |
| 720 | 
                        +Not set any more.  | 
                    |
| 721 | 
                        + <listitem><ulink  | 
                    |
| 722 | 
                        +url="http://kb.mozillazine.org/Browser.bookmarks.livemark_refresh_seconds">browser.bookmarks.livemark_refresh_seconds</ulink>  | 
                    |
| 723 | 
                        +<para>  | 
                    |
| 724 | 
                        +This pref is set in an attempt to disable the fetching of LiveBookmarks via  | 
                    |
| 725 | 
                        +Tor. Since users can potentially collect a large amount of live bookmarks to  | 
                    |
| 726 | 
                        +very personal sites (blogs of friends, wikipedia articles they maintain,  | 
                    |
| 727 | 
                        +comment feeds of their own blog), it is not possible to cleanly isolate these  | 
                    |
| 728 | 
                        +fetches and they are simply disabled during Tor usage.  | 
                    |
| 729 | 
                        +This helps to address the <link  | 
                    |
| 730 | 
                        +linkend="state">State Separation</link> requirement.  | 
                    |
| 731 | 
                        +Unfortunately <ulink  | 
                    |
| 732 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=436250">Firefox Bug  | 
                    |
| 733 | 
                        +436250</ulink> prevents this from  | 
                    |
| 734 | 
                        +functioning completely correctly.  | 
                    |
| 735 | 
                        +</para>  | 
                    |
| 736 | 
                        + </listitem>  | 
                    |
| 737 | 
                        +-->  | 
                    |
| 738 | 
                        +  | 
                    |
| 739 | 
                        + <listitem><ulink  | 
                    |
| 740 | 
                        +url="http://kb.mozillazine.org/Network.security.ports.banned">network.security.ports.banned</ulink>  | 
                    |
| 741 | 
                        + <para>  | 
                    |
| 742 | 
                        +Torbutton sets this setting to add ports 8123, 8118, 9050 and 9051 (which it  | 
                    |
| 743 | 
                        +reads from <command>extensions.torbutton.banned_ports</command>) to the list  | 
                    |
| 744 | 
                        +of ports Firefox is forbidden to access. These ports are Polipo, Privoxy, Tor,  | 
                    |
| 745 | 
                        +and the Tor control port, respectively. This is set for both Tor and Non-Tor  | 
                    |
| 746 | 
                        +usage, and prevents websites from attempting to do http fetches from these  | 
                    |
| 747 | 
                        +ports to see if they are open, which addresses the <link  | 
                    |
| 748 | 
                        +linkend="undiscoverability">Tor Undiscoverability</link> requirement.  | 
                    |
| 749 | 
                        + </para>  | 
                    |
| 750 | 
                        + </listitem>  | 
                    |
| 751 | 
                        + <listitem><ulink url="http://kb.mozillazine.org/Browser.send_pings">browser.send_pings</ulink>  | 
                    |
| 752 | 
                        + <para>  | 
                    |
| 753 | 
                        +This setting is currently always disabled. If anyone ever complains saying  | 
                    |
| 754 | 
                        +that they *want* their browser to be able to send ping notifications to a  | 
                    |
| 755 | 
                        +page or arbitrary link, I'll make this a pref or Tor-only. But I'm not holding  | 
                    |
| 756 | 
                        +my breath. I haven't checked if the content policy is called for pings, but if  | 
                    |
| 757 | 
                        +not, this setting helps with meeting the <link linkend="isolation">Network  | 
                    |
| 758 | 
                        +Isolation</link> requirement.  | 
                    |
| 759 | 
                        + </para>  | 
                    |
| 760 | 
                        + </listitem>  | 
                    |
| 761 | 
                        + <listitem><ulink  | 
                    |
| 762 | 
                        +url="http://kb.mozillazine.org/Browser.safebrowsing.remoteLookups">browser.safebrowsing.remoteLookups</ulink>  | 
                    |
| 763 | 
                        + <para>  | 
                    |
| 764 | 
                        +Likewise for this setting. I find it hard to imagine anyone who wants to ask  | 
                    |
| 765 | 
                        +Google in real time if each URL they visit is safe, especially when the list  | 
                    |
| 766 | 
                        +of unsafe URLs is downloaded anyway. This helps fulfill the <link  | 
                    |
| 767 | 
                        +linkend="disk">Disk Avoidance</link> requirement, by preventing your entire  | 
                    |
| 768 | 
                        +browsing history from ending up on Google's disks.  | 
                    |
| 769 | 
                        + </para>  | 
                    |
| 770 | 
                        + </listitem>  | 
                    |
| 771 | 
                        + <listitem><ulink  | 
                    |
| 772 | 
                        +url="http://kb.mozillazine.org/Browser.safebrowsing.enabled">browser.safebrowsing.enabled</ulink>  | 
                    |
| 773 | 
                        + <para>  | 
                    |
| 774 | 
                        +Safebrowsing does <ulink  | 
                    |
| 775 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=360387">unauthenticated  | 
                    |
| 776 | 
                        +updates under Firefox 2</ulink>, so it is disabled during Tor usage.  | 
                    |
| 777 | 
                        +This helps fulfill the <link linkend="updates">Update  | 
                    |
| 778 | 
                        +Safety</link> requirement. Firefox 3 has the fix for that bug, and so  | 
                    |
| 779 | 
                        +safebrowsing updates are enabled during Tor usage.  | 
                    |
| 780 | 
                        + </para>  | 
                    |
| 781 | 
                        + </listitem>  | 
                    |
| 782 | 
                        + <listitem><ulink  | 
                    |
| 783 | 
                        +url="http://kb.mozillazine.org/Network.protocol-handler.warn-external.%28protocol%29">network.protocol-handler.warn-external.(protocol)</ulink>  | 
                    |
| 784 | 
                        + <para>  | 
                    |
| 785 | 
                        +If Tor is enabled, we need to prevent random external applications from  | 
                    |
| 786 | 
                        +launching without at least warning the user. This group of settings only  | 
                    |
| 787 | 
                        +partially accomplishes this, however. Applications can still be launched via  | 
                    |
| 788 | 
                        +plugins. The mechanisms for handling this are described under the "Disable  | 
                    |
| 789 | 
                        +Plugins During Tor Usage" preference. This helps fulfill the <link  | 
                    |
| 790 | 
                        +linkend="proxy">Proxy Obedience</link> requirement, by preventing external  | 
                    |
| 791 | 
                        +applications from accessing network resources at the command of Tor-fetched  | 
                    |
| 792 | 
                        +pages. Unfortunately, due to <link linkend="FirefoxBugs">Firefox Bug</link>  | 
                    |
| 793 | 
                        +<ulink  | 
                    |
| 794 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=440892">440892</ulink>,  | 
                    |
| 795 | 
                        +these prefs are no longer obeyed. They are set still anyway out of respect for  | 
                    |
| 796 | 
                        +the dead.  | 
                    |
| 797 | 
                        + </para>  | 
                    |
| 798 | 
                        +</listitem>  | 
                    |
| 799 | 
                        + <listitem><ulink  | 
                    |
| 800 | 
                        +url="http://kb.mozillazine.org/Browser.sessionstore.max_tabs_undo">browser.sessionstore.max_tabs_undo</ulink>  | 
                    |
| 801 | 
                        + <para>  | 
                    |
| 802 | 
                        +  | 
                    |
| 803 | 
                        +To help satisfy the Torbutton <link linkend="state">State Separation</link>  | 
                    |
| 804 | 
                        +and <link linkend="isolation">Network Isolation</link> requirements,  | 
                    |
| 805 | 
                        +Torbutton needs to purge the Undo Tab history on toggle to prevent repeat  | 
                    |
| 806 | 
                        +"Undo Close" operations from accidentally restoring tabs from a different Tor  | 
                    |
| 807 | 
                        +State. This purge is accomplished by setting this preference to 0 and then  | 
                    |
| 808 | 
                        +restoring it to the previous user value upon toggle.  | 
                    |
| 809 | 
                        +  | 
                    |
| 810 | 
                        + </para>  | 
                    |
| 811 | 
                        + </listitem>  | 
                    |
| 812 | 
                        +  | 
                    |
| 813 | 
                        + <listitem><command>security.enable_ssl2</command>  | 
                    |
| 814 | 
                        + <para>  | 
                    |
| 815 | 
                        +TLS Session IDs can persist for an indefinite duration, providing an  | 
                    |
| 816 | 
                        +identifier that is sent to TLS sites that can be used to link activity. This  | 
                    |
| 817 | 
                        +is particularly troublesome now that we have certificate verification in place  | 
                    |
| 818 | 
                        +in Firefox 3: The OCSP server can use this Session ID to build a history of  | 
                    |
| 819 | 
                        +TLS sites someone visits, and also correlate their activity as users move from  | 
                    |
| 820 | 
                        +network to network (such as home to work to coffee shop, etc), inside and  | 
                    |
| 821 | 
                        +outside of Tor. To handle this and to help satisfy our <link  | 
                    |
| 822 | 
                        +linkend="state">State Separation Requirement</link>, we currently  | 
                    |
| 823 | 
                        +toggle  | 
                    |
| 824 | 
                        +<command>security.enable_ssl2</command>, which clears the SSL Session ID  | 
                    |
| 825 | 
                        +cache via the pref observer at <ulink  | 
                    |
| 826 | 
                        +url="http://mxr.mozilla.org/security/source/security/manager/ssl/src/nsNSSComponent.cpp#2134">nsNSSComponent.cpp  | 
                    |
| 827 | 
                        +line 2134</ulink>. This is an arcane and potentially fragile fix. It would be  | 
                    |
| 828 | 
                        +better if there were a more standard interface for accomplishing the same  | 
                    |
| 829 | 
                        +thing. <link linkend="FirefoxBugs">Firefox Bug</link> <ulink  | 
                    |
| 830 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=448747">448747</ulink> has  | 
                    |
| 831 | 
                        +been filed for this.  | 
                    |
| 832 | 
                        +  | 
                    |
| 833 | 
                        + </para>  | 
                    |
| 834 | 
                        + </listitem>  | 
                    |
| 835 | 
                        +  | 
                    |
| 836 | 
                        + <listitem><command><ulink url="http://www.mozilla.com/en-US/firefox/geolocation/">geo.enabled</ulink></command>  | 
                    |
| 837 | 
                        + <para>  | 
                    |
| 838 | 
                        +  | 
                    |
| 839 | 
                        +Torbutton disables Geolocation support in Firefox 3.5 and above whenever tor  | 
                    |
| 840 | 
                        +is enabled. This helps Torbutton maintain its  | 
                    |
| 841 | 
                        +<link linkend="location">Location Neutrality</link> requirement.  | 
                    |
| 842 | 
                        +While Firefox does prompt before divulging geolocational information,  | 
                    |
| 843 | 
                        +the assumption is that Tor users will never want to give their  | 
                    |
| 844 | 
                        +location away during Tor usage, and even allowing websites to prompt  | 
                    |
| 845 | 
                        +them to do so will only cause confusion and accidents to happen. Moreover,  | 
                    |
| 846 | 
                        +just because users may approve a site to know their location in non-Tor mode  | 
                    |
| 847 | 
                        +does not mean they want it divulged during Tor mode.  | 
                    |
| 848 | 
                        +  | 
                    |
| 849 | 
                        + </para>  | 
                    |
| 850 | 
                        + </listitem>  | 
                    |
| 851 | 
                        +  | 
                    |
| 852 | 
                        + <listitem><command><ulink  | 
                    |
| 853 | 
                        +url="http://kb.mozillazine.org/Browser.zoom.siteSpecific">browser.zoom.siteSpecific</ulink></command>  | 
                    |
| 854 | 
                        + <para>  | 
                    |
| 855 | 
                        +  | 
                    |
| 856 | 
                        +Firefox actually remembers your zoom settings for certain sites. CSS  | 
                    |
| 857 | 
                        +and Javascript rule can use this to recognize previous visitors to a site.  | 
                    |
| 858 | 
                        +This helps Torbutton fulfill its <link linkend="state">State Separation</link>  | 
                    |
| 859 | 
                        +requirement.  | 
                    |
| 860 | 
                        +  | 
                    |
| 861 | 
                        + </para>  | 
                    |
| 862 | 
                        + </listitem>  | 
                    |
| 863 | 
                        +  | 
                    |
| 864 | 
                        + <listitem><command><ulink  | 
                    |
| 865 | 
                        +url="https://developer.mozilla.org/en/controlling_dns_prefetching">network.dns.disablePrefetch</ulink></command>  | 
                    |
| 866 | 
                        + <para>  | 
                    |
| 867 | 
                        +  | 
                    |
| 868 | 
                        +Firefox 3.5 and above implement prefetching of DNS resolution for hostnames in  | 
                    |
| 869 | 
                        +links on a page to decrease page load latency. While Firefox does typically  | 
                    |
| 870 | 
                        +disable this behavior when proxies are enabled, we set this pref for added  | 
                    |
| 871 | 
                        +safety during Tor usage. Additionally, to prevent Tor-loaded tabs from having  | 
                    |
| 872 | 
                        +their links prefetched after a toggle to Non-Tor mode occurs,  | 
                    |
| 873 | 
                        +we also set the docShell attribute  | 
                    |
| 874 | 
                        +<ulink  | 
                    |
| 875 | 
                        +url="http://www.oxymoronical.com/experiments/apidocs/interface/nsIDocShell">  | 
                    |
| 876 | 
                        +allowDNSPrefetch</ulink> to false on Tor loaded tabs. This happens in the same  | 
                    |
| 877 | 
                        +positions in the code as those for disabling plugins via the allowPlugins  | 
                    |
| 878 | 
                        +docShell attribute. This helps Torbutton fulfill its <link  | 
                    |
| 879 | 
                        +linkend="isolation">Network Isolation</link> requirement.  | 
                    |
| 880 | 
                        +  | 
                    |
| 881 | 
                        + </para>  | 
                    |
| 882 | 
                        + </listitem>  | 
                    |
| 883 | 
                        +  | 
                    |
| 884 | 
                        + <listitem><command><ulink  | 
                    |
| 885 | 
                        +url="http://kb.mozillazine.org/Browser.cache.offline.enable">browser.cache.offline.enable</ulink></command>  | 
                    |
| 886 | 
                        + <para>  | 
                    |
| 887 | 
                        +  | 
                    |
| 888 | 
                        +Firefox has the ability to store web applications in a special cache to allow  | 
                    |
| 889 | 
                        +them to continue to operate while the user is offline. Since this subsystem  | 
                    |
| 890 | 
                        +is actually different than the normal disk cache, it must be dealt with  | 
                    |
| 891 | 
                        +separately. Thus, Torbutton sets this preference to false whenever Tor is  | 
                    |
| 892 | 
                        +enabled. This helps Torbutton fulfill its <link linkend="disk">Disk  | 
                    |
| 893 | 
                        +Avoidance</link> and <link linkend="state">State Separation</link>  | 
                    |
| 894 | 
                        +requirements.  | 
                    |
| 895 | 
                        +  | 
                    |
| 896 | 
                        + </para>  | 
                    |
| 897 | 
                        + </listitem>  | 
                    |
| 898 | 
                        +  | 
                    |
| 899 | 
                        +<!-- FIXME: We should make it possible to search for ALL modified FF prefs -->  | 
                    |
| 900 | 
                        +  | 
                    |
| 901 | 
                        +</orderedlist>  | 
                    |
| 902 | 
                        +</sect2>  | 
                    |
| 903 | 
                        +<sect2>  | 
                    |
| 904 | 
                        + <title>Preferences Window - <ulink  | 
                    |
| 905 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.xul">preferences.xul</ulink></title>  | 
                    |
| 906 | 
                        +  | 
                    |
| 907 | 
                        +<para>The preferences window of course lays out the Torbutton preferences, with  | 
                    |
| 908 | 
                        +handlers located in <ulink  | 
                    |
| 909 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.js">chrome/content/preferences.js</ulink>.</para>  | 
                    |
| 910 | 
                        +</sect2>  | 
                    |
| 911 | 
                        +<sect2>  | 
                    |
| 912 | 
                        + <title>Other Windows</title>  | 
                    |
| 913 | 
                        +  | 
                    |
| 914 | 
                        +<para>There are additional windows that describe popups for right clicking on  | 
                    |
| 915 | 
                        +the status bar, the toolbutton, and the about page.</para>  | 
                    |
| 916 | 
                        +  | 
                    |
| 917 | 
                        +</sect2>  | 
                    |
| 918 | 
                        +</sect1>  | 
                    |
| 919 | 
                        +  | 
                    |
| 920 | 
                        +<sect1>  | 
                    |
| 921 | 
                        + <title>Toggle Code Path</title>  | 
                    |
| 922 | 
                        + <para>  | 
                    |
| 923 | 
                        +  | 
                    |
| 924 | 
                        +The act of toggling is connected to <function>torbutton_toggle()</function>  | 
                    |
| 925 | 
                        +via the <ulink  | 
                    |
| 926 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.xul">torbutton.xul</ulink>  | 
                    |
| 927 | 
                        +and <ulink  | 
                    |
| 928 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/popup.xul">popup.xul</ulink>  | 
                    |
| 929 | 
                        +overlay files. Most of the work in the toggling process is present in <ulink  | 
                    |
| 930 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js">torbutton.js</ulink>  | 
                    |
| 931 | 
                        +  | 
                    |
| 932 | 
                        +</para>  | 
                    |
| 933 | 
                        +<para>  | 
                    |
| 934 | 
                        +  | 
                    |
| 935 | 
                        +Toggling is a 3 stage process: Button Click, Proxy Update, and  | 
                    |
| 936 | 
                        +Settings Update. These stages are reflected in the prefs  | 
                    |
| 937 | 
                        +<command>extensions.torbutton.tor_enabled</command>,  | 
                    |
| 938 | 
                        +<command>extensions.torbutton.proxies_applied</command>, and  | 
                    |
| 939 | 
                        +<command>extensions.torbutton.settings_applied</command>. The reason for the  | 
                    |
| 940 | 
                        +three stage preference update is to ensure immediate enforcement of <link  | 
                    |
| 941 | 
                        +linkend="isolation">Network Isolation</link> via the <link  | 
                    |
| 942 | 
                        +linkend="contentpolicy">content policy</link>. Since the content window  | 
                    |
| 943 | 
                        +javascript runs on a different thread than the chrome javascript, it is  | 
                    |
| 944 | 
                        +important to properly convey the stages to the content policy to avoid race  | 
                    |
| 945 | 
                        +conditions and leakage, especially with <ulink  | 
                    |
| 946 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=409737">Firefox Bug  | 
                    |
| 947 | 
                        +409737</ulink> unfixed. The content policy does not allow any network activity  | 
                    |
| 948 | 
                        +whatsoever during this three stage transition.  | 
                    |
| 949 | 
                        +  | 
                    |
| 950 | 
                        + </para>  | 
                    |
| 951 | 
                        + <sect2>  | 
                    |
| 952 | 
                        + <title>Button Click</title>  | 
                    |
| 953 | 
                        + <para>  | 
                    |
| 954 | 
                        +  | 
                    |
| 955 | 
                        +This is the first step in the toggling process. When the user clicks the  | 
                    |
| 956 | 
                        +toggle button or the toolbar, <function>torbutton_toggle()</function> is  | 
                    |
| 957 | 
                        +called. This function checks the current Tor status by comparing the current  | 
                    |
| 958 | 
                        +proxy settings to the selected Tor settings, and then sets the proxy settings  | 
                    |
| 959 | 
                        +to the opposite state, and sets the pref  | 
                    |
| 960 | 
                        +<command>extensions.torbutton.tor_enabled</command> to reflect the new state.  | 
                    |
| 961 | 
                        +It is this proxy pref update that gives notification via the <ulink  | 
                    |
| 962 | 
                        +url="https://developer.mozilla.org/en/NsIPrefBranch2#addObserver.28.29">pref  | 
                    |
| 963 | 
                        +observer</ulink>  | 
                    |
| 964 | 
                        +<command>torbutton_unique_pref_observer</command> to perform the rest of the  | 
                    |
| 965 | 
                        +toggle.  | 
                    |
| 966 | 
                        +  | 
                    |
| 967 | 
                        + </para>  | 
                    |
| 968 | 
                        + </sect2>  | 
                    |
| 969 | 
                        + <sect2>  | 
                    |
| 970 | 
                        + <title>Proxy Update</title>  | 
                    |
| 971 | 
                        + <para>  | 
                    |
| 972 | 
                        +  | 
                    |
| 973 | 
                        +When Torbutton receives any proxy change notifications via its  | 
                    |
| 974 | 
                        +<command>torbutton_unique_pref_observer</command>, it calls  | 
                    |
| 975 | 
                        +<function>torbutton_set_status()</function> which checks against the Tor  | 
                    |
| 976 | 
                        +settings to see if the Tor proxy settings match the current settings. If so,  | 
                    |
| 977 | 
                        +it calls <function>torbutton_update_status()</function>, which determines if  | 
                    |
| 978 | 
                        +the Tor state has actually changed, and sets  | 
                    |
| 979 | 
                        +<command>extensions.torbutton.proxies_applied</command> to the appropriate Tor  | 
                    |
| 980 | 
                        +state value, and ensures that  | 
                    |
| 981 | 
                        +<command>extensions.torbutton.tor_enabled</command> is also set to the correct  | 
                    |
| 982 | 
                        +value. This is decoupled from the button click functionalty via the pref  | 
                    |
| 983 | 
                        +observer so that other addons (such as SwitchProxy) can switch the proxy  | 
                    |
| 984 | 
                        +settings between multiple proxies.  | 
                    |
| 985 | 
                        +  | 
                    |
| 986 | 
                        + </para>  | 
                    |
| 987 | 
                        + </sect2>  | 
                    |
| 988 | 
                        + <sect2>  | 
                    |
| 989 | 
                        + <title>Settings Update</title>  | 
                    |
| 990 | 
                        + <para>  | 
                    |
| 991 | 
                        +  | 
                    |
| 992 | 
                        +The next stage is also handled by  | 
                    |
| 993 | 
                        +<function>torbutton_update_status()</function>. This function sets scores of  | 
                    |
| 994 | 
                        +Firefox preferences, saving the original values to prefs under  | 
                    |
| 995 | 
                        +<command>extensions.torbutton.saved.*</command>, and performs the history  | 
                    |
| 996 | 
                        +clearing, cookie jaring, and ssl certificate jaring work of Torbutton. At the  | 
                    |
| 997 | 
                        +end of its work, it sets  | 
                    |
| 998 | 
                        +<command>extensions.torbutton.settings_applied</command>, which signifies the  | 
                    |
| 999 | 
                        +completion of the toggle operation to the <link  | 
                    |
| 1000 | 
                        +linkend="contentpolicy">content policy</link>.  | 
                    |
| 1001 | 
                        +  | 
                    |
| 1002 | 
                        + </para>  | 
                    |
| 1003 | 
                        + </sect2>  | 
                    |
| 1004 | 
                        +</sect1>  | 
                    |
| 1005 | 
                        +  | 
                    |
| 1006 | 
                        +<sect1>  | 
                    |
| 1007 | 
                        + <title>Description of Options</title>  | 
                    |
| 1008 | 
                        +<!-- FIXME: Review+update these during FF3.5 audit -->  | 
                    |
| 1009 | 
                        +<para>This section provides a detailed description of Torbutton's options. Each  | 
                    |
| 1010 | 
                        +option is presented as the string from the preferences window, a summary, the  | 
                    |
| 1011 | 
                        +preferences it touches, and the effect this has on the components, chrome, and  | 
                    |
| 1012 | 
                        +browser properties.</para>  | 
                    |
| 1013 | 
                        + <sect2>  | 
                    |
| 1014 | 
                        + <title>Test Settings</title>  | 
                    |
| 1015 | 
                        + <para>  | 
                    |
| 1016 | 
                        +This button under the Proxy Settings tab provides a way to verify that the  | 
                    |
| 1017 | 
                        +proxy settings are correct, and actually do route through the Tor network. It  | 
                    |
| 1018 | 
                        +performs this check by issuing an <ulink  | 
                    |
| 1019 | 
                        +url="http://developer.mozilla.org/en/docs/XMLHttpRequest">XMLHTTPRequest</ulink>  | 
                    |
| 1020 | 
                        +for <ulink  | 
                    |
| 1021 | 
                        +url="https://check.torproject.org/?TorButton=True">https://check.torproject.org/?Torbutton=True</ulink>.  | 
                    |
| 1022 | 
                        +This is a special page that returns very simple, yet well-formed XHTML that  | 
                    |
| 1023 | 
                        +Torbutton can easily inspect for a hidden link with an id of  | 
                    |
| 1024 | 
                        +<command>TorCheckResult</command> and a target of <command>success</command>  | 
                    |
| 1025 | 
                        +or <command>failure</command> to indicate if the  | 
                    |
| 1026 | 
                        +user hit the page from a Tor IP, a non-Tor IP. This check is handled in  | 
                    |
| 1027 | 
                        +<function>torbutton_test_settings()</function> in <ulink  | 
                    |
| 1028 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js">torbutton.js</ulink>.  | 
                    |
| 1029 | 
                        +Presenting the results to the user is handled by the <ulink  | 
                    |
| 1030 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.xul">preferences  | 
                    |
| 1031 | 
                        +window</ulink>  | 
                    |
| 1032 | 
                        +callback <function>torbutton_prefs_test_settings()</function> in <ulink  | 
                    |
| 1033 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.js">preferences.js</ulink>.  | 
                    |
| 1034 | 
                        +  | 
                    |
| 1035 | 
                        + </para>  | 
                    |
| 1036 | 
                        + </sect2>  | 
                    |
| 1037 | 
                        + <sect2 id="plugins">  | 
                    |
| 1038 | 
                        + <title>Disable plugins on Tor Usage (crucial)</title>  | 
                    |
| 1039 | 
                        + <para>Option: <command>extensions.torbutton.no_tor_plugins</command></para>  | 
                    |
| 1040 | 
                        +  | 
                    |
| 1041 | 
                        + <para>Java and plugins <ulink  | 
                    |
| 1042 | 
                        +url="http://java.sun.com/j2se/1.5.0/docs/api/java/net/class-use/NetworkInterface.html">can query</ulink> the <ulink  | 
                    |
| 1043 | 
                        +url="http://www.rgagnon.com/javadetails/java-0095.html">local IP  | 
                    |
| 1044 | 
                        +address</ulink> and report it back to the  | 
                    |
| 1045 | 
                        +remote site. They can also <ulink  | 
                    |
| 1046 | 
                        +url="http://decloak.net">bypass proxy settings</ulink> and directly connect to a  | 
                    |
| 1047 | 
                        +remote site without Tor. Every browser plugin we have tested with Firefox has  | 
                    |
| 1048 | 
                        +some form of network capability, and every one ignores proxy settings or worse - only  | 
                    |
| 1049 | 
                        +partially obeys them. This includes but is not limited to:  | 
                    |
| 1050 | 
                        +QuickTime, Windows Media Player, RealPlayer, mplayerplug-in, AcroRead, and  | 
                    |
| 1051 | 
                        +Flash.  | 
                    |
| 1052 | 
                        +  | 
                    |
| 1053 | 
                        + </para>  | 
                    |
| 1054 | 
                        + <para>  | 
                    |
| 1055 | 
                        +Enabling this preference causes the above mentioned Torbutton chrome web progress  | 
                    |
| 1056 | 
                        + listener <command>torbutton_weblistener</command> to disable Java via <command>security.enable_java</command> and to disable  | 
                    |
| 1057 | 
                        + plugins via the browser <ulink  | 
                    |
| 1058 | 
                        + url="https://developer.mozilla.org/en/XUL%3aProperty%3adocShell">docShell</ulink>  | 
                    |
| 1059 | 
                        + attribute <command>allowPlugins</command>. These flags are set every time a new window is  | 
                    |
| 1060 | 
                        + created (<function>torbutton_tag_new_browser()</function>), every time a web  | 
                    |
| 1061 | 
                        +load  | 
                    |
| 1062 | 
                        +event occurs  | 
                    |
| 1063 | 
                        + (<function>torbutton_update_tags()</function>), and every time the tor state is changed  | 
                    |
| 1064 | 
                        + (<function>torbutton_update_status()</function>). As a backup measure, plugins are also  | 
                    |
| 1065 | 
                        + prevented from loading by the content policy in <ulink  | 
                    |
| 1066 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cssblocker.js">@torproject.org/cssblocker;1</ulink> if Tor is  | 
                    |
| 1067 | 
                        + enabled and this option is set.  | 
                    |
| 1068 | 
                        + </para>  | 
                    |
| 1069 | 
                        +  | 
                    |
| 1070 | 
                        + <para>All of this turns out to be insufficient if the user directly clicks  | 
                    |
| 1071 | 
                        +on a plugin-handled mime-type. <ulink  | 
                    |
| 1072 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=401296">In this case</ulink>,  | 
                    |
| 1073 | 
                        +the browser decides that maybe it should ignore all these other settings and  | 
                    |
| 1074 | 
                        +load the plugin anyways, because maybe the user really did want to load it  | 
                    |
| 1075 | 
                        +(never mind this same load-style could happen automatically with meta-refresh  | 
                    |
| 1076 | 
                        +or any number of other ways..). To handle these cases, Torbutton stores a list  | 
                    |
| 1077 | 
                        +of plugin-handled mime-types, and sets the pref  | 
                    |
| 1078 | 
                        +<command>plugin.disable_full_page_plugin_for_types</command> to this list.  | 
                    |
| 1079 | 
                        +Additionally, (since nothing can be assumed when relying on Firefox  | 
                    |
| 1080 | 
                        +preferences and internals) if it detects a load of one of them from the web  | 
                    |
| 1081 | 
                        +progress listener, it cancels the request, tells the associated DOMWindow to  | 
                    |
| 1082 | 
                        +stop loading, clears the document, AND throws an exception. Anything short of  | 
                    |
| 1083 | 
                        +all this and the plugin managed to find some way to load.  | 
                    |
| 1084 | 
                        + </para>  | 
                    |
| 1085 | 
                        +  | 
                    |
| 1086 | 
                        +<!--  | 
                    |
| 1087 | 
                        +  | 
                    |
| 1088 | 
                        +FIXME: Hrmm, technically this behavior is not covered by this pref.  | 
                    |
| 1089 | 
                        +  | 
                    |
| 1090 | 
                        + <para>  | 
                    |
| 1091 | 
                        +Furthermore, with version 3.0 and above, Firefox  | 
                    |
| 1092 | 
                        +<ulink  | 
                    |
| 1093 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=440892">began ignoring</ulink>  | 
                    |
| 1094 | 
                        +  | 
                    |
| 1095 | 
                        +<ulink  | 
                    |
| 1096 | 
                        +url="http://kb.mozillazine.org/Network.protocol-handler.warn-external.%28protocol%29">network.protocol-handler.warn-external.(protocol)</ulink>  | 
                    |
| 1097 | 
                        +prefs, which caused us to have to <link linkend="appblocker">wrap the external  | 
                    |
| 1098 | 
                        +app launcher components</link> to prevent external apps from being loaded to  | 
                    |
| 1099 | 
                        +bypass proxy settings.  | 
                    |
| 1100 | 
                        + </para>  | 
                    |
| 1101 | 
                        +-->  | 
                    |
| 1102 | 
                        +  | 
                    |
| 1103 | 
                        + <para>  | 
                    |
| 1104 | 
                        + All this could be avoided, of course, if Firefox would either <ulink  | 
                    |
| 1105 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=401296">obey  | 
                    |
| 1106 | 
                        + allowPlugins</ulink> for directly visited URLs, or notify its content policy for such  | 
                    |
| 1107 | 
                        + loads either <ulink  | 
                    |
| 1108 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=309524">via</ulink> <ulink  | 
                    |
| 1109 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=380556">shouldProcess</ulink> or shouldLoad. The fact that it does not is  | 
                    |
| 1110 | 
                        + not very encouraging.  | 
                    |
| 1111 | 
                        + </para>  | 
                    |
| 1112 | 
                        +  | 
                    |
| 1113 | 
                        +  | 
                    |
| 1114 | 
                        + <para>  | 
                    |
| 1115 | 
                        +  | 
                    |
| 1116 | 
                        +Since most plugins completely ignore browser proxy settings, the actions  | 
                    |
| 1117 | 
                        +performed by this setting are crucial to satisfying the <link  | 
                    |
| 1118 | 
                        +linkend="proxy">Proxy Obedience</link> requirement.  | 
                    |
| 1119 | 
                        +  | 
                    |
| 1120 | 
                        + </para>  | 
                    |
| 1121 | 
                        +</sect2>  | 
                    |
| 1122 | 
                        +<sect2>  | 
                    |
| 1123 | 
                        + <title>Isolate Dynamic Content to Tor State (crucial)</title>  | 
                    |
| 1124 | 
                        +  | 
                    |
| 1125 | 
                        + <para>Option: <command>extensions.torbutton.isolate_content</command></para>  | 
                    |
| 1126 | 
                        +  | 
                    |
| 1127 | 
                        +<para>Enabling this preference is what enables the <ulink  | 
                    |
| 1128 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cssblocker.js">@torproject.org/cssblocker;1</ulink> content policy  | 
                    |
| 1129 | 
                        +mentioned above, and causes it to block content load attempts in pages an  | 
                    |
| 1130 | 
                        +opposite Tor state from the current state. Freshly loaded <ulink  | 
                    |
| 1131 | 
                        +url="https://developer.mozilla.org/en/XUL/tabbrowser">browser  | 
                    |
| 1132 | 
                        +tabs</ulink> are tagged  | 
                    |
| 1133 | 
                        +with a <command>__tb_load_state</command> member in  | 
                    |
| 1134 | 
                        +<function>torbutton_update_tags()</function> and this  | 
                    |
| 1135 | 
                        +value is compared against the current tor state in the content policy.</para>  | 
                    |
| 1136 | 
                        +  | 
                    |
| 1137 | 
                        +<para>It also kills all Javascript in each page loaded under that state by  | 
                    |
| 1138 | 
                        +toggling the <command>allowJavascript</command> <ulink  | 
                    |
| 1139 | 
                        +url="https://developer.mozilla.org/en/XUL%3aProperty%3adocShell">docShell</ulink> property, and issues a  | 
                    |
| 1140 | 
                        +<ulink  | 
                    |
| 1141 | 
                        +url="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWebNavigation#stop()">webNavigation.stop(webNavigation.STOP_ALL)</ulink> to each browser tab (the  | 
                    |
| 1142 | 
                        +equivalent of hitting the STOP button).</para>  | 
                    |
| 1143 | 
                        +  | 
                    |
| 1144 | 
                        +<para>  | 
                    |
| 1145 | 
                        +  | 
                    |
| 1146 | 
                        +Unfortunately, <ulink  | 
                    |
| 1147 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=409737">Firefox bug  | 
                    |
| 1148 | 
                        +409737</ulink> prevents <command>docShell.allowJavascript</command> from killing  | 
                    |
| 1149 | 
                        +all event handlers, and event handlers registered with <ulink  | 
                    |
| 1150 | 
                        +url="http://developer.mozilla.org/en/docs/DOM:element.addEventListener">addEventListener()</ulink>  | 
                    |
| 1151 | 
                        +are still able to execute. The <link linkend="contentpolicy">Torbutton Content  | 
                    |
| 1152 | 
                        +Policy</link> should prevent such code from performing network activity within  | 
                    |
| 1153 | 
                        +the current tab, but activity that happens via a popup window or via a  | 
                    |
| 1154 | 
                        +Javascript redirect can still slip by. For this reason, Torbutton blocks  | 
                    |
| 1155 | 
                        +popups by checking for a valid <ulink  | 
                    |
| 1156 | 
                        +url="http://developer.mozilla.org/en/docs/DOM:window.opener">window.opener</ulink>  | 
                    |
| 1157 | 
                        +attribute in <function>torbutton_check_progress()</function>. If the window  | 
                    |
| 1158 | 
                        +has an opener from a different Tor state, its load is blocked. The content  | 
                    |
| 1159 | 
                        +policy also takes similar action to prevent Javascript redirects. This also  | 
                    |
| 1160 | 
                        +has the side effect/feature of preventing the user from following any links  | 
                    |
| 1161 | 
                        +from a page loaded in an opposite Tor state.  | 
                    |
| 1162 | 
                        +  | 
                    |
| 1163 | 
                        +</para>  | 
                    |
| 1164 | 
                        +  | 
                    |
| 1165 | 
                        +<para>  | 
                    |
| 1166 | 
                        +This setting is responsible for satisfying the <link  | 
                    |
| 1167 | 
                        +linkend="isolation">Network Isolation</link> requirement.  | 
                    |
| 1168 | 
                        +</para>  | 
                    |
| 1169 | 
                        +  | 
                    |
| 1170 | 
                        +</sect2>  | 
                    |
| 1171 | 
                        +<sect2 id="jshooks">  | 
                    |
| 1172 | 
                        +  | 
                    |
| 1173 | 
                        +<title>Hook Dangerous Javascript</title>  | 
                    |
| 1174 | 
                        +  | 
                    |
| 1175 | 
                        + <para>Option: <command>extensions.torbutton.kill_bad_js</command></para>  | 
                    |
| 1176 | 
                        +  | 
                    |
| 1177 | 
                        +<para>This setting enables injection of the <ulink  | 
                    |
| 1178 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/jshooks.js">Javascript  | 
                    |
| 1179 | 
                        +hooking code</ulink>. This is done in the chrome in  | 
                    |
| 1180 | 
                        +<function>torbutton_hookdoc()</function>, which is called ultimately by both the  | 
                    |
| 1181 | 
                        +<ulink  | 
                    |
| 1182 | 
                        +url="https://developer.mozilla.org/en/nsIWebProgressListener">webprogress  | 
                    |
| 1183 | 
                        +listener</ulink> <command>torbutton_weblistener</command> and the <link  | 
                    |
| 1184 | 
                        +linkend="contentpolicy">content policy</link> (the latter being a hack to handle  | 
                    |
| 1185 | 
                        +javascript: urls).  | 
                    |
| 1186 | 
                        +  | 
                    |
| 1187 | 
                        +In the Firefox 2 days, this option did a lot more than  | 
                    |
| 1188 | 
                        +it does now. It used to be responsible for timezone and improved useragent  | 
                    |
| 1189 | 
                        +spoofing, and history object cloaking. However, now it only provides  | 
                    |
| 1190 | 
                        +obfuscation of the <ulink  | 
                    |
| 1191 | 
                        +url="https://developer.mozilla.org/en/DOM/window.screen">window.screen</ulink>  | 
                    |
| 1192 | 
                        +object to mask your browser and desktop resolution.  | 
                    |
| 1193 | 
                        +The resolution hooks  | 
                    |
| 1194 | 
                        +effectively make the Firefox browser window appear to websites as if the renderable area  | 
                    |
| 1195 | 
                        +takes up the entire desktop, has no toolbar or other GUI element space, and  | 
                    |
| 1196 | 
                        +the desktop itself has no toolbars.  | 
                    |
| 1197 | 
                        +These hooks drastically reduce the amount of information available to do <link  | 
                    |
| 1198 | 
                        +linkend="fingerprinting">anonymity set reduction attacks</link> and help to  | 
                    |
| 1199 | 
                        +meet the <link linkend="setpreservation">Anonymity Set Preservation</link>  | 
                    |
| 1200 | 
                        +requirements. Unfortunately, Gregory Fleischer discovered it is still possible  | 
                    |
| 1201 | 
                        +to retrieve the original screen values by using <ulink  | 
                    |
| 1202 | 
                        +url="http://pseudo-flaw.net/tor/torbutton/unmask-sandbox-xpcnativewrapper.html">XPCNativeWrapper</ulink>  | 
                    |
| 1203 | 
                        +or <ulink  | 
                    |
| 1204 | 
                        +url="http://pseudo-flaw.net/tor/torbutton/unmask-components-lookupmethod.html">Components.lookupMethod</ulink>.  | 
                    |
| 1205 | 
                        +We are still looking for a workaround as of Torbutton 1.2.4.  | 
                    |
| 1206 | 
                        +  | 
                    |
| 1207 | 
                        +<!-- FIXME: Don't forget to update this -->  | 
                    |
| 1208 | 
                        +  | 
                    |
| 1209 | 
                        +</para>  | 
                    |
| 1210 | 
                        +</sect2>  | 
                    |
| 1211 | 
                        +<sect2>  | 
                    |
| 1212 | 
                        +<title>Resize windows to multiples of 50px during Tor usage (recommended)</title>  | 
                    |
| 1213 | 
                        +  | 
                    |
| 1214 | 
                        + <para>Option: <command>extensions.torbutton.resize_windows</command></para>  | 
                    |
| 1215 | 
                        +  | 
                    |
| 1216 | 
                        +<para>  | 
                    |
| 1217 | 
                        +  | 
                    |
| 1218 | 
                        +This option drastically cuts down on the number of distinct anonymity sets  | 
                    |
| 1219 | 
                        +that divide the Tor web userbase. Without this setting, the dimensions for a  | 
                    |
| 1220 | 
                        +typical browser window range from 600-1200 horizontal pixels and 400-1000  | 
                    |
| 1221 | 
                        +vertical pixels, or about 600x600 = 360000 different sets. Resizing the  | 
                    |
| 1222 | 
                        +browser window to multiples of 50 on each side reduces the number of sets by  | 
                    |
| 1223 | 
                        +50^2, bringing the total number of sets to 144. Of course, the distribution  | 
                    |
| 1224 | 
                        +among these sets are not uniform, but scaling by 50 will improve the situation  | 
                    |
| 1225 | 
                        +due to this non-uniformity for users in the less common resolutions.  | 
                    |
| 1226 | 
                        +Obviously the ideal situation would be to lie entirely about the browser  | 
                    |
| 1227 | 
                        +window size, but this will likely cause all sorts of rendering issues, and is  | 
                    |
| 1228 | 
                        +also not implementable in a foolproof way from extension land.  | 
                    |
| 1229 | 
                        +  | 
                    |
| 1230 | 
                        +</para>  | 
                    |
| 1231 | 
                        +<para>  | 
                    |
| 1232 | 
                        +  | 
                    |
| 1233 | 
                        +The implementation of this setting is spread across a couple of different  | 
                    |
| 1234 | 
                        +locations in the Torbutton javascript <link linkend="browseroverlay">browser  | 
                    |
| 1235 | 
                        +overlay</link>. Since resizing minimized windows causes them to be restored,  | 
                    |
| 1236 | 
                        +and since maximized windows remember their previous size to the pixel, windows  | 
                    |
| 1237 | 
                        +must be resized before every document load (at the time of browser tagging)  | 
                    |
| 1238 | 
                        +via <function>torbutton_check_round()</function>, called by  | 
                    |
| 1239 | 
                        +<function>torbutton_update_tags()</function>. To prevent drift, the extension  | 
                    |
| 1240 | 
                        +tracks the original values of the windows and uses this to perform the  | 
                    |
| 1241 | 
                        +rounding on document load. In addition, to prevent the user from resizing a  | 
                    |
| 1242 | 
                        +window to a non-50px multiple, a resize listener  | 
                    |
| 1243 | 
                        +(<function>torbutton_do_resize()</function>) is installed on every new browser  | 
                    |
| 1244 | 
                        +window to record the new size and round it to a 50px multiple while Tor is  | 
                    |
| 1245 | 
                        +enabled. In all cases, the browser's contentWindow.innerWidth and innerHeight  | 
                    |
| 1246 | 
                        +are set. This ensures that there is no discrepancy between the 50 pixel cutoff  | 
                    |
| 1247 | 
                        +and the actual renderable area of the browser (so that it is not possible to  | 
                    |
| 1248 | 
                        +infer toolbar size/presence by the distance to the nearest 50 pixel roundoff).  | 
                    |
| 1249 | 
                        +  | 
                    |
| 1250 | 
                        +</para>  | 
                    |
| 1251 | 
                        +<para>  | 
                    |
| 1252 | 
                        +This setting helps to meet the <link  | 
                    |
| 1253 | 
                        +linkend="setpreservation">Anonymity Set Preservation</link> requirements.  | 
                    |
| 1254 | 
                        +</para>  | 
                    |
| 1255 | 
                        +</sect2>  | 
                    |
| 1256 | 
                        +<sect2>  | 
                    |
| 1257 | 
                        +<title>Disable Updates During Tor</title>  | 
                    |
| 1258 | 
                        +  | 
                    |
| 1259 | 
                        + <para>Option: <command>extensions.torbutton.no_updates</command></para>  | 
                    |
| 1260 | 
                        +  | 
                    |
| 1261 | 
                        + <para>This setting causes Torbutton to disable the four <ulink  | 
                    |
| 1262 | 
                        +url="http://wiki.mozilla.org/Update:Users/Checking_For_Updates#Preference_Controls_and_State">Firefox  | 
                    |
| 1263 | 
                        +update settings</ulink> during Tor  | 
                    |
| 1264 | 
                        + usage: <command>extensions.update.enabled</command>,  | 
                    |
| 1265 | 
                        +<command>app.update.enabled</command>,  | 
                    |
| 1266 | 
                        + <command>app.update.auto</command>, and  | 
                    |
| 1267 | 
                        +<command>browser.search.update</command>. These prevent the  | 
                    |
| 1268 | 
                        + browser from updating extensions, checking for Firefox upgrades, and  | 
                    |
| 1269 | 
                        + checking for search plugin updates while Tor is enabled.  | 
                    |
| 1270 | 
                        + </para>  | 
                    |
| 1271 | 
                        +<para>  | 
                    |
| 1272 | 
                        +This setting satisfies the <link  | 
                    |
| 1273 | 
                        +linkend="updates">Update Safety</link> requirement.  | 
                    |
| 1274 | 
                        +</para>  | 
                    |
| 1275 | 
                        +</sect2>  | 
                    |
| 1276 | 
                        +<sect2>  | 
                    |
| 1277 | 
                        +  | 
                    |
| 1278 | 
                        +<title>Disable Search Suggestions during Tor (recommended)</title>  | 
                    |
| 1279 | 
                        +  | 
                    |
| 1280 | 
                        + <para>Option: <command>extensions.torbutton.no_search</command></para>  | 
                    |
| 1281 | 
                        +  | 
                    |
| 1282 | 
                        +<para>  | 
                    |
| 1283 | 
                        +This setting causes Torbutton to disable <ulink  | 
                    |
| 1284 | 
                        +url="http://kb.mozillazine.org/Browser.search.suggest.enabled"><command>browser.search.suggest.enabled</command></ulink>  | 
                    |
| 1285 | 
                        +during Tor usage.  | 
                    |
| 1286 | 
                        +This governs if you get Google search suggestions during Tor  | 
                    |
| 1287 | 
                        +usage. Your Google cookie is transmitted with google search suggestions, hence  | 
                    |
| 1288 | 
                        +this is recommended to be disabled.  | 
                    |
| 1289 | 
                        +  | 
                    |
| 1290 | 
                        +</para>  | 
                    |
| 1291 | 
                        +<para>  | 
                    |
| 1292 | 
                        +While this setting doesn't satisfy any Torbutton requirements, the fact that  | 
                    |
| 1293 | 
                        +cookies are transmitted for partially typed queries does not seem desirable  | 
                    |
| 1294 | 
                        +for Tor usage.  | 
                    |
| 1295 | 
                        +</para>  | 
                    |
| 1296 | 
                        +</sect2>  | 
                    |
| 1297 | 
                        +<sect2>  | 
                    |
| 1298 | 
                        +<title>Disable livemarks updates during Tor usage (recommended)</title>  | 
                    |
| 1299 | 
                        + <para>Option:  | 
                    |
| 1300 | 
                        + <simplelist>  | 
                    |
| 1301 | 
                        + <member><command>extensions.torbutton.disable_livemarks</command></member>  | 
                    |
| 1302 | 
                        + </simplelist>  | 
                    |
| 1303 | 
                        + </para>  | 
                    |
| 1304 | 
                        +  | 
                    |
| 1305 | 
                        +<para>  | 
                    |
| 1306 | 
                        +This option causes Torbutton to prevent Firefox from loading <ulink  | 
                    |
| 1307 | 
                        +url="http://www.mozilla.com/firefox/livebookmarks.html">Livemarks</ulink> during  | 
                    |
| 1308 | 
                        +Tor usage. Because people often have very personalized Livemarks (such as RSS  | 
                    |
| 1309 | 
                        +feeds of Wikipedia articles they maintain, etc). This is accomplished both by  | 
                    |
| 1310 | 
                        +<link linkend="livemarks">wrapping the livemark-service component</link> and  | 
                    |
| 1311 | 
                        +by calling stopUpdateLivemarks() on the <ulink  | 
                    |
| 1312 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/livemark-service;2">Livemark  | 
                    |
| 1313 | 
                        +service</ulink> when Tor is enabled.  | 
                    |
| 1314 | 
                        +  | 
                    |
| 1315 | 
                        +</para>  | 
                    |
| 1316 | 
                        +  | 
                    |
| 1317 | 
                        +<para>  | 
                    |
| 1318 | 
                        +This helps satisfy the <link linkend="isolation">Network  | 
                    |
| 1319 | 
                        +Isolation</link> and <link linkend="setpreservation">Anonymity Set  | 
                    |
| 1320 | 
                        +Preservation</link> requirements.  | 
                    |
| 1321 | 
                        +</para>  | 
                    |
| 1322 | 
                        +  | 
                    |
| 1323 | 
                        +</sect2>  | 
                    |
| 1324 | 
                        +<sect2>  | 
                    |
| 1325 | 
                        +<title>Block Tor/Non-Tor access to network from file:// urls (recommended)</title>  | 
                    |
| 1326 | 
                        + <para>Options:  | 
                    |
| 1327 | 
                        + <simplelist>  | 
                    |
| 1328 | 
                        + <member><command>extensions.torbutton.block_tor_file_net</command></member>  | 
                    |
| 1329 | 
                        + <member><command>extensions.torbutton.block_nontor_file_net</command></member>  | 
                    |
| 1330 | 
                        + </simplelist>  | 
                    |
| 1331 | 
                        + </para>  | 
                    |
| 1332 | 
                        +  | 
                    |
| 1333 | 
                        +<para>  | 
                    |
| 1334 | 
                        +  | 
                    |
| 1335 | 
                        +These settings prevent file urls from performing network operations during the  | 
                    |
| 1336 | 
                        +respective Tor states. Firefox 2's implementation of same origin policy allows  | 
                    |
| 1337 | 
                        +file urls to read and <ulink  | 
                    |
| 1338 | 
                        +url="http://www.gnucitizen.org/blog/content-disposition-hacking/">submit  | 
                    |
| 1339 | 
                        +arbitrary files from the local filesystem</ulink> to arbitrary websites. To  | 
                    |
| 1340 | 
                        +make matters worse, the 'Content-Disposition' header can be injected  | 
                    |
| 1341 | 
                        +arbitrarily by exit nodes to trick users into running arbitrary html files in  | 
                    |
| 1342 | 
                        +the local context. These preferences cause the <link  | 
                    |
| 1343 | 
                        +linkend="contentpolicy">content policy</link> to block access to any network  | 
                    |
| 1344 | 
                        +resources from File urls during the appropriate Tor state.  | 
                    |
| 1345 | 
                        +  | 
                    |
| 1346 | 
                        +</para>  | 
                    |
| 1347 | 
                        +<para>  | 
                    |
| 1348 | 
                        +  | 
                    |
| 1349 | 
                        +This preference helps to ensure Tor's <link linkend="isolation">Network  | 
                    |
| 1350 | 
                        +Isolation</link> requirement, by preventing file urls from executing network  | 
                    |
| 1351 | 
                        +operations in opposite Tor states. Also, allowing pages to submit arbitrary  | 
                    |
| 1352 | 
                        +files to arbitrary sites just generally seems like a bad idea.  | 
                    |
| 1353 | 
                        +  | 
                    |
| 1354 | 
                        +</para>  | 
                    |
| 1355 | 
                        +</sect2>  | 
                    |
| 1356 | 
                        +<sect2>  | 
                    |
| 1357 | 
                        +  | 
                    |
| 1358 | 
                        +<title>Close all Tor/Non-Tor tabs and windows on toggle (optional)</title>  | 
                    |
| 1359 | 
                        +  | 
                    |
| 1360 | 
                        + <para>Options:  | 
                    |
| 1361 | 
                        + <simplelist>  | 
                    |
| 1362 | 
                        + <member><command>extensions.torbutton.close_nontor</command></member>  | 
                    |
| 1363 | 
                        + <member><command>extensions.torbutton.close_tor</command></member>  | 
                    |
| 1364 | 
                        + </simplelist>  | 
                    |
| 1365 | 
                        + </para>  | 
                    |
| 1366 | 
                        +  | 
                    |
| 1367 | 
                        +<para>  | 
                    |
| 1368 | 
                        +  | 
                    |
| 1369 | 
                        +These settings cause Torbutton to enumerate through all windows and close all  | 
                    |
| 1370 | 
                        +tabs in each window for the appropriate Tor state. This code can be found in  | 
                    |
| 1371 | 
                        +<function>torbutton_update_status()</function>. The main reason these settings  | 
                    |
| 1372 | 
                        +exist is as a backup mechanism in the event of any Javascript or content policy  | 
                    |
| 1373 | 
                        +leaks due to <ulink  | 
                    |
| 1374 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=409737">Firefox Bug  | 
                    |
| 1375 | 
                        +409737</ulink>. Torbutton currently tries to block all Javascript network  | 
                    |
| 1376 | 
                        +activity via the content policy, but until that bug is fixed, there is some  | 
                    |
| 1377 | 
                        +risk that there are alternate ways to bypass the policy. This option is  | 
                    |
| 1378 | 
                        +available as an extra assurance of <link linkend="isolation">Network  | 
                    |
| 1379 | 
                        +Isolation</link> for those who would like to be sure that when Tor is toggled  | 
                    |
| 1380 | 
                        +all page activity has ceased. It also serves as a potential future workaround  | 
                    |
| 1381 | 
                        +in the event a content policy failure is discovered, and provides an additional  | 
                    |
| 1382 | 
                        +level of protection for the <link linkend="disk">Disk Avoidance</link>  | 
                    |
| 1383 | 
                        +protection so that browser state is not sitting around waiting to be swapped  | 
                    |
| 1384 | 
                        +out longer than necessary.  | 
                    |
| 1385 | 
                        +  | 
                    |
| 1386 | 
                        +</para>  | 
                    |
| 1387 | 
                        +<para>  | 
                    |
| 1388 | 
                        +While this setting doesn't satisfy any Torbutton requirements, the fact that  | 
                    |
| 1389 | 
                        +cookies are transmitted for partially typed queries does not seem desirable  | 
                    |
| 1390 | 
                        +for Tor usage.  | 
                    |
| 1391 | 
                        +</para>  | 
                    |
| 1392 | 
                        +</sect2>  | 
                    |
| 1393 | 
                        +  | 
                    |
| 1394 | 
                        +<sect2>  | 
                    |
| 1395 | 
                        +<title>Isolate Access to History navigation to Tor state (crucial)</title>  | 
                    |
| 1396 | 
                        + <para>Option: <command>extensions.torbutton.block_js_history</command></para>  | 
                    |
| 1397 | 
                        + <para>  | 
                    |
| 1398 | 
                        +This setting determines if Torbutton installs an <ulink  | 
                    |
| 1399 | 
                        +url="http://www.oxymoronical.com/experiments/apidocs/interface/nsISHistoryListener">nsISHistoryListener</ulink>  | 
                    |
| 1400 | 
                        +attached to the <ulink  | 
                    |
| 1401 | 
                        +url="http://www.oxymoronical.com/experiments/apidocs/interface/nsISHistory">sessionHistory</ulink> of  | 
                    |
| 1402 | 
                        +of each browser's <ulink  | 
                    |
| 1403 | 
                        +url="https://developer.mozilla.org/en/XUL%3aProperty%3awebNavigation">webNavigatator</ulink>.  | 
                    |
| 1404 | 
                        +The nsIShistoryListener is instantiated with a reference to the containing  | 
                    |
| 1405 | 
                        +browser window and blocks the back, forward, and reload buttons on the browser  | 
                    |
| 1406 | 
                        +navigation bar when Tor is in an opposite state than the one to load the  | 
                    |
| 1407 | 
                        +current tab. In addition, Tor clears the session history during a new document  | 
                    |
| 1408 | 
                        +load if this setting is enabled.  | 
                    |
| 1409 | 
                        +  | 
                    |
| 1410 | 
                        + </para>  | 
                    |
| 1411 | 
                        + <para>  | 
                    |
| 1412 | 
                        +  | 
                    |
| 1413 | 
                        +This is marked as a crucial setting in part  | 
                    |
| 1414 | 
                        +because Javascript access to the history object is indistinguishable from  | 
                    |
| 1415 | 
                        +user clicks, and because  | 
                    |
| 1416 | 
                        +<ulink  | 
                    |
| 1417 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=409737">Firefox Bug  | 
                    |
| 1418 | 
                        +409737</ulink> allows javascript to execute in opposite Tor states, javascript  | 
                    |
| 1419 | 
                        +can issue reloads after Tor toggle to reveal your original IP. Even without  | 
                    |
| 1420 | 
                        +this bug, however, Javascript is still able to access previous pages in your  | 
                    |
| 1421 | 
                        +session history that may have been loaded under a different Tor state, to  | 
                    |
| 1422 | 
                        +attempt to correlate your activity.  | 
                    |
| 1423 | 
                        +  | 
                    |
| 1424 | 
                        + </para>  | 
                    |
| 1425 | 
                        + <para>  | 
                    |
| 1426 | 
                        +  | 
                    |
| 1427 | 
                        +This setting helps to fulfill Torbutton's <link linkend="state">State  | 
                    |
| 1428 | 
                        +Separation</link> and (until Bug 409737 is fixed) <link linkend="isolation">Network Isolation</link>  | 
                    |
| 1429 | 
                        +requirements.  | 
                    |
| 1430 | 
                        +  | 
                    |
| 1431 | 
                        + </para>  | 
                    |
| 1432 | 
                        +</sect2>  | 
                    |
| 1433 | 
                        +  | 
                    |
| 1434 | 
                        +  | 
                    |
| 1435 | 
                        +<sect2>  | 
                    |
| 1436 | 
                        +<title>History Access Settings</title>  | 
                    |
| 1437 | 
                        +  | 
                    |
| 1438 | 
                        + <para>Options:  | 
                    |
| 1439 | 
                        + <simplelist>  | 
                    |
| 1440 | 
                        + <member><command>extensions.torbutton.block_thread</command></member>  | 
                    |
| 1441 | 
                        + <member><command>extensions.torbutton.block_nthread</command></member>  | 
                    |
| 1442 | 
                        + <member><command>extensions.torbutton.block_thwrite</command></member>  | 
                    |
| 1443 | 
                        + <member><command>extensions.torbutton.block_nthwrite</command></member>  | 
                    |
| 1444 | 
                        + </simplelist>  | 
                    |
| 1445 | 
                        + </para>  | 
                    |
| 1446 | 
                        +  | 
                    |
| 1447 | 
                        +<para>These four settings govern the behavior of the <ulink  | 
                    |
| 1448 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/ignore-history.js">components/ignore-history.js</ulink>  | 
                    |
| 1449 | 
                        +history blocker component mentioned above. By hooking the browser's view of  | 
                    |
| 1450 | 
                        +the history itself via the <ulink  | 
                    |
| 1451 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/global-history;2">@mozilla.org/browser/global-history;2</ulink>  | 
                    |
| 1452 | 
                        +and <ulink  | 
                    |
| 1453 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/nav-history-service;1">@mozilla.org/browser/nav-history-service;1</ulink>  | 
                    |
| 1454 | 
                        +components, this mechanism defeats all document-based <ulink  | 
                    |
| 1455 | 
                        +url="http://whattheinternetknowsaboutyou.com/">history disclosure  | 
                    |
| 1456 | 
                        +attacks</ulink>, including <ulink  | 
                    |
| 1457 | 
                        +url="http://ha.ckers.org/weird/CSS-history.cgi">CSS-only attacks</ulink>.  | 
                    |
| 1458 | 
                        +  | 
                    |
| 1459 | 
                        +The component also hooks functions involved in writing history to disk via  | 
                    |
| 1460 | 
                        +both the <ulink  | 
                    |
| 1461 | 
                        +url="http://developer.mozilla.org/en/docs/Places_migration_guide#History">Places  | 
                    |
| 1462 | 
                        +Database</ulink> and the older Firefox 2 mechanisms.  | 
                    |
| 1463 | 
                        +  | 
                    |
| 1464 | 
                        +</para>  | 
                    |
| 1465 | 
                        +  | 
                    |
| 1466 | 
                        +<para>  | 
                    |
| 1467 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1468 | 
                        +linkend="state">State Separation</link> and <link  | 
                    |
| 1469 | 
                        +linkend="disk">Disk Avoidance</link> requirements.  | 
                    |
| 1470 | 
                        +</para>  | 
                    |
| 1471 | 
                        +  | 
                    |
| 1472 | 
                        +</sect2>  | 
                    |
| 1473 | 
                        +<sect2>  | 
                    |
| 1474 | 
                        +  | 
                    |
| 1475 | 
                        +<title>Clear History During Tor Toggle (optional)</title>  | 
                    |
| 1476 | 
                        +  | 
                    |
| 1477 | 
                        +<para>Option: <command>extensions.torbutton.clear_history</command></para>  | 
                    |
| 1478 | 
                        +  | 
                    |
| 1479 | 
                        +<para>This setting governs if Torbutton calls  | 
                    |
| 1480 | 
                        +<ulink  | 
                    |
| 1481 | 
                        +url="https://developer.mozilla.org/en/nsIBrowserHistory#removeAllPages.28.29">nsIBrowserHistory.removeAllPages</ulink>  | 
                    |
| 1482 | 
                        +and <ulink  | 
                    |
| 1483 | 
                        +url="http://www.oxymoronical.com/experiments/apidocs/interface/nsISHistory">nsISHistory.PurgeHistory</ulink>  | 
                    |
| 1484 | 
                        +for each tab on Tor toggle.</para>  | 
                    |
| 1485 | 
                        +<para>  | 
                    |
| 1486 | 
                        +This setting is an optional way to help satisfy the <link  | 
                    |
| 1487 | 
                        +linkend="state">State Separation</link> requirement.  | 
                    |
| 1488 | 
                        +</para>  | 
                    |
| 1489 | 
                        +  | 
                    |
| 1490 | 
                        +</sect2>  | 
                    |
| 1491 | 
                        +<sect2>  | 
                    |
| 1492 | 
                        +  | 
                    |
| 1493 | 
                        +<title>Block Password+Form saving during Tor/Non-Tor</title>  | 
                    |
| 1494 | 
                        +  | 
                    |
| 1495 | 
                        +<para>Options:  | 
                    |
| 1496 | 
                        + <simplelist>  | 
                    |
| 1497 | 
                        + <member><command>extensions.torbutton.block_tforms</command></member>  | 
                    |
| 1498 | 
                        + <member><command>extensions.torbutton.block_ntforms</command></member>  | 
                    |
| 1499 | 
                        + </simplelist>  | 
                    |
| 1500 | 
                        + </para>  | 
                    |
| 1501 | 
                        +  | 
                    |
| 1502 | 
                        +<para>These settings govern if Torbutton disables  | 
                    |
| 1503 | 
                        +<command>browser.formfill.enable</command>  | 
                    |
| 1504 | 
                        +and <command>signon.rememberSignons</command> during Tor and Non-Tor usage.  | 
                    |
| 1505 | 
                        +Since form fields can be read at any time by Javascript, this setting is a lot  | 
                    |
| 1506 | 
                        +more important than it seems.  | 
                    |
| 1507 | 
                        +</para>  | 
                    |
| 1508 | 
                        +  | 
                    |
| 1509 | 
                        +<para>  | 
                    |
| 1510 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1511 | 
                        +linkend="state">State Separation</link> and <link  | 
                    |
| 1512 | 
                        +linkend="disk">Disk Avoidance</link> requirements.  | 
                    |
| 1513 | 
                        +</para>  | 
                    |
| 1514 | 
                        +  | 
                    |
| 1515 | 
                        +</sect2>  | 
                    |
| 1516 | 
                        +<sect2>  | 
                    |
| 1517 | 
                        + <title>Block Tor disk cache and clear all cache on Tor Toggle</title>  | 
                    |
| 1518 | 
                        +  | 
                    |
| 1519 | 
                        + <para>Option: <command>extensions.torbutton.clear_cache</command>  | 
                    |
| 1520 | 
                        + </para>  | 
                    |
| 1521 | 
                        +  | 
                    |
| 1522 | 
                        +<para>This option causes Torbutton to call <ulink  | 
                    |
| 1523 | 
                        +url="https://developer.mozilla.org/en/nsICacheService#evictEntries.28.29">nsICacheService.evictEntries(0)</ulink>  | 
                    |
| 1524 | 
                        +on Tor toggle to remove all entries from the cache. In addition, this setting  | 
                    |
| 1525 | 
                        +causes Torbutton to set <ulink  | 
                    |
| 1526 | 
                        +url="http://kb.mozillazine.org/Browser.cache.disk.enable">browser.cache.disk.enable</ulink> to false.  | 
                    |
| 1527 | 
                        +</para>  | 
                    |
| 1528 | 
                        +<para>  | 
                    |
| 1529 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1530 | 
                        +linkend="state">State Separation</link> and <link  | 
                    |
| 1531 | 
                        +linkend="disk">Disk Avoidance</link> requirements.  | 
                    |
| 1532 | 
                        +</para>  | 
                    |
| 1533 | 
                        +  | 
                    |
| 1534 | 
                        +</sect2>  | 
                    |
| 1535 | 
                        +<sect2>  | 
                    |
| 1536 | 
                        + <title>Block disk and memory cache during Tor</title>  | 
                    |
| 1537 | 
                        +  | 
                    |
| 1538 | 
                        +<para>Option: <command>extensions.torbutton.block_cache</command></para>  | 
                    |
| 1539 | 
                        +  | 
                    |
| 1540 | 
                        +<para>This setting  | 
                    |
| 1541 | 
                        +causes Torbutton to set <ulink  | 
                    |
| 1542 | 
                        +url="http://kb.mozillazine.org/Browser.cache.memory.enable">browser.cache.memory.enable</ulink>,  | 
                    |
| 1543 | 
                        +<ulink  | 
                    |
| 1544 | 
                        +url="http://kb.mozillazine.org/Browser.cache.disk.enable">browser.cache.disk.enable</ulink> and  | 
                    |
| 1545 | 
                        +<ulink  | 
                    |
| 1546 | 
                        +url="http://kb.mozillazine.org/Network.http.use-cache">network.http.use-cache</ulink> to false during tor usage.  | 
                    |
| 1547 | 
                        +</para>  | 
                    |
| 1548 | 
                        +<para>  | 
                    |
| 1549 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1550 | 
                        +linkend="state">State Separation</link> and <link  | 
                    |
| 1551 | 
                        +linkend="disk">Disk Avoidance</link> requirements.  | 
                    |
| 1552 | 
                        +</para>  | 
                    |
| 1553 | 
                        +  | 
                    |
| 1554 | 
                        +</sect2>  | 
                    |
| 1555 | 
                        +<sect2>  | 
                    |
| 1556 | 
                        + <title>Clear Cookies on Tor Toggle</title>  | 
                    |
| 1557 | 
                        +  | 
                    |
| 1558 | 
                        +<para>Option: <command>extensions.torbutton.clear_cookies</command>  | 
                    |
| 1559 | 
                        + </para>  | 
                    |
| 1560 | 
                        +  | 
                    |
| 1561 | 
                        +<para>  | 
                    |
| 1562 | 
                        +  | 
                    |
| 1563 | 
                        +This setting causes Torbutton to call <ulink  | 
                    |
| 1564 | 
                        +url="https://developer.mozilla.org/en/nsICookieManager#removeAll.28.29">nsICookieManager.removeAll()</ulink> on  | 
                    |
| 1565 | 
                        +every Tor toggle. In addition, this sets <ulink  | 
                    |
| 1566 | 
                        +url="http://kb.mozillazine.org/Network.cookie.lifetimePolicy">network.cookie.lifetimePolicy</ulink>  | 
                    |
| 1567 | 
                        +to 2 for Tor usage, which causes all cookies to be demoted to session cookies,  | 
                    |
| 1568 | 
                        +which prevents them from being written to disk.  | 
                    |
| 1569 | 
                        +  | 
                    |
| 1570 | 
                        +</para>  | 
                    |
| 1571 | 
                        +<para>  | 
                    |
| 1572 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1573 | 
                        +linkend="state">State Separation</link> and <link  | 
                    |
| 1574 | 
                        +linkend="disk">Disk Avoidance</link> requirements.  | 
                    |
| 1575 | 
                        +</para>  | 
                    |
| 1576 | 
                        +  | 
                    |
| 1577 | 
                        +</sect2>  | 
                    |
| 1578 | 
                        +<sect2>  | 
                    |
| 1579 | 
                        +  | 
                    |
| 1580 | 
                        + <title>Store Non-Tor cookies in a protected jar</title>  | 
                    |
| 1581 | 
                        +  | 
                    |
| 1582 | 
                        +<para>Option: <command>extensions.torbutton.cookie_jars</command>  | 
                    |
| 1583 | 
                        + </para>  | 
                    |
| 1584 | 
                        +  | 
                    |
| 1585 | 
                        +<para>  | 
                    |
| 1586 | 
                        +  | 
                    |
| 1587 | 
                        +This setting causes Torbutton to use <ulink  | 
                    |
| 1588 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js">@torproject.org/cookie-jar-selector;2</ulink> to store  | 
                    |
| 1589 | 
                        +non-tor cookies in a cookie jar during Tor usage, and clear the Tor cookies  | 
                    |
| 1590 | 
                        +before restoring the jar.  | 
                    |
| 1591 | 
                        +</para>  | 
                    |
| 1592 | 
                        +<para>  | 
                    |
| 1593 | 
                        +This setting also sets <ulink  | 
                    |
| 1594 | 
                        +url="http://kb.mozillazine.org/Network.cookie.lifetimePolicy">network.cookie.lifetimePolicy</ulink>  | 
                    |
| 1595 | 
                        +to 2 for Tor usage, which causes all cookies to be demoted to session cookies,  | 
                    |
| 1596 | 
                        +which prevents them from being written to disk.  | 
                    |
| 1597 | 
                        +  | 
                    |
| 1598 | 
                        +</para>  | 
                    |
| 1599 | 
                        +  | 
                    |
| 1600 | 
                        +<para>  | 
                    |
| 1601 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1602 | 
                        +linkend="state">State Separation</link> and <link  | 
                    |
| 1603 | 
                        +linkend="disk">Disk Avoidance</link> requirements.  | 
                    |
| 1604 | 
                        +</para>  | 
                    |
| 1605 | 
                        +  | 
                    |
| 1606 | 
                        +  | 
                    |
| 1607 | 
                        +</sect2>  | 
                    |
| 1608 | 
                        +<sect2>  | 
                    |
| 1609 | 
                        +  | 
                    |
| 1610 | 
                        + <title>Store both Non-Tor and Tor cookies in a protected jar (dangerous)</title>  | 
                    |
| 1611 | 
                        +  | 
                    |
| 1612 | 
                        +<para>Option: <command>extensions.torbutton.dual_cookie_jars</command>  | 
                    |
| 1613 | 
                        + </para>  | 
                    |
| 1614 | 
                        +  | 
                    |
| 1615 | 
                        +<para>  | 
                    |
| 1616 | 
                        +  | 
                    |
| 1617 | 
                        +This setting causes Torbutton to use <ulink  | 
                    |
| 1618 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js">@torproject.org/cookie-jar-selector;2</ulink> to store  | 
                    |
| 1619 | 
                        +both Tor and Non-Tor cookies into protected jars.  | 
                    |
| 1620 | 
                        +</para>  | 
                    |
| 1621 | 
                        +  | 
                    |
| 1622 | 
                        +<para>  | 
                    |
| 1623 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1624 | 
                        +linkend="state">State Separation</link> requirement.  | 
                    |
| 1625 | 
                        +</para>  | 
                    |
| 1626 | 
                        +  | 
                    |
| 1627 | 
                        +  | 
                    |
| 1628 | 
                        +</sect2>  | 
                    |
| 1629 | 
                        +  | 
                    |
| 1630 | 
                        +  | 
                    |
| 1631 | 
                        +<sect2>  | 
                    |
| 1632 | 
                        +  | 
                    |
| 1633 | 
                        + <title>Manage My Own Cookies (dangerous)</title>  | 
                    |
| 1634 | 
                        +  | 
                    |
| 1635 | 
                        +<para>Options: None</para>  | 
                    |
| 1636 | 
                        +<para>This setting disables all Torbutton cookie handling by setting the above  | 
                    |
| 1637 | 
                        +cookie prefs all to false.</para>  | 
                    |
| 1638 | 
                        +</sect2>  | 
                    |
| 1639 | 
                        +<sect2>  | 
                    |
| 1640 | 
                        +  | 
                    |
| 1641 | 
                        +<sect2>  | 
                    |
| 1642 | 
                        + <title>Do not write Tor/Non-Tor cookies to disk</title>  | 
                    |
| 1643 | 
                        + <para>Options:  | 
                    |
| 1644 | 
                        + <simplelist>  | 
                    |
| 1645 | 
                        + <member><command>extensions.torbutton.tor_memory_jar</command></member>  | 
                    |
| 1646 | 
                        + <member><command>extensions.torbutton.nontor_memory_jar</command></member>  | 
                    |
| 1647 | 
                        + </simplelist>  | 
                    |
| 1648 | 
                        + </para>  | 
                    |
| 1649 | 
                        +  | 
                    |
| 1650 | 
                        +<para>  | 
                    |
| 1651 | 
                        +These settings (contributed by arno) cause Torbutton to set <ulink  | 
                    |
| 1652 | 
                        +url="http://kb.mozillazine.org/Network.cookie.lifetimePolicy">network.cookie.lifetimePolicy</ulink>  | 
                    |
| 1653 | 
                        +to 2 during the appropriate Tor state, and to store cookies acquired in that  | 
                    |
| 1654 | 
                        +state into a Javascript  | 
                    |
| 1655 | 
                        +<ulink  | 
                    |
| 1656 | 
                        +url="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Processing_XML_with_E4X">E4X</ulink>  | 
                    |
| 1657 | 
                        +object as opposed to writing them to disk.  | 
                    |
| 1658 | 
                        +</para>  | 
                    |
| 1659 | 
                        +  | 
                    |
| 1660 | 
                        +<para>  | 
                    |
| 1661 | 
                        +This allows Torbutton to provide an option to preserve a user's  | 
                    |
| 1662 | 
                        +cookies while still satisfying the <link linkend="disk">Disk Avoidance</link>  | 
                    |
| 1663 | 
                        +requirement.  | 
                    |
| 1664 | 
                        +</para>  | 
                    |
| 1665 | 
                        +</sect2>  | 
                    |
| 1666 | 
                        +  | 
                    |
| 1667 | 
                        +  | 
                    |
| 1668 | 
                        + <title>Disable DOM Storage during Tor usage (crucial)</title>  | 
                    |
| 1669 | 
                        +  | 
                    |
| 1670 | 
                        +<para>Option: <command>extensions.torbutton.disable_domstorage</command>  | 
                    |
| 1671 | 
                        + </para>  | 
                    |
| 1672 | 
                        +  | 
                    |
| 1673 | 
                        +<para>  | 
                    |
| 1674 | 
                        +  | 
                    |
| 1675 | 
                        +This setting causes Torbutton to toggle <command>dom.storage.enabled</command> during Tor  | 
                    |
| 1676 | 
                        +usage to prevent  | 
                    |
| 1677 | 
                        +<ulink  | 
                    |
| 1678 | 
                        + url="http://developer.mozilla.org/en/docs/DOM:Storage">DOM Storage</ulink> from  | 
                    |
| 1679 | 
                        + being used to store persistent information across Tor states.</para>  | 
                    |
| 1680 | 
                        +<para>  | 
                    |
| 1681 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1682 | 
                        +linkend="state">State Separation</link> requirement.  | 
                    |
| 1683 | 
                        +</para>  | 
                    |
| 1684 | 
                        +  | 
                    |
| 1685 | 
                        +</sect2>  | 
                    |
| 1686 | 
                        +  | 
                    |
| 1687 | 
                        +<sect2>  | 
                    |
| 1688 | 
                        + <title>Clear HTTP Auth on Tor Toggle (recommended)</title>  | 
                    |
| 1689 | 
                        +<para>Option: <command>extensions.torbutton.clear_http_auth</command>  | 
                    |
| 1690 | 
                        + </para>  | 
                    |
| 1691 | 
                        +  | 
                    |
| 1692 | 
                        +<para>  | 
                    |
| 1693 | 
                        +This setting causes Torbutton to call <ulink  | 
                    |
| 1694 | 
                        +url="http://www.oxymoronical.com/experiments/apidocs/interface/nsIHttpAuthManager">nsIHttpAuthManager.clearAll()</ulink>  | 
                    |
| 1695 | 
                        +every time Tor is toggled.  | 
                    |
| 1696 | 
                        +</para>  | 
                    |
| 1697 | 
                        +  | 
                    |
| 1698 | 
                        +<para>  | 
                    |
| 1699 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1700 | 
                        +linkend="state">State Separation</link> requirement.  | 
                    |
| 1701 | 
                        +</para>  | 
                    |
| 1702 | 
                        +</sect2>  | 
                    |
| 1703 | 
                        +  | 
                    |
| 1704 | 
                        +<sect2>  | 
                    |
| 1705 | 
                        +  | 
                    |
| 1706 | 
                        + <title>Clear cookies on Tor/Non-Tor shutdown</title>  | 
                    |
| 1707 | 
                        +  | 
                    |
| 1708 | 
                        +<para>Option: <command>extensions.torbutton.shutdown_method</command>  | 
                    |
| 1709 | 
                        + </para>  | 
                    |
| 1710 | 
                        +  | 
                    |
| 1711 | 
                        +<para> This option variable can actually take 3 values: 0, 1, and 2. 0 means no  | 
                    |
| 1712 | 
                        +cookie clearing, 1 means clear only during Tor-enabled shutdown, and 2 means  | 
                    |
| 1713 | 
                        +clear for both Tor and Non-Tor shutdown. When set to 1 or 2, Torbutton listens  | 
                    |
| 1714 | 
                        +for the <ulink  | 
                    |
| 1715 | 
                        +url="http://developer.mozilla.org/en/docs/Observer_Notifications#Application_shutdown">quit-application-granted</ulink> event in  | 
                    |
| 1716 | 
                        +<function>torbutton_uninstall_observer()</function> and use <ulink  | 
                    |
| 1717 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js">@torproject.org/cookie-jar-selector;2</ulink>  | 
                    |
| 1718 | 
                        +to clear out all cookies and all cookie jars upon shutdown. </para>  | 
                    |
| 1719 | 
                        +<para>  | 
                    |
| 1720 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1721 | 
                        +linkend="state">State Separation</link> requirement.  | 
                    |
| 1722 | 
                        +</para>  | 
                    |
| 1723 | 
                        +  | 
                    |
| 1724 | 
                        +  | 
                    |
| 1725 | 
                        +</sect2>  | 
                    |
| 1726 | 
                        +<sect2>  | 
                    |
| 1727 | 
                        +  | 
                    |
| 1728 | 
                        + <title>Reload cookie jar/clear cookies on Firefox crash</title>  | 
                    |
| 1729 | 
                        + <para>Options:  | 
                    |
| 1730 | 
                        + <simplelist>  | 
                    |
| 1731 | 
                        + <member><command>extensions.torbutton.reload_crashed_jar</command></member>  | 
                    |
| 1732 | 
                        + <member><command>extensions.torbutton.crashed</command></member>  | 
                    |
| 1733 | 
                        + </simplelist>  | 
                    |
| 1734 | 
                        + </para>  | 
                    |
| 1735 | 
                        +  | 
                    |
| 1736 | 
                        + <para>This is no longer a user visible option, and is enabled by default. In  | 
                    |
| 1737 | 
                        +the event of a crash, the Torbutton <ulink  | 
                    |
| 1738 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js">components/crash-observer.js</ulink>  | 
                    |
| 1739 | 
                        + component will notify the Chrome (via the  | 
                    |
| 1740 | 
                        + <command>extensions.torbutton.crashed</command> pref and a <ulink  | 
                    |
| 1741 | 
                        +url="https://developer.mozilla.org/en/NsIPrefBranch2#addObserver.28.29">pref  | 
                    |
| 1742 | 
                        +observer</ulink> in  | 
                    |
| 1743 | 
                        +the chrome that listens for this update), and Torbutton will load the  | 
                    |
| 1744 | 
                        + correct jar for the current Tor state via the <ulink  | 
                    |
| 1745 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js">@torproject.org/cookie-jar-selector;2</ulink>  | 
                    |
| 1746 | 
                        + component.</para>  | 
                    |
| 1747 | 
                        +  | 
                    |
| 1748 | 
                        +<para>  | 
                    |
| 1749 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1750 | 
                        +linkend="state">State Separation</link> requirement in the event of Firefox  | 
                    |
| 1751 | 
                        +crashes.  | 
                    |
| 1752 | 
                        +</para>  | 
                    |
| 1753 | 
                        +  | 
                    |
| 1754 | 
                        +</sect2>  | 
                    |
| 1755 | 
                        +  | 
                    |
| 1756 | 
                        +  | 
                    |
| 1757 | 
                        +<sect2>  | 
                    |
| 1758 | 
                        + <title>On crash recovery or session restored startup, restore via: Tor, Non-Tor</title>  | 
                    |
| 1759 | 
                        + <para>Options:  | 
                    |
| 1760 | 
                        + <simplelist>  | 
                    |
| 1761 | 
                        + <member><command>extensions.torbutton.restore_tor</command></member>  | 
                    |
| 1762 | 
                        + <member><command>extensions.torbutton.crashed</command></member>  | 
                    |
| 1763 | 
                        + <member><command>extensions.torbutton.normal_exit</command></member>  | 
                    |
| 1764 | 
                        + </simplelist>  | 
                    |
| 1765 | 
                        + </para>  | 
                    |
| 1766 | 
                        +  | 
                    |
| 1767 | 
                        + <para>This option works with the Torbutton <ulink  | 
                    |
| 1768 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js">crash-observer.js</ulink>  | 
                    |
| 1769 | 
                        + to set the Tor state after a crash is detected (via the  | 
                    |
| 1770 | 
                        + <command>extensions.torbutton.crashed</command> pref). To confirm for  | 
                    |
| 1771 | 
                        +false positives (such as session restore failures, upgrade, normal  | 
                    |
| 1772 | 
                        +session restore, etc), Torbutton also sets the pref  | 
                    |
| 1773 | 
                        +extensions.torbutton.normal_exit in torbutton_uninstall_observer() during  | 
                    |
| 1774 | 
                        +Firefox exit and checks this value as well during startup.  | 
                    |
| 1775 | 
                        +</para>  | 
                    |
| 1776 | 
                        +<para>  | 
                    |
| 1777 | 
                        +  | 
                    |
| 1778 | 
                        +Since the Tor state after a Firefox crash is unknown/indeterminate, this  | 
                    |
| 1779 | 
                        +setting helps to satisfy the <link linkend="state">State Separation</link>  | 
                    |
| 1780 | 
                        +requirement in the event of Firefox crashes by ensuring all cookies,  | 
                    |
| 1781 | 
                        +settings and saved sessions are reloaded from a fixed Tor state.  | 
                    |
| 1782 | 
                        +  | 
                    |
| 1783 | 
                        +</para>  | 
                    |
| 1784 | 
                        +</sect2>  | 
                    |
| 1785 | 
                        +  | 
                    |
| 1786 | 
                        +<sect2>  | 
                    |
| 1787 | 
                        + <title>On normal startup, set state to: Tor, Non-Tor, Shutdown State</title>  | 
                    |
| 1788 | 
                        +  | 
                    |
| 1789 | 
                        + <para>Options:  | 
                    |
| 1790 | 
                        + <simplelist>  | 
                    |
| 1791 | 
                        + <member><command>extensions.torbutton.startup_state</command></member>  | 
                    |
| 1792 | 
                        + <member><command>extensions.torbutton.noncrashed</command></member>  | 
                    |
| 1793 | 
                        + <member><command>extensions.torbutton.normal_exit</command></member>  | 
                    |
| 1794 | 
                        + </simplelist>  | 
                    |
| 1795 | 
                        + </para>  | 
                    |
| 1796 | 
                        +  | 
                    |
| 1797 | 
                        + <para>This option also works with the Torbutton <ulink  | 
                    |
| 1798 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js">crash-observer.js</ulink>  | 
                    |
| 1799 | 
                        + to set the Tor state after a normal startup is detected (via the  | 
                    |
| 1800 | 
                        + <command>extensions.torbutton.noncrashed</command> pref). To confirm for  | 
                    |
| 1801 | 
                        +false positives  | 
                    |
| 1802 | 
                        +(such as session restore failures, etc), Torbutton also sets the pref  | 
                    |
| 1803 | 
                        +extensions.torbutton.normal_exit in torbutton_uninstall_observer() during  | 
                    |
| 1804 | 
                        +Firefox exit and checks this value as well during startup.  | 
                    |
| 1805 | 
                        +  | 
                    |
| 1806 | 
                        +</para>  | 
                    |
| 1807 | 
                        +  | 
                    |
| 1808 | 
                        +</sect2>  | 
                    |
| 1809 | 
                        +  | 
                    |
| 1810 | 
                        +<sect2>  | 
                    |
| 1811 | 
                        + <title>Prevent session store from saving Non-Tor/Tor-loaded tabs</title>  | 
                    |
| 1812 | 
                        +  | 
                    |
| 1813 | 
                        + <para>Options:  | 
                    |
| 1814 | 
                        + <simplelist>  | 
                    |
| 1815 | 
                        + <member><command>extensions.torbutton.nonontor_sessionstore</command></member>  | 
                    |
| 1816 | 
                        + <member><command>extensions.torbutton.notor_sessionstore</command></member>  | 
                    |
| 1817 | 
                        + </simplelist>  | 
                    |
| 1818 | 
                        + </para>  | 
                    |
| 1819 | 
                        +  | 
                    |
| 1820 | 
                        + <para>If these options are enabled, the <ulink  | 
                    |
| 1821 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/components/nsSessionStore3.js">replacement nsSessionStore.js</ulink>  | 
                    |
| 1822 | 
                        + component checks the <command>__tb_tor_fetched</command> tag of tabs before writing them  | 
                    |
| 1823 | 
                        + out. If the tag is from a blocked Tor state, the tab is not written to disk.  | 
                    |
| 1824 | 
                        + </para>  | 
                    |
| 1825 | 
                        +<para>  | 
                    |
| 1826 | 
                        +This setting helps to satisfy the <link linkend="disk">Disk Avoidance</link>  | 
                    |
| 1827 | 
                        +requirement, and also helps to satisfy the <link  | 
                    |
| 1828 | 
                        +linkend="state">State Separation</link> requirement in the event of Firefox  | 
                    |
| 1829 | 
                        +crashes.  | 
                    |
| 1830 | 
                        +  | 
                    |
| 1831 | 
                        +</para>  | 
                    |
| 1832 | 
                        +  | 
                    |
| 1833 | 
                        +</sect2>  | 
                    |
| 1834 | 
                        +  | 
                    |
| 1835 | 
                        +<sect2>  | 
                    |
| 1836 | 
                        +  | 
                    |
| 1837 | 
                        + <title>Set user agent during Tor usage (crucial)</title>  | 
                    |
| 1838 | 
                        + <para>Options:  | 
                    |
| 1839 | 
                        + <simplelist>  | 
                    |
| 1840 | 
                        + <member><command>extensions.torbutton.set_uagent</command></member>  | 
                    |
| 1841 | 
                        + <member><command>extensions.torbutton.platform_override</command></member>  | 
                    |
| 1842 | 
                        + <member><command>extensions.torbutton.oscpu_override</command></member>  | 
                    |
| 1843 | 
                        + <member><command>extensions.torbutton.buildID_override</command></member>  | 
                    |
| 1844 | 
                        + <member><command>extensions.torbutton.productsub_override</command></member>  | 
                    |
| 1845 | 
                        + <member><command>extensions.torbutton.appname_override</command></member>  | 
                    |
| 1846 | 
                        + <member><command>extensions.torbutton.appversion_override</command></member>  | 
                    |
| 1847 | 
                        + <member><command>extensions.torbutton.useragent_override</command></member>  | 
                    |
| 1848 | 
                        + <member><command>extensions.torbutton.useragent_vendor</command></member>  | 
                    |
| 1849 | 
                        + <member><command>extensions.torbutton.useragent_vendorSub</command></member>  | 
                    |
| 1850 | 
                        + </simplelist>  | 
                    |
| 1851 | 
                        + </para>  | 
                    |
| 1852 | 
                        +  | 
                    |
| 1853 | 
                        +<para>On face, user agent switching appears to be straight-forward in Firefox.  | 
                    |
| 1854 | 
                        +It provides several options for controlling the browser user agent string:  | 
                    |
| 1855 | 
                        +<command>general.appname.override</command>,  | 
                    |
| 1856 | 
                        +<command>general.appversion.override</command>,  | 
                    |
| 1857 | 
                        +<command>general.platform.override</command>,  | 
                    |
| 1858 | 
                        +<command>general.oscpu.override</command>,  | 
                    |
| 1859 | 
                        +<command>general.productSub.override</command>,  | 
                    |
| 1860 | 
                        +<command>general.buildID.override</command>,  | 
                    |
| 1861 | 
                        +<command>general.useragent.override</command>,  | 
                    |
| 1862 | 
                        +<command>general.useragent.vendor</command>, and  | 
                    |
| 1863 | 
                        +<command>general.useragent.vendorSub</command>. If  | 
                    |
| 1864 | 
                        +the Torbutton preference <command>extensions.torbutton.set_uagent</command> is  | 
                    |
| 1865 | 
                        +true, Torbutton copies all of the other above prefs into their corresponding  | 
                    |
| 1866 | 
                        +browser preferences during Tor usage.</para>  | 
                    |
| 1867 | 
                        +  | 
                    |
| 1868 | 
                        +  | 
                    |
| 1869 | 
                        +<para>  | 
                    |
| 1870 | 
                        +  | 
                    |
| 1871 | 
                        +It also turns out that it is possible to detect the original Firefox version  | 
                    |
| 1872 | 
                        +by <ulink url="http://ha.ckers.org/blog/20070516/read-firefox-settings-poc/">inspecting  | 
                    |
| 1873 | 
                        +certain resource:// files</ulink>. These cases are handled by Torbutton's  | 
                    |
| 1874 | 
                        +<link linkend="contentpolicy">content policy</link>.  | 
                    |
| 1875 | 
                        +  | 
                    |
| 1876 | 
                        +</para>  | 
                    |
| 1877 | 
                        +  | 
                    |
| 1878 | 
                        +<para>  | 
                    |
| 1879 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1880 | 
                        +linkend="setpreservation">Anonymity Set Preservation</link> requirement.  | 
                    |
| 1881 | 
                        +</para>  | 
                    |
| 1882 | 
                        +  | 
                    |
| 1883 | 
                        +  | 
                    |
| 1884 | 
                        +</sect2>  | 
                    |
| 1885 | 
                        +<sect2>  | 
                    |
| 1886 | 
                        +  | 
                    |
| 1887 | 
                        + <title>Spoof US English Browser</title>  | 
                    |
| 1888 | 
                        +<para>Options:  | 
                    |
| 1889 | 
                        +<simplelist>  | 
                    |
| 1890 | 
                        + <member><command>extensions.torbutton.spoof_english</command></member>  | 
                    |
| 1891 | 
                        + <member><command>extensions.torbutton.spoof_charset</command></member>  | 
                    |
| 1892 | 
                        + <member><command>extensions.torbutton.spoof_language</command></member>  | 
                    |
| 1893 | 
                        +</simplelist>  | 
                    |
| 1894 | 
                        +</para>  | 
                    |
| 1895 | 
                        +  | 
                    |
| 1896 | 
                        +<para> This option causes Torbutton to set  | 
                    |
| 1897 | 
                        +<command>general.useragent.locale</command>  | 
                    |
| 1898 | 
                        +<command>intl.accept_languages</command> to the value specified in  | 
                    |
| 1899 | 
                        +<command>extensions.torbutton.spoof_locale</command>,  | 
                    |
| 1900 | 
                        +<command>extensions.torbutton.spoof_charset</command> and  | 
                    |
| 1901 | 
                        +<command>extensions.torbutton.spoof_language</command> during Tor usage, as  | 
                    |
| 1902 | 
                        +well as hooking <command>navigator.language</command> via its <link  | 
                    |
| 1903 | 
                        +linkend="jshooks">javascript hooks</link>.  | 
                    |
| 1904 | 
                        + </para>  | 
                    |
| 1905 | 
                        +<para>  | 
                    |
| 1906 | 
                        +This setting helps to satisfy the <link  | 
                    |
| 1907 | 
                        +linkend="setpreservation">Anonymity Set Preservation</link> and <link  | 
                    |
| 1908 | 
                        +linkend="location">Location Neutrality</link> requirements.  | 
                    |
| 1909 | 
                        +</para>  | 
                    |
| 1910 | 
                        +  | 
                    |
| 1911 | 
                        +</sect2>  | 
                    |
| 1912 | 
                        +<sect2>  | 
                    |
| 1913 | 
                        +  | 
                    |
| 1914 | 
                        + <title>Don't send referrer during Tor Usage</title>  | 
                    |
| 1915 | 
                        +  | 
                    |
| 1916 | 
                        +<para>Option: <command>extensions.torbutton.disable_referer</command>  | 
                    |
| 1917 | 
                        +</para>  | 
                    |
| 1918 | 
                        +  | 
                    |
| 1919 | 
                        +<para>  | 
                    |
| 1920 | 
                        +This option causes Torbutton to set <ulink  | 
                    |
| 1921 | 
                        +url="http://kb.mozillazine.org/Network.http.sendSecureXSiteReferrer">network.http.sendSecureXSiteReferrer</ulink> and  | 
                    |
| 1922 | 
                        +<ulink  | 
                    |
| 1923 | 
                        +url="http://kb.mozillazine.org/Network.http.sendRefererHeader">network.http.sendRefererHeader</ulink> during Tor usage.</para>  | 
                    |
| 1924 | 
                        +  | 
                    |
| 1925 | 
                        +<para>  | 
                    |
| 1926 | 
                        +This setting also does not directly satisfy any Torbutton requirement, but  | 
                    |
| 1927 | 
                        +some may desire to mask their referrer for general privacy concerns.  | 
                    |
| 1928 | 
                        +</para>  | 
                    |
| 1929 | 
                        +</sect2>  | 
                    |
| 1930 | 
                        +  | 
                    |
| 1931 | 
                        +<sect2>  | 
                    |
| 1932 | 
                        +  | 
                    |
| 1933 | 
                        + <title>Store SSL/CA Certs in separate jars for Tor/Non-Tor (recommended)</title>  | 
                    |
| 1934 | 
                        +  | 
                    |
| 1935 | 
                        +<para>Options:  | 
                    |
| 1936 | 
                        +<simplelist>  | 
                    |
| 1937 | 
                        + <member><command>extensions.torbutton.jar_certs</command></member>  | 
                    |
| 1938 | 
                        + <member><command>extensions.torbutton.jar_ca_certs</command></member>  | 
                    |
| 1939 | 
                        +</simplelist>  | 
                    |
| 1940 | 
                        +</para>  | 
                    |
| 1941 | 
                        +<para>  | 
                    |
| 1942 | 
                        +  | 
                    |
| 1943 | 
                        +These settings govern if Torbutton attempts to isolate the user's SSL  | 
                    |
| 1944 | 
                        +certificates into separate jars for each Tor state. This isolation is  | 
                    |
| 1945 | 
                        +implemented in <function>torbutton_jar_certs()</function> in <ulink  | 
                    |
| 1946 | 
                        +url="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js">chrome/content/torbutton.js</ulink>,  | 
                    |
| 1947 | 
                        +which calls <function>torbutton_jar_cert_type()</function> and  | 
                    |
| 1948 | 
                        +<function>torbutton_unjar_cert_type()</function> for each certificate type in  | 
                    |
| 1949 | 
                        +the <ulink  | 
                    |
| 1950 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/security/nsscertcache;1">@mozilla.org/security/nsscertcache;1</ulink>.  | 
                    |
| 1951 | 
                        +Certificates are deleted from and imported to the <ulink  | 
                    |
| 1952 | 
                        +url="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/security/x509certdb;1">@mozilla.org/security/x509certdb;1</ulink>.  | 
                    |
| 1953 | 
                        +</para>  | 
                    |
| 1954 | 
                        +  | 
                    |
| 1955 | 
                        +<para>  | 
                    |
| 1956 | 
                        +The first time this pref is used, a backup of the user's certificates is  | 
                    |
| 1957 | 
                        +created in their profile directory under the name  | 
                    |
| 1958 | 
                        +<filename>cert8.db.bak</filename>. This file can be copied back to  | 
                    |
| 1959 | 
                        +<filename>cert8.db</filename> to fully restore the original state of the  | 
                    |
| 1960 | 
                        +user's certificates in the event of any error.  | 
                    |
| 1961 | 
                        +</para>  | 
                    |
| 1962 | 
                        +  | 
                    |
| 1963 | 
                        +<para>  | 
                    |
| 1964 | 
                        +Since exit nodes and malicious sites can insert content elements sourced to  | 
                    |
| 1965 | 
                        +specific SSL sites to query if a user has a certain certificate,  | 
                    |
| 1966 | 
                        +this setting helps to satisfy the <link linkend="state">State  | 
                    |
| 1967 | 
                        +Separation</link> requirement of Torbutton. Unfortunately, <ulink  | 
                    |
| 1968 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=435159">Firefox Bug  | 
                    |
| 1969 | 
                        +435159</ulink> prevents it from functioning correctly in the event of rapid Tor toggle, so it  | 
                    |
| 1970 | 
                        +is currently not exposed via the preferences UI.  | 
                    |
| 1971 | 
                        +  | 
                    |
| 1972 | 
                        +</para>  | 
                    |
| 1973 | 
                        +  | 
                    |
| 1974 | 
                        +</sect2>  | 
                    |
| 1975 | 
                        +</sect1>  | 
                    |
| 1976 | 
                        +  | 
                    |
| 1977 | 
                        +<sect1 id="FirefoxBugs">  | 
                    |
| 1978 | 
                        + <title>Relevant Firefox Bugs</title>  | 
                    |
| 1979 | 
                        + <para>  | 
                    |
| 1980 | 
                        +  | 
                    |
| 1981 | 
                        + </para>  | 
                    |
| 1982 | 
                        + <sect2 id="FirefoxSecurity">  | 
                    |
| 1983 | 
                        + <title>Bugs impacting security</title>  | 
                    |
| 1984 | 
                        + <para>  | 
                    |
| 1985 | 
                        +  | 
                    |
| 1986 | 
                        +Torbutton has to work around a number of Firefox bugs that impact its  | 
                    |
| 1987 | 
                        +security. Most of these are mentioned elsewhere in this document, but they  | 
                    |
| 1988 | 
                        +have also been gathered here for reference. Several of these have fixes in  | 
                    |
| 1989 | 
                        +Firefox3.0/trunk, but are listed because they still have not been backported  | 
                    |
| 1990 | 
                        +to FF2.0. In order of decreasing severity, they are:  | 
                    |
| 1991 | 
                        +  | 
                    |
| 1992 | 
                        + </para>  | 
                    |
| 1993 | 
                        + <orderedlist>  | 
                    |
| 1994 | 
                        +  | 
                    |
| 1995 | 
                        + <listitem><ulink  | 
                    |
| 1996 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=392274">Bug 392274 - Timezone  | 
                    |
| 1997 | 
                        +config/chrome API</ulink>  | 
                    |
| 1998 | 
                        + <para>  | 
                    |
| 1999 | 
                        +  | 
                    |
| 2000 | 
                        +The lack of a config or API to configure the timezone requires Torbutton to  | 
                    |
| 2001 | 
                        +<link linkend="jshooks">insert client content window javascript</link> to hook  | 
                    |
| 2002 | 
                        +the Date object. Additionally, a way to <ulink  | 
                    |
| 2003 | 
                        +url="http://pseudo-flaw.net/tor/torbutton/unmask-date.html">remove the Date  | 
                    |
| 2004 | 
                        +hooks</ulink> was discovered by Greg Fleischer. Worse, on Firefox 3,  | 
                    |
| 2005 | 
                        +javascript sandboxing prevents most of the javascript hooks from being  | 
                    |
| 2006 | 
                        +installed, including the Date hooks. On Windows and Linux, you can set the TZ  | 
                    |
| 2007 | 
                        +environment variable to "UTC" as a workaround. Firefox will obey this  | 
                    |
| 2008 | 
                        +environment variable for your Timezone on those platforms, but on Windows this  | 
                    |
| 2009 | 
                        +does not take effect until browser restart. A fix for this has landed in  | 
                    |
| 2010 | 
                        +Firefox 3.5, but still has not been backported to Firefox 3.0. The lack of an  | 
                    |
| 2011 | 
                        +easy way to reliably spoof the timezone interferes with Torbutton's ability to  | 
                    |
| 2012 | 
                        +fulfill its <link linkend="location">Location Neutrality</link> requirement.  | 
                    |
| 2013 | 
                        +  | 
                    |
| 2014 | 
                        +  | 
                    |
| 2015 | 
                        + </para>  | 
                    |
| 2016 | 
                        + </listitem>  | 
                    |
| 2017 | 
                        +<!--  | 
                    |
| 2018 | 
                        +FIXME: This one is fixed, but we need to make use of the new API in FF3.5  | 
                    |
| 2019 | 
                        +  | 
                    |
| 2020 | 
                        + <listitem><ulink  | 
                    |
| 2021 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=436250">Bug 436250 - Livemarks can't be  | 
                    |
| 2022 | 
                        +disabled at runtime</ulink>  | 
                    |
| 2023 | 
                        + <para>  | 
                    |
| 2024 | 
                        +  | 
                    |
| 2025 | 
                        +The RSS Feed based "Livemarks"/"Live Bookmarks" update frequency is controlled  | 
                    |
| 2026 | 
                        +by the pref <command>browser.bookmarks.livemark_refresh_seconds</command>.  | 
                    |
| 2027 | 
                        +However, changing this preference does not cancel any pending timers, which  | 
                    |
| 2028 | 
                        +means that at least one livemarks pref fetch will happen over Tor, and once  | 
                    |
| 2029 | 
                        +this pref is set to disable livemarks for Tor, changing it back will never  | 
                    |
| 2030 | 
                        +cause the service to start back up again. The  | 
                    |
| 2031 | 
                        +leakage of Livemarks interferes with Torbutton's ability to fulfill  | 
                    |
| 2032 | 
                        +the <link linkend="isolation">Network Isolation</link> requirement.  | 
                    |
| 2033 | 
                        +  | 
                    |
| 2034 | 
                        + </para>  | 
                    |
| 2035 | 
                        + </listitem>  | 
                    |
| 2036 | 
                        +-->  | 
                    |
| 2037 | 
                        +  | 
                    |
| 2038 | 
                        + <listitem><ulink  | 
                    |
| 2039 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=435159">Bug 435159 -  | 
                    |
| 2040 | 
                        +nsNSSCertificateDB::DeleteCertificate has race conditions</ulink>  | 
                    |
| 2041 | 
                        + <para>  | 
                    |
| 2042 | 
                        +  | 
                    |
| 2043 | 
                        +In Torbutton 1.2.0rc1, code was added to attempt to isolate SSL certificates  | 
                    |
| 2044 | 
                        +the user has installed. Unfortunately, the method call to delete a certificate  | 
                    |
| 2045 | 
                        +from the current certificate database acts lazily: it only sets a variable  | 
                    |
| 2046 | 
                        +that marks a cert for deletion later, and it is not cleared if that  | 
                    |
| 2047 | 
                        +certificate is re-added. This means that if the Tor state is toggled quickly,  | 
                    |
| 2048 | 
                        +that certificate could remain present until it is re-inserted (causing an  | 
                    |
| 2049 | 
                        +error dialog), and worse, it would still be deleted after that. The lack of  | 
                    |
| 2050 | 
                        +this functionality is considered a Torbutton security bug because cert  | 
                    |
| 2051 | 
                        +isolation is considered a <link linkend="state">State Separation</link>  | 
                    |
| 2052 | 
                        +feature.  | 
                    |
| 2053 | 
                        +  | 
                    |
| 2054 | 
                        + </para>  | 
                    |
| 2055 | 
                        + </listitem>  | 
                    |
| 2056 | 
                        +  | 
                    |
| 2057 | 
                        + <listitem><ulink  | 
                    |
| 2058 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=409737">Bug 409737 -  | 
                    |
| 2059 | 
                        +javascript.enabled and docShell.allowJavascript do not disable all event  | 
                    |
| 2060 | 
                        +handlers</ulink>  | 
                    |
| 2061 | 
                        + <para>  | 
                    |
| 2062 | 
                        +  | 
                    |
| 2063 | 
                        +This bug allows pages to execute javascript via addEventListener and perhaps  | 
                    |
| 2064 | 
                        +other callbacks. In order to prevent this bug from enabling an attacker to  | 
                    |
| 2065 | 
                        +break the <link linkend="isolation">Network Isolation</link> requirement,  | 
                    |
| 2066 | 
                        +Torbutton 1.1.13 began blocking popups and history manipulation from different  | 
                    |
| 2067 | 
                        +Tor states. So long as there are no ways to open popups or redirect the user  | 
                    |
| 2068 | 
                        +to a new page, the <link linkend="contentpolicy">Torbutton content  | 
                    |
| 2069 | 
                        +policy</link> should block Javascript network access. However, if there are  | 
                    |
| 2070 | 
                        +ways to open popups or perform redirects such that Torbutton cannot block  | 
                    |
| 2071 | 
                        +them, pages may still have free reign to break that requirement and reveal a  | 
                    |
| 2072 | 
                        +user's original IP address.  | 
                    |
| 2073 | 
                        +  | 
                    |
| 2074 | 
                        + </para>  | 
                    |
| 2075 | 
                        + </listitem>  | 
                    |
| 2076 | 
                        + <listitem><ulink  | 
                    |
| 2077 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=448743">Bug 448743 -  | 
                    |
| 2078 | 
                        +Decouple general.useragent.locale from spoofing of navigator.language</ulink>  | 
                    |
| 2079 | 
                        + <para>  | 
                    |
| 2080 | 
                        +  | 
                    |
| 2081 | 
                        +Currently, Torbutton spoofs the <command>navigator.language</command>  | 
                    |
| 2082 | 
                        +attribute via <link linkend="jshooks">Javascript hooks</link>. Unfortunately,  | 
                    |
| 2083 | 
                        +these do not work on Firefox 3. It would be ideal to have  | 
                    |
| 2084 | 
                        +a pref to set this value (something like a  | 
                    |
| 2085 | 
                        +<command>general.useragent.override.locale</command>),  | 
                    |
| 2086 | 
                        +to avoid fragmenting the anonymity set of users of foreign locales. This issue  | 
                    |
| 2087 | 
                        +impedes Torbutton from fully meeting its <link  | 
                    |
| 2088 | 
                        +linkend="setpreservation">Anonymity Set Preservation</link>  | 
                    |
| 2089 | 
                        +requirement on Firefox 3.  | 
                    |
| 2090 | 
                        +  | 
                    |
| 2091 | 
                        + </para>  | 
                    |
| 2092 | 
                        + </listitem>  | 
                    |
| 2093 | 
                        + </orderedlist>  | 
                    |
| 2094 | 
                        + </sect2>  | 
                    |
| 2095 | 
                        + <sect2 id="FirefoxWishlist">  | 
                    |
| 2096 | 
                        + <title>Bugs blocking functionality</title>  | 
                    |
| 2097 | 
                        + <para>  | 
                    |
| 2098 | 
                        +The following bugs impact Torbutton and similar extensions' functionality.  | 
                    |
| 2099 | 
                        + </para>  | 
                    |
| 2100 | 
                        +  | 
                    |
| 2101 | 
                        + <orderedlist>  | 
                    |
| 2102 | 
                        + <listitem><ulink  | 
                    |
| 2103 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=445696">Bug 445696 -  | 
                    |
| 2104 | 
                        +Extensions cannot determine if firefox is fullScreen</ulink>  | 
                    |
| 2105 | 
                        + <para>  | 
                    |
| 2106 | 
                        +  | 
                    |
| 2107 | 
                        +The windowState property of <ulink  | 
                    |
| 2108 | 
                        +url="https://developer.mozilla.org/en/XUL/window">ChromeWindows</ulink> does not accurately reflect the true  | 
                    |
| 2109 | 
                        +state of the window in some cases on Linux. This causes Torbutton to attempt  | 
                    |
| 2110 | 
                        +to resize maximized and minimized windows when it should not.  | 
                    |
| 2111 | 
                        +  | 
                    |
| 2112 | 
                        + </para>  | 
                    |
| 2113 | 
                        + </listitem>  | 
                    |
| 2114 | 
                        + <listitem><ulink  | 
                    |
| 2115 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=290456">Bug 290456 -  | 
                    |
| 2116 | 
                        +Block/clear Flash MX "cookies" as well</ulink>  | 
                    |
| 2117 | 
                        + <para>  | 
                    |
| 2118 | 
                        +  | 
                    |
| 2119 | 
                        +Today, it is possible to allow plugins if you have a transparent proxy such as  | 
                    |
| 2120 | 
                        +<ulink url="http://anonymityanywhere.com/incognito/">Incognito</ulink> to prevent proxy bypass. However, flash cookies can still be used to  | 
                    |
| 2121 | 
                        +link your Tor and Non-Tor activity, and this reveal your IP to an adversary  | 
                    |
| 2122 | 
                        +that does so. This can be solved by manually removing your flash cookies (like  | 
                    |
| 2123 | 
                        +<ulink  | 
                    |
| 2124 | 
                        +url="https://addons.mozilla.org/en-US/firefox/addon/6623">BetterPrivacy</ulink> does), but  | 
                    |
| 2125 | 
                        +it would be nice if there was a standard way to do this from a Firefox API.  | 
                    |
| 2126 | 
                        +  | 
                    |
| 2127 | 
                        + </para>  | 
                    |
| 2128 | 
                        + </listitem>  | 
                    |
| 2129 | 
                        + <listitem><ulink  | 
                    |
| 2130 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=417869">Bug 417869 -  | 
                    |
| 2131 | 
                        +Browser context is difficult to obtain from many XPCOM callbacks</ulink>  | 
                    |
| 2132 | 
                        + <para>  | 
                    |
| 2133 | 
                        +  | 
                    |
| 2134 | 
                        +It is difficult to determine which tabbrowser many XPCOM callbacks originate  | 
                    |
| 2135 | 
                        +from, and in some cases absolutely no context information is provided at all.  | 
                    |
| 2136 | 
                        +While this doesn't have much of an effect on Torbutton, it does make writing  | 
                    |
| 2137 | 
                        +extensions that would like to do per-tab settings and content filters (such as  | 
                    |
| 2138 | 
                        +FoxyProxy) difficult to impossible to implement securely.  | 
                    |
| 2139 | 
                        +  | 
                    |
| 2140 | 
                        + </para>  | 
                    |
| 2141 | 
                        + </listitem>  | 
                    |
| 2142 | 
                        + <listitem><ulink  | 
                    |
| 2143 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=418321">Bug 418321 -  | 
                    |
| 2144 | 
                        +Components do not expose disk interfaces</ulink>  | 
                    |
| 2145 | 
                        + <para>  | 
                    |
| 2146 | 
                        +  | 
                    |
| 2147 | 
                        +Several components currently provide no way of reimplementing their disk  | 
                    |
| 2148 | 
                        +access to easily satisfy Torbutton's <link linkend="disk">Disk  | 
                    |
| 2149 | 
                        +Avoidance</link> requirements. Workarounds exist, but they are <link  | 
                    |
| 2150 | 
                        +linkend="sessionstore">clunky</link>, and  | 
                    |
| 2151 | 
                        +some of them involve disabling functionality during Tor usage.  | 
                    |
| 2152 | 
                        +  | 
                    |
| 2153 | 
                        + </para>  | 
                    |
| 2154 | 
                        + </listitem>  | 
                    |
| 2155 | 
                        +  | 
                    |
| 2156 | 
                        +<!--  | 
                    |
| 2157 | 
                        +FIXME: Need to use new observer methods if possible  | 
                    |
| 2158 | 
                        + <listitem><ulink  | 
                    |
| 2159 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=448741">Bug 448741 -  | 
                    |
| 2160 | 
                        +nsISessionStore uses private methods and is not extensible</ulink>  | 
                    |
| 2161 | 
                        + <para>  | 
                    |
| 2162 | 
                        +  | 
                    |
| 2163 | 
                        +Similar to the above bug, in the specific case of the sessionstore component,  | 
                    |
| 2164 | 
                        +the API is not amenable to Contract ID hooking, and this requires that  | 
                    |
| 2165 | 
                        +Torbutton include modified copies of this component for Firefox 2 and 3, which  | 
                    |
| 2166 | 
                        +has <ulink  | 
                    |
| 2167 | 
                        +url="https://bugs.torproject.org/flyspray/index.php?do=details&id=722">raised  | 
                    |
| 2168 | 
                        +objections</ulink> from some developers.  | 
                    |
| 2169 | 
                        +  | 
                    |
| 2170 | 
                        + </para>  | 
                    |
| 2171 | 
                        + </listitem>  | 
                    |
| 2172 | 
                        + <listitem><ulink  | 
                    |
| 2173 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=439384">Bug 439384 -  | 
                    |
| 2174 | 
                        +"profile-do-change" event does not cause cookie table reload</ulink>  | 
                    |
| 2175 | 
                        + <para>  | 
                    |
| 2176 | 
                        +  | 
                    |
| 2177 | 
                        +In Firefox 3, the change to the new SQLlite database for cookie storage has a  | 
                    |
| 2178 | 
                        +bug that prevents Torbutton's cookie jaring from working properly. The  | 
                    |
| 2179 | 
                        +"profile-do-change" observer event no longer properly causes either a sync or  | 
                    |
| 2180 | 
                        +reload of the cookie database from disk after it is copied into place.  | 
                    |
| 2181 | 
                        +Torbutton currently works around this by issuing the SQLLite queries manually  | 
                    |
| 2182 | 
                        +to store and rebuild the cookie database.  | 
                    |
| 2183 | 
                        +  | 
                    |
| 2184 | 
                        + </para>  | 
                    |
| 2185 | 
                        + </listitem>  | 
                    |
| 2186 | 
                        +  | 
                    |
| 2187 | 
                        + <listitem><ulink  | 
                    |
| 2188 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=248970">Bug 248970 (PrivateBrowsing) - Private Browsing mode (global toggle for  | 
                    |
| 2189 | 
                        +saving/caching everything)</ulink>  | 
                    |
| 2190 | 
                        + <para>  | 
                    |
| 2191 | 
                        +  | 
                    |
| 2192 | 
                        +This bug catalogs the discussion of a 'Private Mode' in Firefox that would  | 
                    |
| 2193 | 
                        +perform many, but not all, of the activities of Torbutton. It would be useful  | 
                    |
| 2194 | 
                        +to leverage the resulting setting to simplify Torbutton. This bug is listed so  | 
                    |
| 2195 | 
                        +we can track this progress and ensure that it doesn't end up defining  | 
                    |
| 2196 | 
                        +behaviors contrary to and incompatible with Torbutton's requirements (though a  | 
                    |
| 2197 | 
                        +subset of the <link linkend="requirements">requirements</link> is of course fine).  | 
                    |
| 2198 | 
                        +  | 
                    |
| 2199 | 
                        + </para>  | 
                    |
| 2200 | 
                        + </listitem>  | 
                    |
| 2201 | 
                        +-->  | 
                    |
| 2202 | 
                        +  | 
                    |
| 2203 | 
                        +  | 
                    |
| 2204 | 
                        +  | 
                    |
| 2205 | 
                        + </orderedlist>  | 
                    |
| 2206 | 
                        + </sect2>  | 
                    |
| 2207 | 
                        + <sect2 id="FirefoxMiscBugs">  | 
                    |
| 2208 | 
                        + <title>Low Priority Bugs</title>  | 
                    |
| 2209 | 
                        + <para>  | 
                    |
| 2210 | 
                        +The following bugs have an effect upon Torbutton, but are superseded by more  | 
                    |
| 2211 | 
                        +practical and more easily fixable variant bugs above; or have stable, simple  | 
                    |
| 2212 | 
                        +workarounds.  | 
                    |
| 2213 | 
                        + </para>  | 
                    |
| 2214 | 
                        +  | 
                    |
| 2215 | 
                        + <orderedlist>  | 
                    |
| 2216 | 
                        + <listitem><ulink  | 
                    |
| 2217 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=435151">Bug 435151 - XPCSafeJSObjectWrapper breaks evalInSandbox</ulink>  | 
                    |
| 2218 | 
                        + <para>  | 
                    |
| 2219 | 
                        +  | 
                    |
| 2220 | 
                        +Under Firefox 3, the XPCSafeJSObjectWrapper breaks when you try to use  | 
                    |
| 2221 | 
                        +constructors of classes defined from within the scope of the sandbox, among  | 
                    |
| 2222 | 
                        +other things. This prevents Torbutton from applying the Timezone hooks under  | 
                    |
| 2223 | 
                        +Firefox 3, but a better solution for Torbutton's specific date hooking needs  | 
                    |
| 2224 | 
                        +would be a fix for the above mentioned Bug 392274. Of course, many more  | 
                    |
| 2225 | 
                        +extensions may be interested in the sandbox hooking functionality working  | 
                    |
| 2226 | 
                        +properly though.  | 
                    |
| 2227 | 
                        +  | 
                    |
| 2228 | 
                        + </para>  | 
                    |
| 2229 | 
                        + </listitem>  | 
                    |
| 2230 | 
                        + <listitem><ulink  | 
                    |
| 2231 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=440892">Bug 440892 -  | 
                    |
| 2232 | 
                        +network.protocol-handler.warn-external are ignored</ulink>  | 
                    |
| 2233 | 
                        + <para>  | 
                    |
| 2234 | 
                        +  | 
                    |
| 2235 | 
                        +Sometime in the Firefox 3 development cycle, the preferences that governed  | 
                    |
| 2236 | 
                        +warning a user when external apps were launched got disconnected from the code  | 
                    |
| 2237 | 
                        +that does the launching. Torbutton depended on these prefs to prevent websites  | 
                    |
| 2238 | 
                        +from launching specially crafted documents and application arguments that  | 
                    |
| 2239 | 
                        +caused Proxy Bypass. We currently work around this issue by <link  | 
                    |
| 2240 | 
                        +linkend="appblocker">wrapping the app launching components</link> to present a  | 
                    |
| 2241 | 
                        +popup before launching external apps while Tor is enabled. While this works,  | 
                    |
| 2242 | 
                        +it would be nice if these prefs were either fixed or removed.  | 
                    |
| 2243 | 
                        +  | 
                    |
| 2244 | 
                        + </para>  | 
                    |
| 2245 | 
                        + </listitem>  | 
                    |
| 2246 | 
                        + <listitem><ulink  | 
                    |
| 2247 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=437014">Bug 437014 -  | 
                    |
| 2248 | 
                        +nsIContentPolicy::shouldLoad no longer called for favicons</ulink>  | 
                    |
| 2249 | 
                        + <para>  | 
                    |
| 2250 | 
                        +  | 
                    |
| 2251 | 
                        +Firefox 3.0 stopped calling the shouldLoad call of content policy for favicon  | 
                    |
| 2252 | 
                        +loads. Torbutton had relied on this call to block favicon loads for opposite  | 
                    |
| 2253 | 
                        +Tor states. The workaround it employs for Firefox 3 is to cancel the request  | 
                    |
| 2254 | 
                        +when it arrives in the <command>torbutton_http_observer</command> used for  | 
                    |
| 2255 | 
                        +blocking full page plugin loads. This seems to work just fine, but is a bit  | 
                    |
| 2256 | 
                        +dirty.  | 
                    |
| 2257 | 
                        +  | 
                    |
| 2258 | 
                        + </para>  | 
                    |
| 2259 | 
                        + </listitem>  | 
                    |
| 2260 | 
                        +<!--  | 
                    |
| 2261 | 
                        + <listitem><ulink  | 
                    |
| 2262 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=437016">Bug 437016 -  | 
                    |
| 2263 | 
                        +nsIContentPolicy::shouldLoad not called for livemarks</ulink>  | 
                    |
| 2264 | 
                        + <para>  | 
                    |
| 2265 | 
                        +  | 
                    |
| 2266 | 
                        +An alternative fix for the livemarks bug above would be to block livemarks  | 
                    |
| 2267 | 
                        +fetches from the content policy. Unfortunately shouldLoad is not called for  | 
                    |
| 2268 | 
                        +livemarks fetches.  | 
                    |
| 2269 | 
                        +  | 
                    |
| 2270 | 
                        + </para>  | 
                    |
| 2271 | 
                        + </listitem>  | 
                    |
| 2272 | 
                        +-->  | 
                    |
| 2273 | 
                        + <listitem><ulink  | 
                    |
| 2274 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=418986">Bug 418986 - window.screen  | 
                    |
| 2275 | 
                        +provides a large amount of identifiable information</ulink>  | 
                    |
| 2276 | 
                        + <para>  | 
                    |
| 2277 | 
                        +  | 
                    |
| 2278 | 
                        +As <link linkend="fingerprinting">mentioned above</link>, a large amount of  | 
                    |
| 2279 | 
                        +information is available from <ulink  | 
                    |
| 2280 | 
                        +url="http://developer.mozilla.org/en/docs/DOM:window.screen">window.screen</ulink>.  | 
                    |
| 2281 | 
                        +Currently, there is no way to obscure this information without Javascript  | 
                    |
| 2282 | 
                        +hooking. This bug is a feature request to provide some other method to change  | 
                    |
| 2283 | 
                        +these values.  | 
                    |
| 2284 | 
                        +  | 
                    |
| 2285 | 
                        + </para>  | 
                    |
| 2286 | 
                        + </listitem>  | 
                    |
| 2287 | 
                        +  | 
                    |
| 2288 | 
                        + <listitem><ulink  | 
                    |
| 2289 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=309524">Bug 309524</ulink>  | 
                    |
| 2290 | 
                        +and <ulink url="https://bugzilla.mozilla.org/show_bug.cgi?id=380556">Bug  | 
                    |
| 2291 | 
                        +380556</ulink> - nsIContentPolicy::shouldProcess is not called.  | 
                    |
| 2292 | 
                        + <para>  | 
                    |
| 2293 | 
                        +  | 
                    |
| 2294 | 
                        +This is a call that would be useful to develop a better workaround for the  | 
                    |
| 2295 | 
                        +allowPlugins issue above. If the content policy were called before a URL was  | 
                    |
| 2296 | 
                        +handed over to a plugin or helper app, it would make the workaround for the  | 
                    |
| 2297 | 
                        +above allowPlugins bug a lot cleaner. Obviously this bug is not as severe as  | 
                    |
| 2298 | 
                        +the others though, but it might be nice to have this API as a backup.  | 
                    |
| 2299 | 
                        +  | 
                    |
| 2300 | 
                        + </para>  | 
                    |
| 2301 | 
                        + </listitem>  | 
                    |
| 2302 | 
                        +  | 
                    |
| 2303 | 
                        + <listitem><ulink  | 
                    |
| 2304 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=401296">Bug 401296 - docShell.allowPlugins  | 
                    |
| 2305 | 
                        +not honored for direct links</ulink> (Perhaps subset of <ulink  | 
                    |
| 2306 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=282106">Bug 282106</ulink>?)  | 
                    |
| 2307 | 
                        + <para>  | 
                    |
| 2308 | 
                        +  | 
                    |
| 2309 | 
                        +Similar to the javascript plugin disabling attribute, the plugin disabling  | 
                    |
| 2310 | 
                        +attribute is also not perfect — it is ignored for direct links to plugin  | 
                    |
| 2311 | 
                        +handled content, as well as meta-refreshes to plugin handled content. This  | 
                    |
| 2312 | 
                        +requires Torbutton to listen to a number of different http events to intercept  | 
                    |
| 2313 | 
                        +plugin-related mime type URLs and cancel their requests. Again, since plugins  | 
                    |
| 2314 | 
                        +are quite horrible about obeying proxy settings, loading a plugin pretty much  | 
                    |
| 2315 | 
                        +ensures a way to break the <link linkend="isolation">Network Isolation</link>  | 
                    |
| 2316 | 
                        +requirement and reveal a user's original IP address. Torbutton's code to  | 
                    |
| 2317 | 
                        +perform this workaround has been subverted at least once already by Kyle  | 
                    |
| 2318 | 
                        +Williams.  | 
                    |
| 2319 | 
                        +  | 
                    |
| 2320 | 
                        + </para>  | 
                    |
| 2321 | 
                        + </listitem>  | 
                    |
| 2322 | 
                        + <listitem><ulink  | 
                    |
| 2323 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=448747">Bug 448747 -  | 
                    |
| 2324 | 
                        +Provide Mechanism to clear TLS Session IDs</ulink>  | 
                    |
| 2325 | 
                        + <para>  | 
                    |
| 2326 | 
                        +  | 
                    |
| 2327 | 
                        +As <link linkend="browseroverlay">mentioned above</link>, Torbutton currently  | 
                    |
| 2328 | 
                        +toggles <command>security.enable_ssl2</command> to clear the SSL  | 
                    |
| 2329 | 
                        +Session ID cache via the pref observer at <ulink  | 
                    |
| 2330 | 
                        +url="http://mxr.mozilla.org/security/source/security/manager/ssl/src/nsNSSComponent.cpp#2134">nsNSSComponent.cpp  | 
                    |
| 2331 | 
                        +line 2134</ulink>. This is an arcane and potentially fragile fix. It would be  | 
                    |
| 2332 | 
                        +better if there were a more standard interface for accomplishing the same  | 
                    |
| 2333 | 
                        +thing.  | 
                    |
| 2334 | 
                        +  | 
                    |
| 2335 | 
                        + </para>  | 
                    |
| 2336 | 
                        + </listitem>  | 
                    |
| 2337 | 
                        +  | 
                    |
| 2338 | 
                        + <listitem><ulink  | 
                    |
| 2339 | 
                        +url="https://bugzilla.mozilla.org/show_bug.cgi?id=419598">Bug 419598 - 'var  | 
                    |
| 2340 | 
                        +Date' is deletable</ulink>  | 
                    |
| 2341 | 
                        + <para>  | 
                    |
| 2342 | 
                        +  | 
                    |
| 2343 | 
                        +Based on Page 62 of the <ulink  | 
                    |
| 2344 | 
                        +url="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf">ECMA-262  | 
                    |
| 2345 | 
                        +Javascript spec</ulink>, it seems like it should be possible to do something  | 
                    |
| 2346 | 
                        +like the following to prevent the Date object from being unmasked:  | 
                    |
| 2347 | 
                        +<screen>  | 
                    |
| 2348 | 
                        +with(window) {
                       | 
                    |
| 2349 | 
                        + var Date = fakeDate;  | 
                    |
| 2350 | 
                        + var otherVariable = 42;  | 
                    |
| 2351 | 
                        +}  | 
                    |
| 2352 | 
                        +  | 
                    |
| 2353 | 
                        +delete window.Date; // Should fail. Instead succeeds, revealing original Date.  | 
                    |
| 2354 | 
                        +delete window.otherVariable; // Fails, leaving window.otherVariable set to 42.  | 
                    |
| 2355 | 
                        +</screen>  | 
                    |
| 2356 | 
                        +  | 
                    |
| 2357 | 
                        +From the ECMA-262 spec:  | 
                    |
| 2358 | 
                        +  | 
                    |
| 2359 | 
                        +<blockquote>  | 
                    |
| 2360 | 
                        +If the variable statement occurs inside a FunctionDeclaration, the variables  | 
                    |
| 2361 | 
                        +are defined with function-local scope in that function, as described in  | 
                    |
| 2362 | 
                        +s10.1.3. Otherwise, they are defined with global scope (that is, they are  | 
                    |
| 2363 | 
                        +created as members of the global object, as described in 10.1.3) using  | 
                    |
| 2364 | 
                        +property attributes { DontDelete }. Variables are created when the execution
                       | 
                    |
| 2365 | 
                        +scope is entered. A Block does not define a new execution scope. Only Program  | 
                    |
| 2366 | 
                        +and FunctionDeclaration produce a new scope. Variables are initialized to  | 
                    |
| 2367 | 
                        +undefined when created. A variable with an Initialiser is assigned the value  | 
                    |
| 2368 | 
                        +of its AssignmentExpression when the VariableStatement is executed, not when  | 
                    |
| 2369 | 
                        +the variable is created.  | 
                    |
| 2370 | 
                        +</blockquote>  | 
                    |
| 2371 | 
                        +  | 
                    |
| 2372 | 
                        +In fact, this is exactly how the with statement with a variable declaration  | 
                    |
| 2373 | 
                        +behaves <emphasis>for all other variables other than ones that shadow system  | 
                    |
| 2374 | 
                        +variables</emphasis>. Some variables (such as  | 
                    |
| 2375 | 
                        +<command>window.screen</command>, and <command>window.history</command>) can't  | 
                    |
| 2376 | 
                        +even be shadowed in this way, and give an error about lacking a setter. If  | 
                    |
| 2377 | 
                        +such shadowing were possible, it would greatly simplify the Javascript hooking  | 
                    |
| 2378 | 
                        +code, which currently relies on undocumented semantics of  | 
                    |
| 2379 | 
                        +<command>__proto__</command> to copy the original values in the event of a  | 
                    |
| 2380 | 
                        +delete. This <command>__proto__</command> hack unfortunately does not work for  | 
                    |
| 2381 | 
                        +the Date object though.  | 
                    |
| 2382 | 
                        +  | 
                    |
| 2383 | 
                        + </para>  | 
                    |
| 2384 | 
                        + </listitem>  | 
                    |
| 2385 | 
                        +  | 
                    |
| 2386 | 
                        + </orderedlist>  | 
                    |
| 2387 | 
                        + </sect2>  | 
                    |
| 2388 | 
                        +</sect1>  | 
                    |
| 2389 | 
                        +  | 
                    |
| 2390 | 
                        +<sect1 id="TestPlan">  | 
                    |
| 2391 | 
                        + <title>Testing</title>  | 
                    |
| 2392 | 
                        + <para>  | 
                    |
| 2393 | 
                        +  | 
                    |
| 2394 | 
                        +The purpose of this section is to cover all the known ways that Tor browser  | 
                    |
| 2395 | 
                        +security can be subverted from a penetration testing perspective. The hope  | 
                    |
| 2396 | 
                        +is that it will be useful both for creating a "Tor Safety Check"  | 
                    |
| 2397 | 
                        +page, and for developing novel tests and actively attacking Torbutton with the  | 
                    |
| 2398 | 
                        +goal of finding vulnerabilities in either it or the Mozilla components,  | 
                    |
| 2399 | 
                        +interfaces and settings upon which it relies.  | 
                    |
| 2400 | 
                        +  | 
                    |
| 2401 | 
                        + </para>  | 
                    |
| 2402 | 
                        + <sect2 id="SingleStateTesting">  | 
                    |
| 2403 | 
                        + <title>Single state testing</title>  | 
                    |
| 2404 | 
                        + <para>  | 
                    |
| 2405 | 
                        +  | 
                    |
| 2406 | 
                        +Torbutton is a complicated piece of software. During development, changes to  | 
                    |
| 2407 | 
                        +one component can affect a whole slough of unrelated features. A number of  | 
                    |
| 2408 | 
                        +aggregated test suites exist that can be used to test for regressions in  | 
                    |
| 2409 | 
                        +Torbutton and to help aid in the development of Torbutton-like addons and  | 
                    |
| 2410 | 
                        +other privacy modifications of other browsers. Some of these test suites exist  | 
                    |
| 2411 | 
                        +as a single automated page, while others are a series of pages you must visit  | 
                    |
| 2412 | 
                        +individually. They are provided here for reference and future regression  | 
                    |
| 2413 | 
                        +testing, and also in the hope that some brave soul will one day decide to  | 
                    |
| 2414 | 
                        +combine them into a comprehensive automated test suite.  | 
                    |
| 2415 | 
                        +  | 
                    |
| 2416 | 
                        + <orderedlist>  | 
                    |
| 2417 | 
                        + <listitem><ulink url="http://decloak.net/">Decloak.net</ulink>  | 
                    |
| 2418 | 
                        + <para>  | 
                    |
| 2419 | 
                        +  | 
                    |
| 2420 | 
                        +Decloak.net is the canonical source of plugin and external-application based  | 
                    |
| 2421 | 
                        +proxy-bypass exploits. It is a fully automated test suite maintained by <ulink  | 
                    |
| 2422 | 
                        +url="http://digitaloffense.net/">HD Moore</ulink> as a service for people to  | 
                    |
| 2423 | 
                        +use to test their anonymity systems.  | 
                    |
| 2424 | 
                        +  | 
                    |
| 2425 | 
                        + </para>  | 
                    |
| 2426 | 
                        + </listitem>  | 
                    |
| 2427 | 
                        + <listitem><ulink url="http://deanonymizer.com/">Deanonymizer.com</ulink>  | 
                    |
| 2428 | 
                        + <para>  | 
                    |
| 2429 | 
                        +  | 
                    |
| 2430 | 
                        +Deanonymizer.com is another automated test suite that tests for proxy bypass  | 
                    |
| 2431 | 
                        +and other information disclosure vulnerabilities. It is maintained by Kyle  | 
                    |
| 2432 | 
                        +Williams, the author of <ulink url="http://www.janusvm.com/">JanusVM</ulink>  | 
                    |
| 2433 | 
                        +and <ulink url="http://www.januspa.com/">JanusPA</ulink>.  | 
                    |
| 2434 | 
                        +  | 
                    |
| 2435 | 
                        + </para>  | 
                    |
| 2436 | 
                        + </listitem>  | 
                    |
| 2437 | 
                        + <listitem><ulink url="https://www.jondos.de/en/anontest">JonDos  | 
                    |
| 2438 | 
                        +AnonTest</ulink>  | 
                    |
| 2439 | 
                        + <para>  | 
                    |
| 2440 | 
                        +  | 
                    |
| 2441 | 
                        +The <ulink url="https://www.jondos.de">JonDos people</ulink> also provide an  | 
                    |
| 2442 | 
                        +anonymity tester. It is more focused on HTTP headers than plugin bypass, and  | 
                    |
| 2443 | 
                        +points out a couple of headers Torbutton could do a better job with  | 
                    |
| 2444 | 
                        +obfuscating.  | 
                    |
| 2445 | 
                        +  | 
                    |
| 2446 | 
                        + </para>  | 
                    |
| 2447 | 
                        + </listitem>  | 
                    |
| 2448 | 
                        + <listitem><ulink url="http://browserspy.dk">Browserspy.dk</ulink>  | 
                    |
| 2449 | 
                        + <para>  | 
                    |
| 2450 | 
                        +  | 
                    |
| 2451 | 
                        +Browserspy.dk provides a tremendous collection of browser fingerprinting and  | 
                    |
| 2452 | 
                        +general privacy tests. Unfortunately they are only available one page at a  | 
                    |
| 2453 | 
                        +time, and there is not really solid feedback on good vs bad behavior in  | 
                    |
| 2454 | 
                        +the test results.  | 
                    |
| 2455 | 
                        +  | 
                    |
| 2456 | 
                        + </para>  | 
                    |
| 2457 | 
                        + </listitem>  | 
                    |
| 2458 | 
                        + <listitem><ulink url="http://analyze.privacy.net/">Privacy  | 
                    |
| 2459 | 
                        +Analyzer</ulink>  | 
                    |
| 2460 | 
                        + <para>  | 
                    |
| 2461 | 
                        +  | 
                    |
| 2462 | 
                        +The Privacy Analyzer provides a dump of all sorts of browser attributes and  | 
                    |
| 2463 | 
                        +settings that it detects, including some information on your origin IP  | 
                    |
| 2464 | 
                        +address. Its page layout and lack of good vs bad test result feedback makes it  | 
                    |
| 2465 | 
                        +not as useful as a user-facing testing tool, but it does provide some  | 
                    |
| 2466 | 
                        +interesting checks in a single page.  | 
                    |
| 2467 | 
                        +  | 
                    |
| 2468 | 
                        + </para>  | 
                    |
| 2469 | 
                        + </listitem>  | 
                    |
| 2470 | 
                        + <listitem><ulink url="http://ha.ckers.org/mr-t/">Mr. T</ulink>  | 
                    |
| 2471 | 
                        + <para>  | 
                    |
| 2472 | 
                        +  | 
                    |
| 2473 | 
                        +Mr. T is a collection of browser fingerprinting and deanonymization exploits  | 
                    |
| 2474 | 
                        +discovered by the <ulink url="http://ha.ckers.org">ha.ckers.org</ulink> crew  | 
                    |
| 2475 | 
                        +and others. It is also not as user friendly as some of the above tests, but it  | 
                    |
| 2476 | 
                        +is a useful collection.  | 
                    |
| 2477 | 
                        +  | 
                    |
| 2478 | 
                        + </para>  | 
                    |
| 2479 | 
                        + </listitem>  | 
                    |
| 2480 | 
                        + <listitem>Gregory Fleischer's <ulink  | 
                    |
| 2481 | 
                        +url="http://pseudo-flaw.net/content/tor/torbutton/">Torbutton</ulink> and  | 
                    |
| 2482 | 
                        +<ulink  | 
                    |
| 2483 | 
                        +url="http://pseudo-flaw.net/content/defcon/dc-17-demos/d.html">Defcon  | 
                    |
| 2484 | 
                        +17</ulink> Test Cases  | 
                    |
| 2485 | 
                        + <para>  | 
                    |
| 2486 | 
                        +  | 
                    |
| 2487 | 
                        +Gregory Fleischer has been hacking and testing Firefox and Torbutton privacy  | 
                    |
| 2488 | 
                        +issues for the past 2 years. He has an excellent collection of all his test  | 
                    |
| 2489 | 
                        +cases that can be used for regression testing. In his Defcon work, he  | 
                    |
| 2490 | 
                        +demonstrates ways to infer Firefox version based on arcane browser properties.  | 
                    |
| 2491 | 
                        +We are still trying to determine the best way to address some of those test  | 
                    |
| 2492 | 
                        +cases.  | 
                    |
| 2493 | 
                        +  | 
                    |
| 2494 | 
                        + </para>  | 
                    |
| 2495 | 
                        + </listitem>  | 
                    |
| 2496 | 
                        + <listitem><ulink url="https://torcheck.xenobite.eu/index.php">Xenobite's  | 
                    |
| 2497 | 
                        +TorCheck Page</ulink>  | 
                    |
| 2498 | 
                        + <para>  | 
                    |
| 2499 | 
                        +  | 
                    |
| 2500 | 
                        +This page checks to ensure you are using a valid Tor exit node and checks for  | 
                    |
| 2501 | 
                        +some basic browser properties related to privacy. It is not very fine-grained  | 
                    |
| 2502 | 
                        +or complete, but it is automated and could be turned into something useful  | 
                    |
| 2503 | 
                        +with a bit of work.  | 
                    |
| 2504 | 
                        +  | 
                    |
| 2505 | 
                        + </para>  | 
                    |
| 2506 | 
                        + </listitem>  | 
                    |
| 2507 | 
                        + </orderedlist>  | 
                    |
| 2508 | 
                        + </para>  | 
                    |
| 2509 | 
                        + </sect2>  | 
                    |
| 2510 | 
                        + <sect2>  | 
                    |
| 2511 | 
                        + <title>Multi-state testing</title>  | 
                    |
| 2512 | 
                        + <para>  | 
                    |
| 2513 | 
                        +  | 
                    |
| 2514 | 
                        +The tests in this section are geared towards a page that would instruct the  | 
                    |
| 2515 | 
                        +user to toggle their Tor state after the fetch and perform some operations:  | 
                    |
| 2516 | 
                        +mouseovers, stray clicks, and potentially reloads.  | 
                    |
| 2517 | 
                        +  | 
                    |
| 2518 | 
                        + </para>  | 
                    |
| 2519 | 
                        + <sect3>  | 
                    |
| 2520 | 
                        + <title>Cookies and Cache Correlation</title>  | 
                    |
| 2521 | 
                        + <para>  | 
                    |
| 2522 | 
                        +The most obvious test is to set a cookie, ask the user to toggle tor, and then  | 
                    |
| 2523 | 
                        +have them reload the page. The cookie should no longer be set if they are  | 
                    |
| 2524 | 
                        +using the default Torbutton settings. In addition, it is possible to leverage  | 
                    |
| 2525 | 
                        +the cache to <ulink  | 
                    |
| 2526 | 
                        +url="http://crypto.stanford.edu/sameorigin/safecachetest.html">store unique  | 
                    |
| 2527 | 
                        +identifiers</ulink>. The default settings of Torbutton should also protect  | 
                    |
| 2528 | 
                        +against these from persisting across Tor Toggle.  | 
                    |
| 2529 | 
                        +  | 
                    |
| 2530 | 
                        + </para>  | 
                    |
| 2531 | 
                        + </sect3>  | 
                    |
| 2532 | 
                        + <sect3>  | 
                    |
| 2533 | 
                        + <title>Javascript timers and event handlers</title>  | 
                    |
| 2534 | 
                        + <para>  | 
                    |
| 2535 | 
                        +  | 
                    |
| 2536 | 
                        +Javascript can set timers and register event handlers in the hopes of fetching  | 
                    |
| 2537 | 
                        +URLs after the user has toggled Torbutton.  | 
                    |
| 2538 | 
                        + </para>  | 
                    |
| 2539 | 
                        + </sect3>  | 
                    |
| 2540 | 
                        + <sect3>  | 
                    |
| 2541 | 
                        + <title>CSS Popups and non-script Dynamic Content</title>  | 
                    |
| 2542 | 
                        + <para>  | 
                    |
| 2543 | 
                        +  | 
                    |
| 2544 | 
                        +Even if Javascript is disabled, CSS is still able to  | 
                    |
| 2545 | 
                        +<ulink url="http://www.tjkdesign.com/articles/css%20pop%20ups/">create popup-like  | 
                    |
| 2546 | 
                        +windows</ulink>  | 
                    |
| 2547 | 
                        +via the 'onmouseover' CSS attribute, which can cause arbitrary browser  | 
                    |
| 2548 | 
                        +activity as soon as the mouse enters into the content window. It is also  | 
                    |
| 2549 | 
                        +possible for meta-refresh tags to set timers long enough to make it likely  | 
                    |
| 2550 | 
                        +that the user has toggled Tor before fetching content.  | 
                    |
| 2551 | 
                        +  | 
                    |
| 2552 | 
                        + </para>  | 
                    |
| 2553 | 
                        + </sect3>  | 
                    |
| 2554 | 
                        + </sect2>  | 
                    |
| 2555 | 
                        + <sect2 id="HackTorbutton">  | 
                    |
| 2556 | 
                        + <title>Active testing (aka How to Hack Torbutton)</title>  | 
                    |
| 2557 | 
                        + <para>  | 
                    |
| 2558 | 
                        +  | 
                    |
| 2559 | 
                        +The idea behind active testing is to discover vulnerabilities in Torbutton to  | 
                    |
| 2560 | 
                        +bypass proxy settings, run script in an opposite Tor state, store unique  | 
                    |
| 2561 | 
                        +identifiers, leak location information, or otherwise violate <link  | 
                    |
| 2562 | 
                        +linkend="requirements">its requirements</link>. Torbutton has ventured out  | 
                    |
| 2563 | 
                        +into a strange and new security landscape. It depends on Firefox mechanisms  | 
                    |
| 2564 | 
                        +that haven't necessarily been audited for security, certainly not for the  | 
                    |
| 2565 | 
                        +threat model that Torbutton seeks to address. As such, it and the interfaces  | 
                    |
| 2566 | 
                        +it depends upon still need a 'trial by fire' typical of new technologies. This  | 
                    |
| 2567 | 
                        +section of the document was written with the intention of making that period  | 
                    |
| 2568 | 
                        +as fast as possible. Please help us get through this period by considering  | 
                    |
| 2569 | 
                        +these attacks, playing with them, and reporting what you find (and potentially  | 
                    |
| 2570 | 
                        +submitting the test cases back to be run in the standard batch of Torbutton  | 
                    |
| 2571 | 
                        +tests.  | 
                    |
| 2572 | 
                        +  | 
                    |
| 2573 | 
                        + </para>  | 
                    |
| 2574 | 
                        + <sect3>  | 
                    |
| 2575 | 
                        + <title>Some suggested vectors to investigate</title>  | 
                    |
| 2576 | 
                        + <para>  | 
                    |
| 2577 | 
                        + <itemizedlist>  | 
                    |
| 2578 | 
                        + <listitem>Strange ways to register Javascript <ulink  | 
                    |
| 2579 | 
                        +url="http://en.wikipedia.org/wiki/DOM_Events">events</ulink> and <ulink  | 
                    |
| 2580 | 
                        +url="http://www.devshed.com/c/a/JavaScript/Using-Timers-in-JavaScript/">timeouts</ulink> should  | 
                    |
| 2581 | 
                        +be verified to actually be ineffective after Tor has been toggled.</listitem>  | 
                    |
| 2582 | 
                        + <listitem>Other ways to cause Javascript to be executed after  | 
                    |
| 2583 | 
                        +<command>javascript.enabled</command> has been toggled off.</listitem>  | 
                    |
| 2584 | 
                        + <listitem>Odd ways to attempt to load plugins. Kyle Williams has had  | 
                    |
| 2585 | 
                        +some success with direct loads/meta-refreshes of plugin-handled URLs.</listitem>  | 
                    |
| 2586 | 
                        + <listitem>The Date and Timezone hooks should be verified to work with  | 
                    |
| 2587 | 
                        +crazy combinations of iframes, nested iframes, iframes in frames, frames in  | 
                    |
| 2588 | 
                        +iframes, and popups being loaded and  | 
                    |
| 2589 | 
                        +reloaded in rapid succession, and/or from one another. Think race conditions and deep,  | 
                    |
| 2590 | 
                        +parallel nesting, involving iframes from both <ulink  | 
                    |
| 2591 | 
                        +url="http://en.wikipedia.org/wiki/Same_origin_policy">same-origin and  | 
                    |
| 2592 | 
                        +non-same-origin</ulink> domains.</listitem>  | 
                    |
| 2593 | 
                        + <listitem>In addition, there may be alternate ways and other  | 
                    |
| 2594 | 
                        +methods to query the timezone, or otherwise use some of the Date object's  | 
                    |
| 2595 | 
                        +methods in combination to deduce the timezone offset. Of course, the author  | 
                    |
| 2596 | 
                        +tried his best to cover all the methods he could foresee, but it's always good  | 
                    |
| 2597 | 
                        +to have another set of eyes try it out.</listitem>  | 
                    |
| 2598 | 
                        + <listitem>Similarly, is there any way to confuse the <link  | 
                    |
| 2599 | 
                        +linkend="contentpolicy">content policy</link>  | 
                    |
| 2600 | 
                        +mentioned above to cause it to allow certain types of page fetches? For  | 
                    |
| 2601 | 
                        +example, it was recently discovered that favicons are not fetched by the  | 
                    |
| 2602 | 
                        +content, but the chrome itself, hence the content policy did not look up the  | 
                    |
| 2603 | 
                        +correct window to determine the current Tor tag for the favicon fetch. Are  | 
                    |
| 2604 | 
                        +there other things that can do this? Popups? Bookmarklets? Active bookmarks? </listitem>  | 
                    |
| 2605 | 
                        + <listitem>Alternate ways to store and fetch unique identifiers. For example, <ulink  | 
                    |
| 2606 | 
                        +url="http://developer.mozilla.org/en/docs/DOM:Storage">DOM Storage</ulink>  | 
                    |
| 2607 | 
                        +caught us off guard.  | 
                    |
| 2608 | 
                        +It was  | 
                    |
| 2609 | 
                        +also discovered by <ulink url="http://pseudo-flaw.net">Gregory  | 
                    |
| 2610 | 
                        +Fleischer</ulink> that <ulink  | 
                    |
| 2611 | 
                        +url="http://pseudo-flaw.net/content/tor/torbutton/">content window access to  | 
                    |
| 2612 | 
                        +chrome</ulink> can be used to build <link linkend="fingerprinting">unique  | 
                    |
| 2613 | 
                        +identifiers</link>.  | 
                    |
| 2614 | 
                        +Are there any other  | 
                    |
| 2615 | 
                        +arcane or experimental ways that Firefox provides to create and store unique  | 
                    |
| 2616 | 
                        +identifiers? Or perhaps unique identifiers can be queried or derived from  | 
                    |
| 2617 | 
                        +properties of the machine/browser that Javascript has access to? How unique  | 
                    |
| 2618 | 
                        +can these identifiers be?  | 
                    |
| 2619 | 
                        + </listitem>  | 
                    |
| 2620 | 
                        + <listitem>Is it possible to get the browser to write some history to disk  | 
                    |
| 2621 | 
                        +(aside from swap) that can be retrieved later? By default, Torbutton should  | 
                    |
| 2622 | 
                        +write no history, cookie, or other browsing activity information to the  | 
                    |
| 2623 | 
                        +harddisk.</listitem>  | 
                    |
| 2624 | 
                        + <listitem>Do popup windows make it easier to break any of the above  | 
                    |
| 2625 | 
                        +behavior? Are javascript events still canceled in popups? What about recursive  | 
                    |
| 2626 | 
                        +popups from Javascript, data, and other funky URL types? What about CSS  | 
                    |
| 2627 | 
                        +popups? Are they still blocked after Tor is toggled?</listitem>  | 
                    |
| 2628 | 
                        + <listitem>Chrome-escalation attacks. The interaction between the  | 
                    |
| 2629 | 
                        +Torbutton chrome Javascript and the client content window javascript is pretty  | 
                    |
| 2630 | 
                        +well-defined and carefully constructed, but perhaps there is a way to smuggle  | 
                    |
| 2631 | 
                        +javascript back in a return value, or otherwise inject network-loaded  | 
                    |
| 2632 | 
                        +javascript into the chrome (and thus gain complete control of the browser).  | 
                    |
| 2633 | 
                        +</listitem>  | 
                    |
| 2634 | 
                        +</itemizedlist>  | 
                    |
| 2635 | 
                        +  | 
                    |
| 2636 | 
                        + </para>  | 
                    |
| 2637 | 
                        + </sect3>  | 
                    |
| 2638 | 
                        + </sect2>  | 
                    |
| 2639 | 
                        +</sect1>  | 
                    |
| 2640 | 
                        +</article>  | 
                    
| ... | ... | 
                      @@ -0,0 +1,1434 @@  | 
                  
| 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">  | 
                    |
| 3 | 
                        +<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Torbutton Design Documentation</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2" /></head><body><div class="article" title="Torbutton Design Documentation"><div class="titlepage"><div><div><h2 class="title"><a id="design"></a>Torbutton Design Documentation</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.fscked/org">mikeperry.fscked/org</a>></code></p></div></div></div></div><div><p class="pubdate">Dec 15 2009</p></div></div><hr /></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#id2510984">1. Introduction</a></span></dt><dd><dl><dt><span class="sect2"><a href="#adversary">1.1. Adversary Model</a></span></dt><dt><span class="sect2"><a href="#requirements">1.2. Torbutton Requirements</a></span></dt><dt><span class="sect2"><a href="#layout">1.3. Extension Layout</a></span></dt></dl></dd><dt><span class="sect1"><a href="#id2541734">2. Components</a></span></dt><dd><dl><dt><span class="sect2"><a href="#id2509118">2.1. Hooked Components</a></span></dt><dt><span class="sect2"><a href="#id2513073">2.2. New Components</a></span></dt></dl></dd><dt><span class="sect1"><a href="#id2511168">3. Chrome</a></span></dt><dd><dl><dt><span class="sect2"><a href="#browseroverlay">3.1. Browser Overlay - torbutton.xul</a></span></dt><dt><span class="sect2"><a href="#id2521151">3.2. Preferences Window - preferences.xul</a></span></dt><dt><span class="sect2"><a href="#id2524897">3.3. Other Windows</a></span></dt></dl></dd><dt><span class="sect1"><a href="#id2538737">4. Toggle Code Path</a></span></dt><dd><dl><dt><span class="sect2"><a href="#id2519814">4.1. Button Click</a></span></dt><dt><span class="sect2"><a href="#id2519526">4.2. Proxy Update</a></span></dt><dt><span class="sect2"><a href="#id2504564">4.3. Settings Update</a></span></dt></dl></dd><dt><span class="sect1"><a href="#id2519462">5. Description of Options</a></span></dt><dd><dl><dt><span class="sect2"><a href="#id2542642">5.1. Test Settings</a></span></dt><dt><span class="sect2"><a href="#plugins">5.2. Disable plugins on Tor Usage (crucial)</a></span></dt><dt><span class="sect2"><a href="#id2536168">5.3. Isolate Dynamic Content to Tor State (crucial)</a></span></dt><dt><span class="sect2"><a href="#jshooks">5.4. Hook Dangerous Javascript</a></span></dt><dt><span class="sect2"><a href="#id2530601">5.5. Resize windows to multiples of 50px during Tor usage (recommended)</a></span></dt><dt><span class="sect2"><a href="#id2513266">5.6. Disable Updates During Tor</a></span></dt><dt><span class="sect2"><a href="#id2505201">5.7. Disable Search Suggestions during Tor (recommended)</a></span></dt><dt><span class="sect2"><a href="#id2505239">5.8. Disable livemarks updates during Tor usage (recommended)</a></span></dt><dt><span class="sect2"><a href="#id2505311">5.9. Block Tor/Non-Tor access to network from file:// urls (recommended)</a></span></dt><dt><span class="sect2"><a href="#id2505383">5.10. Close all Tor/Non-Tor tabs and windows on toggle (optional)</a></span></dt><dt><span class="sect2"><a href="#id2505464">5.11. Isolate Access to History navigation to Tor state (crucial)</a></span></dt><dt><span class="sect2"><a href="#id2505548">5.12. History Access Settings</a></span></dt><dt><span class="sect2"><a href="#id2505661">5.13. Clear History During Tor Toggle (optional)</a></span></dt><dt><span class="sect2"><a href="#id2505706">5.14. Block Password+Form saving during Tor/Non-Tor</a></span></dt><dt><span class="sect2"><a href="#id2547259">5.15. Block Tor disk cache and clear all cache on Tor Toggle</a></span></dt><dt><span class="sect2"><a href="#id2547309">5.16. Block disk and memory cache during Tor</a></span></dt><dt><span class="sect2"><a href="#id2547362">5.17. Clear Cookies on Tor Toggle</a></span></dt><dt><span class="sect2"><a href="#id2547413">5.18. Store Non-Tor cookies in a protected jar</a></span></dt><dt><span class="sect2"><a href="#id2547469">5.19. Store both Non-Tor and Tor cookies in a protected jar (dangerous)</a></span></dt><dt><span class="sect2"><a href="#id2547508">5.20. Manage My Own Cookies (dangerous)</a></span></dt><dt><span class="sect2"><a href="#id2547523">5.21. Disable DOM Storage during Tor usage (crucial)</a></span></dt><dt><span class="sect2"><a href="#id2547627">5.22. Clear HTTP Auth on Tor Toggle (recommended)</a></span></dt><dt><span class="sect2"><a href="#id2547664">5.23. Clear cookies on Tor/Non-Tor shutdown</a></span></dt><dt><span class="sect2"><a href="#id2547718">5.24. Reload cookie jar/clear cookies on Firefox crash</a></span></dt><dt><span class="sect2"><a href="#id2547794">5.25. On crash recovery or session restored startup, restore via: Tor, Non-Tor</a></span></dt><dt><span class="sect2"><a href="#id2547866">5.26. On normal startup, set state to: Tor, Non-Tor, Shutdown State</a></span></dt><dt><span class="sect2"><a href="#id2547925">5.27. Prevent session store from saving Non-Tor/Tor-loaded tabs</a></span></dt><dt><span class="sect2"><a href="#id2547990">5.28. Set user agent during Tor usage (crucial)</a></span></dt><dt><span class="sect2"><a href="#id2548164">5.29. Spoof US English Browser</a></span></dt><dt><span class="sect2"><a href="#id2548257">5.30. Don't send referrer during Tor Usage</a></span></dt><dt><span class="sect2"><a href="#id2548297">5.31. Store SSL/CA Certs in separate jars for Tor/Non-Tor (recommended)</a></span></dt></dl></dd><dt><span class="sect1"><a href="#FirefoxBugs">6. Relevant Firefox Bugs</a></span></dt><dd><dl><dt><span class="sect2"><a href="#FirefoxSecurity">6.1. Bugs impacting security</a></span></dt><dt><span class="sect2"><a href="#FirefoxWishlist">6.2. Bugs blocking functionality</a></span></dt><dt><span class="sect2"><a href="#FirefoxMiscBugs">6.3. Low Priority Bugs</a></span></dt></dl></dd><dt><span class="sect1"><a href="#TestPlan">7. Testing</a></span></dt><dd><dl><dt><span class="sect2"><a href="#SingleStateTesting">7.1. Single state testing</a></span></dt><dt><span class="sect2"><a href="#id2549304">7.2. Multi-state testing</a></span></dt><dt><span class="sect2"><a href="#HackTorbutton">7.3. Active testing (aka How to Hack Torbutton)</a></span></dt></dl></dd></dl></div><div class="sect1" title="1. Introduction"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2510984"></a>1. Introduction</h2></div></div></div><p>  | 
                    |
| 4 | 
                        +  | 
                    |
| 5 | 
                        +This document describes the goals, operation, and testing procedures of the  | 
                    |
| 6 | 
                        +Torbutton Firefox extension. It is current as of Torbutton 1.2.4.  | 
                    |
| 7 | 
                        +  | 
                    |
| 8 | 
                        + </p><div class="sect2" title="1.1. Adversary Model"><div class="titlepage"><div><div><h3 class="title"><a id="adversary"></a>1.1. Adversary Model</h3></div></div></div><p>  | 
                    |
| 9 | 
                        +  | 
                    |
| 10 | 
                        +A Tor web browser adversary has a number of goals, capabilities, and attack  | 
                    |
| 11 | 
                        +types that can be used to guide us towards a set of requirements for the  | 
                    |
| 12 | 
                        +Torbutton extension. Let's start with the goals.  | 
                    |
| 13 | 
                        +  | 
                    |
| 14 | 
                        + </p><div class="sect3" title="Adversary Goals"><div class="titlepage"><div><div><h4 class="title"><a id="adversarygoals"></a>Adversary Goals</h4></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Bypassing proxy settings</strong></span><p>The adversary's primary goal is direct compromise and bypass of  | 
                    |
| 15 | 
                        +Tor, causing the user to directly connect to an IP of the adversary's  | 
                    |
| 16 | 
                        +choosing.</p></li><li class="listitem"><span class="command"><strong>Correlation of Tor vs Non-Tor Activity</strong></span><p>If direct proxy bypass is not possible, the adversary will likely  | 
                    |
| 17 | 
                        +happily settle for the ability to correlate something a user did via Tor with  | 
                    |
| 18 | 
                        +their non-Tor activity. This can be done with cookies, cache identifiers,  | 
                    |
| 19 | 
                        +javascript events, and even CSS. Sometimes the fact that a user uses Tor may  | 
                    |
| 20 | 
                        +be enough for some authorities.</p></li><li class="listitem"><span class="command"><strong>History disclosure</strong></span><p>  | 
                    |
| 21 | 
                        +The adversary may also be interested in history disclosure: the ability to  | 
                    |
| 22 | 
                        +query a user's history to see if they have issued certain censored search  | 
                    |
| 23 | 
                        +queries, or visited censored sites.  | 
                    |
| 24 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Location information</strong></span><p>  | 
                    |
| 25 | 
                        +  | 
                    |
| 26 | 
                        +Location information such as timezone and locality can be useful for the  | 
                    |
| 27 | 
                        +adversary to determine if a user is in fact originating from one of the  | 
                    |
| 28 | 
                        +regions they are attempting to control, or to zero-in on the geographical  | 
                    |
| 29 | 
                        +location of a particular dissident or whistleblower.  | 
                    |
| 30 | 
                        +  | 
                    |
| 31 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Miscellaneous anonymity set reduction</strong></span><p>  | 
                    |
| 32 | 
                        +  | 
                    |
| 33 | 
                        +Anonymity set reduction is also useful in attempting to zero in on a  | 
                    |
| 34 | 
                        +particular individual. If the dissident or whistleblower is using a rare build  | 
                    |
| 35 | 
                        +of Firefox for an obscure operating system, this can be very useful  | 
                    |
| 36 | 
                        +information for tracking them down, or at least <a class="link" href="#fingerprinting">tracking their activities</a>.  | 
                    |
| 37 | 
                        +  | 
                    |
| 38 | 
                        + </p></li><li class="listitem"><span class="command"><strong>History records and other on-disk  | 
                    |
| 39 | 
                        +information</strong></span><p>  | 
                    |
| 40 | 
                        +In some cases, the adversary may opt for a heavy-handed approach, such as  | 
                    |
| 41 | 
                        +seizing the computers of all Tor users in an area (especially after narrowing  | 
                    |
| 42 | 
                        +the field by the above two pieces of information). History records and cache  | 
                    |
| 43 | 
                        +data are the primary goals here.  | 
                    |
| 44 | 
                        + </p></li></ol></div></div><div class="sect3" title="Adversary Capabilities - Positioning"><div class="titlepage"><div><div><h4 class="title"><a id="adversarypositioning"></a>Adversary Capabilities - Positioning</h4></div></div></div><p>  | 
                    |
| 45 | 
                        +The adversary can position themselves at a number of different locations in  | 
                    |
| 46 | 
                        +order to execute their attacks.  | 
                    |
| 47 | 
                        + </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Exit Node or Upstream Router</strong></span><p>  | 
                    |
| 48 | 
                        +The adversary can run exit nodes, or alternatively, they may control routers  | 
                    |
| 49 | 
                        +upstream of exit nodes. Both of these scenarios have been observed in the  | 
                    |
| 50 | 
                        +wild.  | 
                    |
| 51 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Adservers and/or Malicious Websites</strong></span><p>  | 
                    |
| 52 | 
                        +The adversary can also run websites, or more likely, they can contract out  | 
                    |
| 53 | 
                        +ad space from a number of different adservers and inject content that way. For  | 
                    |
| 54 | 
                        +some users, the adversary may be the adservers themselves. It is not  | 
                    |
| 55 | 
                        +inconceivable that adservers may try to subvert or reduce a user's anonymity  | 
                    |
| 56 | 
                        +through Tor for marketing purposes.  | 
                    |
| 57 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Local Network/ISP/Upstream Router</strong></span><p>  | 
                    |
| 58 | 
                        +The adversary can also inject malicious content at the user's upstream router  | 
                    |
| 59 | 
                        +when they have Tor disabled, in an attempt to correlate their Tor and Non-Tor  | 
                    |
| 60 | 
                        +activity.  | 
                    |
| 61 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Physical Access</strong></span><p>  | 
                    |
| 62 | 
                        +Some users face adversaries with intermittent or constant physical access.  | 
                    |
| 63 | 
                        +Users in Internet cafes, for example, face such a threat. In addition, in  | 
                    |
| 64 | 
                        +countries where simply using tools like Tor is illegal, users may face  | 
                    |
| 65 | 
                        +confiscation of their computer equipment for excessive Tor usage or just  | 
                    |
| 66 | 
                        +general suspicion.  | 
                    |
| 67 | 
                        + </p></li></ol></div></div><div class="sect3" title="Adversary Capabilities - Attacks"><div class="titlepage"><div><div><h4 class="title"><a id="attacks"></a>Adversary Capabilities - Attacks</h4></div></div></div><p>  | 
                    |
| 68 | 
                        +  | 
                    |
| 69 | 
                        +The adversary can perform the following attacks from a number of different  | 
                    |
| 70 | 
                        +positions to accomplish various aspects of their goals. It should be noted  | 
                    |
| 71 | 
                        +that many of these attacks (especially those involving IP address leakage) are  | 
                    |
| 72 | 
                        +often performed by accident by websites that simply have Javascript, dynamic  | 
                    |
| 73 | 
                        +CSS elements, and plugins. Others are performed by adservers seeking to  | 
                    |
| 74 | 
                        +correlate users' activity across different IP addresses, and still others are  | 
                    |
| 75 | 
                        +performed by malicious agents on the Tor network and at national firewalls.  | 
                    |
| 76 | 
                        +  | 
                    |
| 77 | 
                        + </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><span class="command"><strong>Inserting Javascript</strong></span><p>  | 
                    |
| 78 | 
                        +If not properly disabled, Javascript event handlers and timers  | 
                    |
| 79 | 
                        +can cause the browser to perform network activity after Tor has been disabled,  | 
                    |
| 80 | 
                        +thus allowing the adversary to correlate Tor and Non-Tor activity and reveal  | 
                    |
| 81 | 
                        +a user's non-Tor IP address. Javascript  | 
                    |
| 82 | 
                        +also allows the adversary to execute <a class="ulink" href="http://whattheinternetknowsaboutyou.com/" target="_top">history disclosure attacks</a>:  | 
                    |
| 83 | 
                        +to query the history via the different attributes of 'visited' links to search  | 
                    |
| 84 | 
                        +for particular google queries, sites, or even to <a class="ulink" href="http://www.mikeonads.com/2008/07/13/using-your-browser-url-history-estimate-gender/" target="_top">profile  | 
                    |
| 85 | 
                        +users based on gender and other classifications</a>. Finally,  | 
                    |
| 86 | 
                        +Javascript can be used to query the user's timezone via the  | 
                    |
| 87 | 
                        +<code class="function">Date()</code> object, and to reduce the anonymity set by querying  | 
                    |
| 88 | 
                        +the <code class="function">navigator</code> object for operating system, CPU, locale,  | 
                    |
| 89 | 
                        +and user agent information.  | 
                    |
| 90 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Inserting Plugins</strong></span><p>  | 
                    |
| 91 | 
                        +  | 
                    |
| 92 | 
                        +Plugins are abysmal at obeying the proxy settings of the browser. Every plugin  | 
                    |
| 93 | 
                        +capable of performing network activity that the author has  | 
                    |
| 94 | 
                        +investigated is also capable of performing network activity independent of  | 
                    |
| 95 | 
                        +browser proxy settings - and often independent of its own proxy settings.  | 
                    |
| 96 | 
                        +Sites that have plugin content don't even have to be malicious to obtain a  | 
                    |
| 97 | 
                        +user's  | 
                    |
| 98 | 
                        +Non-Tor IP (it usually leaks by itself), though <a class="ulink" href="http://decloak.net" target="_top">plenty of active  | 
                    |
| 99 | 
                        +exploits</a> are possible as well. In addition, plugins can be used to store unique identifiers that are more  | 
                    |
| 100 | 
                        +difficult to clear than standard cookies.  | 
                    |
| 101 | 
                        +<a class="ulink" href="http://epic.org/privacy/cookies/flash.html" target="_top">Flash-based  | 
                    |
| 102 | 
                        +cookies</a> fall into this category, but there are likely numerous other  | 
                    |
| 103 | 
                        +examples.  | 
                    |
| 104 | 
                        +  | 
                    |
| 105 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Inserting CSS</strong></span><p>  | 
                    |
| 106 | 
                        +  | 
                    |
| 107 | 
                        +CSS can also be used to correlate Tor and Non-Tor activity and reveal a user's  | 
                    |
| 108 | 
                        +Non-Tor IP address, via the usage of  | 
                    |
| 109 | 
                        +<a class="ulink" href="http://www.tjkdesign.com/articles/css%20pop%20ups/" target="_top">CSS  | 
                    |
| 110 | 
                        +popups</a> - essentially CSS-based event handlers that fetch content via  | 
                    |
| 111 | 
                        +CSS's onmouseover attribute. If these popups are allowed to perform network  | 
                    |
| 112 | 
                        +activity in a different Tor state than they were loaded in, they can easily  | 
                    |
| 113 | 
                        +correlate Tor and Non-Tor activity and reveal a user's IP address. In  | 
                    |
| 114 | 
                        +addition, CSS can also be used without Javascript to perform <a class="ulink" href="http://ha.ckers.org/weird/CSS-history.cgi" target="_top">CSS-only history disclosure  | 
                    |
| 115 | 
                        +attacks</a>.  | 
                    |
| 116 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Read and insert cookies</strong></span><p>  | 
                    |
| 117 | 
                        +  | 
                    |
| 118 | 
                        +An adversary in a position to perform MITM content alteration can inject  | 
                    |
| 119 | 
                        +document content elements to both read and inject cookies for  | 
                    |
| 120 | 
                        +arbitrary domains. In fact, many "SSL secured" websites are vulnerable to this  | 
                    |
| 121 | 
                        +sort of <a class="ulink" href="http://seclists.org/bugtraq/2007/Aug/0070.html" target="_top">active  | 
                    |
| 122 | 
                        +sidejacking</a>.  | 
                    |
| 123 | 
                        +  | 
                    |
| 124 | 
                        + </p></li><li class="listitem"><span class="command"><strong>Create arbitrary cached content</strong></span><p>  | 
                    |
| 125 | 
                        +  | 
                    |
| 126 | 
                        +Likewise, the browser cache can also be used to <a class="ulink" href="http://crypto.stanford.edu/sameorigin/safecachetest.html" target="_top">store unique  | 
                    |
| 127 | 
                        +identifiers</a>. Since by default the cache has no same-origin policy,  | 
                    |
| 128 | 
                        +these identifiers can be read by any domain, making them an ideal target for  | 
                    |
| 129 | 
                        +adserver-class adversaries.  | 
                    |
| 130 | 
                        +  | 
                    |
| 131 | 
                        + </p></li><li class="listitem"><a id="fingerprinting"></a><span class="command"><strong>Fingerprint users based on browser  | 
                    |
| 132 | 
                        +attributes</strong></span><p>  | 
                    |
| 133 | 
                        +  | 
                    |
| 134 | 
                        +There is an absurd amount of information available to websites via attributes  | 
                    |
| 135 | 
                        +of the browser. This information can be used to reduce anonymity set, or even  | 
                    |
| 136 | 
                        +<a class="ulink" href="http://mandark.fr/0x000000/articles/Total_Recall_On_Firefox..html" target="_top">uniquely  | 
                    |
| 137 | 
                        +fingerprint individual users</a>. </p><p>  | 
                    |
| 138 | 
                        +For illustration, let's perform a  | 
                    |
| 139 | 
                        +back-of-the-envelope calculation on the number of anonymity sets for just the  | 
                    |
| 140 | 
                        +resolution information available in the <a class="ulink" href="http://developer.mozilla.org/en/docs/DOM:window" target="_top">window</a> and  | 
                    |
| 141 | 
                        +<a class="ulink" href="http://developer.mozilla.org/en/docs/DOM:window.screen" target="_top">window.screen</a>  | 
                    |
| 142 | 
                        +objects. Browser window resolution information provides something like  | 
                    |
| 143 | 
                        +(1280-640)*(1024-480)=348160 different anonymity sets. Desktop resolution  | 
                    |
| 144 | 
                        +information contributes about another factor of 5 (for about 5 resolutions in  | 
                    |
| 145 | 
                        +typical use). In addition, the dimensions and position of the desktop taskbar  | 
                    |
| 146 | 
                        +are available, which can reveal hints on OS information. This boosts the count  | 
                    |
| 147 | 
                        +by a factor of 5 (for each of the major desktop taskbars - Windows, OSX, KDE  | 
                    |
| 148 | 
                        +and Gnome, and None). Subtracting the browser content window  | 
                    |
| 149 | 
                        +size from the browser outer window size provide yet more information.  | 
                    |
| 150 | 
                        +Firefox toolbar presence gives about a factor of 8 (3 toolbars on/off give  | 
                    |
| 151 | 
                        +2<sup>3</sup>=8). Interface effects such as titlebar fontsize  | 
                    |
| 152 | 
                        +and window manager settings gives a factor of about 9 (say 3 common font sizes  | 
                    |
| 153 | 
                        +for the titlebar and 3 common sizes for browser GUI element fonts).  | 
                    |
| 154 | 
                        +Multiply this all out, and you have (1280-640)*(1024-480)*5*5*8*9 ~=  | 
                    |
| 155 | 
                        +2<sup>29</sup>, or a 29 bit identifier based on resolution  | 
                    |
| 156 | 
                        +information alone. </p><p>  | 
                    |
| 157 | 
                        +  | 
                    |
| 158 | 
                        +Of course, this space is non-uniform and prone to incremental changes.  | 
                    |
| 159 | 
                        +However, if a bit vector space consisting of the above extracted attributes  | 
                    |
| 160 | 
                        +were used instead of the hash approach from <a class="ulink" href="http://mandark.fr/0x000000/articles/Total_Recall_On_Firefox..html" target="_top">The Hacker  | 
                    |
| 161 | 
                        +Webzine article above</a>, minor changes in browser window resolution will  | 
                    |
| 162 | 
                        +no longer generate totally new identifiers.  | 
                    |
| 163 | 
                        +  | 
                    |
| 164 | 
                        +</p><p>  | 
                    |
| 165 | 
                        +  | 
                    |
| 166 | 
                        +To add insult to injury, <a class="ulink" href="http://pseudo-flaw.net/content/tor/torbutton/" target="_top">chrome URL disclosure  | 
                    |
| 167 | 
                        +attacks</a> mean that each and every extension on <a class="ulink" href="https://addons.mozilla.org" target="_top">addons.mozilla.org</a> adds another bit  | 
                    |
| 168 | 
                        +to that 2<sup>29</sup>. With hundreds of popular extensions  | 
                    |
| 169 | 
                        +and thousands of extensions total, it is easy to see that this sort of  | 
                    |
| 170 | 
                        +information is an impressively powerful identifier if used properly by a  | 
                    |
| 171 | 
                        +competent and determined adversary such as an ad network. Again, a  | 
                    |
| 172 | 
                        +nearest-neighbor bit vector space approach here would also gracefully handle  | 
                    |
| 173 | 
                        +incremental changes to installed extensions.  | 
                    |
| 174 | 
                        +  | 
                    |
| 175 | 
                        +</p></li><li class="listitem"><span class="command"><strong>Remotely or locally exploit browser and/or  | 
                    |
| 176 | 
                        +OS</strong></span><p>  | 
                    |
| 177 | 
                        +Last, but definitely not least, the adversary can exploit either general  | 
                    |
| 178 | 
                        +browser vulnerabilities, plugin vulnerabilities, or OS vulnerabilities to  | 
                    |
| 179 | 
                        +install malware and surveillance software. An adversary with physical access  | 
                    |
| 180 | 
                        +can perform similar actions. Regrettably, this last attack capability is  | 
                    |
| 181 | 
                        +outside of Torbutton's ability to defend against, but it is worth mentioning  | 
                    |
| 182 | 
                        +for completeness.  | 
                    |
| 183 | 
                        + </p></li></ol></div></div></div><div class="sect2" title="1.2. Torbutton Requirements"><div class="titlepage"><div><div><h3 class="title"><a id="requirements"></a>1.2. Torbutton Requirements</h3></div></div></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>  | 
                    |
| 184 | 
                        +  | 
                    |
| 185 | 
                        +Since many settings satisfy multiple requirements, this design document is  | 
                    |
| 186 | 
                        +organized primarily by Torbutton components and settings. However, if you are  | 
                    |
| 187 | 
                        +the type that would rather read the document from the requirements  | 
                    |
| 188 | 
                        +perspective, it is in fact possible to search for each of the following  | 
                    |
| 189 | 
                        +requirement phrases in the text to find the relevant features that help meet  | 
                    |
| 190 | 
                        +that requirement.  | 
                    |
| 191 | 
                        +  | 
                    |
| 192 | 
                        +</div><p>  | 
                    |
| 193 | 
                        +  | 
                    |
| 194 | 
                        +From the above Adversary Model, a number of requirements become clear.  | 
                    |
| 195 | 
                        +  | 
                    |
| 196 | 
                        + </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a id="proxy"></a><span class="command"><strong>Proxy Obedience</strong></span><p>The browser  | 
                    |
| 197 | 
                        +MUST NOT bypass Tor proxy settings for any content.</p></li><li class="listitem"><a id="isolation"></a><span class="command"><strong>Network Isolation</strong></span><p>Pages MUST NOT perform any network activity in a Tor state different  | 
                    |
| 198 | 
                        + from the state they were originally loaded in.</p></li><li class="listitem"><a id="state"></a><span class="command"><strong>State Separation</strong></span><p>Browser state (cookies, cache, history, 'DOM storage'), accumulated in  | 
                    |
| 199 | 
                        + one Tor state MUST NOT be accessible via the network in  | 
                    |
| 200 | 
                        + another Tor state.</p></li><li class="listitem"><a id="undiscoverability"></a><span class="command"><strong>Tor Undiscoverability</strong></span><p>With  | 
                    |
| 201 | 
                        +the advent of bridge support in Tor 0.2.0.x, there are now a class of Tor  | 
                    |
| 202 | 
                        +users whose network fingerprint does not obviously betray the fact that they  | 
                    |
| 203 | 
                        +are using Tor. This should extend to the browser as well - Torbutton MUST NOT  | 
                    |
| 204 | 
                        +reveal its presence while Tor is disabled.</p></li><li class="listitem"><a id="disk"></a><span class="command"><strong>Disk Avoidance</strong></span><p>The browser SHOULD NOT write any Tor-related state to disk, or store it  | 
                    |
| 205 | 
                        + in memory beyond the duration of one Tor toggle.</p></li><li class="listitem"><a id="location"></a><span class="command"><strong>Location Neutrality</strong></span><p>The browser SHOULD NOT leak location-specific information, such as  | 
                    |
| 206 | 
                        + timezone or locale via Tor.</p></li><li class="listitem"><a id="setpreservation"></a><span class="command"><strong>Anonymity Set  | 
                    |
| 207 | 
                        +Preservation</strong></span><p>The browser SHOULD NOT leak any other anonymity set reducing information  | 
                    |
| 208 | 
                        + (such as user agent, extension presence, and resolution information)  | 
                    |
| 209 | 
                        +automatically via Tor. The assessment of the attacks above should make it clear  | 
                    |
| 210 | 
                        +that anonymity set reduction is a very powerful method of tracking and  | 
                    |
| 211 | 
                        +eventually identifying anonymous users.  | 
                    |
| 212 | 
                        +</p></li><li class="listitem"><a id="updates"></a><span class="command"><strong>Update Safety</strong></span><p>The browser  | 
                    |
| 213 | 
                        +SHOULD NOT perform unauthenticated updates or upgrades via Tor.</p></li><li class="listitem"><a id="interoperate"></a><span class="command"><strong>Interoperability</strong></span><p>Torbutton SHOULD interoperate with third-party proxy switchers that  | 
                    |
| 214 | 
                        + enable the user to switch between a number of different proxies. It MUST  | 
                    |
| 215 | 
                        + provide full Tor protection in the event a third-party proxy switcher has  | 
                    |
| 216 | 
                        + enabled the Tor proxy settings.</p></li></ol></div></div><div class="sect2" title="1.3. Extension Layout"><div class="titlepage"><div><div><h3 class="title"><a id="layout"></a>1.3. Extension Layout</h3></div></div></div><p>Firefox extensions consist of two main categories of code: 'Components' and  | 
                    |
| 217 | 
                        +'Chrome'. Components are a fancy name for classes that implement a given  | 
                    |
| 218 | 
                        +interface or interfaces. In Firefox, components <a class="ulink" href="https://developer.mozilla.org/en/XPCOM" target="_top">can be  | 
                    |
| 219 | 
                        +written</a> in C++,  | 
                    |
| 220 | 
                        +Javascript, or a mixture of both. Components have two identifiers: their  | 
                    |
| 221 | 
                        +'<a class="ulink" href="http://www.mozilla.org/projects/xpcom/book/cxc/html/quicktour2.html#1005005" target="_top">Contract  | 
                    |
| 222 | 
                        +ID</a>' (a human readable path-like string), and their '<a class="ulink" href="http://www.mozilla.org/projects/xpcom/book/cxc/html/quicktour2.html#1005329" target="_top">Class  | 
                    |
| 223 | 
                        +ID</a>' (a GUID hex-string). In addition, the interfaces they implement each have a hex  | 
                    |
| 224 | 
                        +'Interface ID'. It is possible to 'hook' system components - to reimplement  | 
                    |
| 225 | 
                        +their interface members with your own wrappers - but only if the rest of the  | 
                    |
| 226 | 
                        +browser refers to the component by its Contract ID. If the browser refers to  | 
                    |
| 227 | 
                        +the component by Class ID, it bypasses your hooks in that use case.  | 
                    |
| 228 | 
                        +Technically, it may be possible to hook Class IDs by unregistering the  | 
                    |
| 229 | 
                        +original component, and then re-registering your own, but this relies on  | 
                    |
| 230 | 
                        +obsolete and deprecated interfaces and has proved to be less than  | 
                    |
| 231 | 
                        +stable.</p><p>'Chrome' is a combination of XML and Javascript used to describe a window.  | 
                    |
| 232 | 
                        +Extensions are allowed to create 'overlays' that are 'bound' to existing XML  | 
                    |
| 233 | 
                        +window definitions, or they can create their own windows. The DTD for this XML  | 
                    |
| 234 | 
                        +is called <a class="ulink" href="http://developer.mozilla.org/en/docs/XUL_Reference" target="_top">XUL</a>.</p></div></div><div class="sect1" title="2. Components"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2541734"></a>2. Components</h2></div></div></div><p>  | 
                    |
| 235 | 
                        +  | 
                    |
| 236 | 
                        +Torbutton installs components for two purposes: hooking existing components to  | 
                    |
| 237 | 
                        +reimplement their interfaces; and creating new components that provide  | 
                    |
| 238 | 
                        +services to other pieces of the extension.  | 
                    |
| 239 | 
                        +  | 
                    |
| 240 | 
                        + </p><div class="sect2" title="2.1. Hooked Components"><div class="titlepage"><div><div><h3 class="title"><a id="id2509118"></a>2.1. Hooked Components</h3></div></div></div><p>Torbutton makes extensive use of Contract ID hooking, and implements some  | 
                    |
| 241 | 
                        +of its own standalone components as well. Let's discuss the hooked components  | 
                    |
| 242 | 
                        +first.</p><div class="sect3" title="@mozilla.org/browser/sessionstore;1 - components/nsSessionStore36.js"><div class="titlepage"><div><div><h4 class="title"><a id="sessionstore"></a><a class="ulink" href="http://developer.mozilla.org/en/docs/nsISessionStore" target="_top">@mozilla.org/browser/sessionstore;1</a> -  | 
                    |
| 243 | 
                        +<a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/nsSessionStore36.js" target="_top">components/nsSessionStore36.js</a></h4></div></div></div><p>These components address the <a class="link" href="#disk">Disk Avoidance</a>  | 
                    |
| 244 | 
                        +requirements of Torbutton. As stated in the requirements, Torbutton needs to  | 
                    |
| 245 | 
                        +prevent Tor tabs from being written to disk by the Firefox session store for a  | 
                    |
| 246 | 
                        +number of reasons, primary among them is the fact that Firefox can crash at  | 
                    |
| 247 | 
                        +any time, and a restart can cause you to fetch tabs in the incorrect Tor  | 
                    |
| 248 | 
                        +state.</p><p>These components illustrate a complication with Firefox hooking: you can  | 
                    |
| 249 | 
                        +only hook member functions of a class if they are published in an  | 
                    |
| 250 | 
                        +interface that the class implements. Unfortunately, the sessionstore has no  | 
                    |
| 251 | 
                        +published interface that is amenable to disabling the writing out of Tor tabs  | 
                    |
| 252 | 
                        +in specific. As such, Torbutton had to include the <span class="emphasis"><em>entire</em></span>  | 
                    |
| 253 | 
                        +nsSessionStore from both Firefox 2.0, 3.0, 3.5 and 3.6  | 
                    |
| 254 | 
                        +with a couple of modifications to prevent tabs that were loaded with Tor  | 
                    |
| 255 | 
                        +enabled from being written to disk, and some version detection code to  | 
                    |
| 256 | 
                        +determine which component to load. The <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/nsSessionStore36.diff" target="_top">diff against the original session  | 
                    |
| 257 | 
                        +store</a> is included in the git repository.</p></div><div class="sect3" title="@mozilla.org/uriloader/external-protocol-service;1 , @mozilla.org/uriloader/external-helper-app-service;1, and @mozilla.org/mime;1 - components/external-app-blocker.js"><div class="titlepage"><div><div><h4 class="title"><a id="appblocker"></a><a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/uriloader/external-protocol-service%3B1" target="_top">@mozilla.org/uriloader/external-protocol-service;1  | 
                    |
| 258 | 
                        +</a>, <a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/uriloader/external-helper-app-service%3B1" target="_top">@mozilla.org/uriloader/external-helper-app-service;1</a>,  | 
                    |
| 259 | 
                        +and <a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/mime%3B1" target="_top">@mozilla.org/mime;1</a>  | 
                    |
| 260 | 
                        +- <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/external-app-blocker.js" target="_top">components/external-app-blocker.js</a></h4></div></div></div><p>  | 
                    |
| 261 | 
                        +Due to <a class="link" href="#FirefoxBugs" title="6. Relevant Firefox Bugs">Firefox Bug</a> <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=440892" target="_top">440892</a> allowing Firefox 3.x to automatically launch some  | 
                    |
| 262 | 
                        +applications without user intervention, Torbutton had to wrap the three  | 
                    |
| 263 | 
                        +components involved in launching external applications to provide user  | 
                    |
| 264 | 
                        +confirmation before doing so while Tor is enabled. Since external applications  | 
                    |
| 265 | 
                        +do not obey proxy settings, they can be manipulated to automatically connect  | 
                    |
| 266 | 
                        +back to arbitrary servers outside of Tor with no user intervention. Fixing  | 
                    |
| 267 | 
                        +this issue helps to satisfy Torbutton's <a class="link" href="#proxy">Proxy  | 
                    |
| 268 | 
                        +Obedience</a> Requirement.  | 
                    |
| 269 | 
                        + </p></div><div class="sect3" title="@mozilla.org/browser/sessionstartup;1 - components/crash-observer.js"><div class="titlepage"><div><div><h4 class="title"><a id="id2523615"></a><a class="ulink" href="http://lxr.mozilla.org/seamonkey/source/browser/components/sessionstore/src/nsSessionStartup.js" target="_top">@mozilla.org/browser/sessionstartup;1</a> -  | 
                    |
| 270 | 
                        + <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js" target="_top">components/crash-observer.js</a></h4></div></div></div><p>This component wraps the Firefox Session Startup component that is in  | 
                    |
| 271 | 
                        +charge of <a class="ulink" href="http://developer.mozilla.org/en/docs/Session_store_API" target="_top">restoring saved  | 
                    |
| 272 | 
                        +sessions</a>. The wrapper's only job is to intercept the  | 
                    |
| 273 | 
                        +<code class="function">doRestore()</code> function, which is called by Firefox if it is determined that the  | 
                    |
| 274 | 
                        +browser crashed and the session needs to be restored. The wrapper notifies the  | 
                    |
| 275 | 
                        +Torbutton chrome that the browser crashed by setting the pref  | 
                    |
| 276 | 
                        +<span class="command"><strong>extensions.torbutton.crashed</strong></span>, or that it is a normal  | 
                    |
| 277 | 
                        +startup via the pref <span class="command"><strong>extensions.torbutton.noncrashed</strong></span>. The Torbutton Chrome <a class="ulink" href="https://developer.mozilla.org/en/NsIPrefBranch2#addObserver.28.29" target="_top">listens for a  | 
                    |
| 278 | 
                        +preference change</a> for this value and then does the appropriate cleanup. This  | 
                    |
| 279 | 
                        +includes setting the Tor state to the one the user selected for crash recovery  | 
                    |
| 280 | 
                        +in the preferences window (<span class="command"><strong>extensions.torbutton.restore_tor</strong></span>), and  | 
                    |
| 281 | 
                        +restoring cookies for the corresponding cookie jar, if it exists.</p><p>By performing this notification, this component assists in the  | 
                    |
| 282 | 
                        +<a class="link" href="#proxy">Proxy Obedience</a>, and <a class="link" href="#isolation">Network Isolation</a> requirements.  | 
                    |
| 283 | 
                        +</p></div><div class="sect3" title="@mozilla.org/browser/global-history;2 - components/ignore-history.js"><div class="titlepage"><div><div><h4 class="title"><a id="id2535078"></a><a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/global-history;2" target="_top">@mozilla.org/browser/global-history;2</a>  | 
                    |
| 284 | 
                        +- <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/ignore-history.js" target="_top">components/ignore-history.js</a></h4></div></div></div><p>This component was contributed by <a class="ulink" href="http://www.collinjackson.com/" target="_top">Collin Jackson</a> as a method for defeating  | 
                    |
| 285 | 
                        +CSS and Javascript-based methods of history disclosure. The global-history  | 
                    |
| 286 | 
                        +component is what is used by Firefox to determine if a link was visited or not  | 
                    |
| 287 | 
                        +(to apply the appropriate style to the link). By hooking the <a class="ulink" href="https://developer.mozilla.org/en/nsIGlobalHistory2#isVisited.28.29" target="_top">isVisited</a>  | 
                    |
| 288 | 
                        +and <a class="ulink" href="https://developer.mozilla.org/en/nsIGlobalHistory2#addURI.28.29" target="_top">addURI</a>  | 
                    |
| 289 | 
                        +methods, Torbutton is able to selectively prevent history items from being  | 
                    |
| 290 | 
                        +added or being displayed as visited, depending on the Tor state and the user's  | 
                    |
| 291 | 
                        +preferences.  | 
                    |
| 292 | 
                        +</p><p>  | 
                    |
| 293 | 
                        +This component helps satisfy the <a class="link" href="#state">State Separation</a>  | 
                    |
| 294 | 
                        +and <a class="link" href="#disk">Disk Avoidance</a> requirements of Torbutton.  | 
                    |
| 295 | 
                        +</p></div><div class="sect3" title="@mozilla.org/browser/livemark-service;2 - components/block-livemarks.js"><div class="titlepage"><div><div><h4 class="title"><a id="livemarks"></a><a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/livemark-service;2" target="_top">@mozilla.org/browser/livemark-service;2</a>  | 
                    |
| 296 | 
                        +- <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/block-livemarks.js" target="_top">components/block-livemarks.js</a></h4></div></div></div><p>  | 
                    |
| 297 | 
                        +  | 
                    |
| 298 | 
                        +The <a class="ulink" href="http://www.mozilla.com/en-US/firefox/livebookmarks.html" target="_top">livemark</a> service  | 
                    |
| 299 | 
                        +is started by a timer that runs 5 seconds after Firefox  | 
                    |
| 300 | 
                        +startup. As a result, we cannot simply call the stopUpdateLivemarks() method to  | 
                    |
| 301 | 
                        +disable it. We must wrap the component to prevent this start() call from  | 
                    |
| 302 | 
                        +firing in the event the browser starts in Tor mode.  | 
                    |
| 303 | 
                        +  | 
                    |
| 304 | 
                        +</p><p>  | 
                    |
| 305 | 
                        +This component helps satisfy the <a class="link" href="#isolation">Network  | 
                    |
| 306 | 
                        +Isolation</a> and <a class="link" href="#setpreservation">Anonymity Set  | 
                    |
| 307 | 
                        +Preservation</a> requirements.  | 
                    |
| 308 | 
                        +</p></div></div><div class="sect2" title="2.2. New Components"><div class="titlepage"><div><div><h3 class="title"><a id="id2513073"></a>2.2. New Components</h3></div></div></div><p>Torbutton creates four new components that are used throughout the  | 
                    |
| 309 | 
                        +extension. These components do not hook any interfaces, nor are they used  | 
                    |
| 310 | 
                        +anywhere besides Torbutton itself.</p><div class="sect3" title="@torproject.org/cookie-jar-selector;2 - components/cookie-jar-selector.js"><div class="titlepage"><div><div><h4 class="title"><a id="id2541606"></a><a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js" target="_top">@torproject.org/cookie-jar-selector;2  | 
                    |
| 311 | 
                        +- components/cookie-jar-selector.js</a></h4></div></div></div><p>The cookie jar selector (also based on code from <a class="ulink" href="http://www.collinjackson.com/" target="_top">Collin  | 
                    |
| 312 | 
                        +Jackson</a>) is used by the Torbutton chrome to switch between  | 
                    |
| 313 | 
                        +Tor and Non-Tor cookies. Its operations are simple: sync cookies to disk, then  | 
                    |
| 314 | 
                        +move the current cookies.txt file to the appropriate backup location  | 
                    |
| 315 | 
                        +(cookies-tor.txt or cookies-nontor.txt), and then moving the other cookie jar  | 
                    |
| 316 | 
                        +into place.</p><p>  | 
                    |
| 317 | 
                        +This component helps to address the <a class="link" href="#state">State  | 
                    |
| 318 | 
                        +Isolation</a> requirement of Torbutton.  | 
                    |
| 319 | 
                        +</p></div><div class="sect3" title="@torproject.org/torbutton-logger;1 - components/torbutton-logger.js"><div class="titlepage"><div><div><h4 class="title"><a id="id2528340"></a><a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/torbutton-logger.js" target="_top">@torproject.org/torbutton-logger;1  | 
                    |
| 320 | 
                        +- components/torbutton-logger.js</a></h4></div></div></div><p>The torbutton logger component allows on-the-fly redirection of torbutton  | 
                    |
| 321 | 
                        +logging messages to either Firefox stderr  | 
                    |
| 322 | 
                        +(<span class="command"><strong>extensions.torbutton.logmethod=0</strong></span>), the Javascript error console  | 
                    |
| 323 | 
                        +(<span class="command"><strong>extensions.torbutton.logmethod=1</strong></span>), or the DebugLogger extension (if  | 
                    |
| 324 | 
                        +available - <span class="command"><strong>extensions.torbutton.logmethod=2</strong></span>). It also allows you to  | 
                    |
| 325 | 
                        +change the loglevel on the fly by changing  | 
                    |
| 326 | 
                        +<span class="command"><strong>extensions.torbutton.loglevel</strong></span> (1-5, 1 is most verbose).  | 
                    |
| 327 | 
                        +</p></div><div class="sect3" title="@torproject.org/content-window-mapper;1 - components/window-mapper.js"><div class="titlepage"><div><div><h4 class="title"><a id="windowmapper"></a><a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/window-mapper.js" target="_top">@torproject.org/content-window-mapper;1  | 
                    |
| 328 | 
                        +- components/window-mapper.js</a></h4></div></div></div><p>Torbutton tags Firefox <a class="ulink" href="https://developer.mozilla.org/en/XUL_Tutorial/Tabboxes" target="_top">tabs</a> with a special variable that indicates the Tor  | 
                    |
| 329 | 
                        +state the tab was most recently used under to fetch a page. The problem is  | 
                    |
| 330 | 
                        +that for many Firefox events, it is not possible to determine the tab that is  | 
                    |
| 331 | 
                        +actually receiving the event. The Torbutton window mapper allows the Torbutton  | 
                    |
| 332 | 
                        +chrome and other components to look up a <a class="ulink" href="https://developer.mozilla.org/en/XUL/tabbrowser" target="_top">browser  | 
                    |
| 333 | 
                        +tab</a> for a given <a class="ulink" href="https://developer.mozilla.org/en/nsIDOMWindow" target="_top">HTML content  | 
                    |
| 334 | 
                        +window</a>. It does this by traversing all windows and all browsers, until it  | 
                    |
| 335 | 
                        +finds the browser with the requested <a class="ulink" href="https://developer.mozilla.org/en/XUL/tabbrowser#p-contentWindow" target="_top">contentWindow</a> element. Since the content policy  | 
                    |
| 336 | 
                        +and page loading in general can generate hundreds of these lookups, this  | 
                    |
| 337 | 
                        +result is cached inside the component.  | 
                    |
| 338 | 
                        +</p></div><div class="sect3" title="@torproject.org/cssblocker;1 - components/cssblocker.js"><div class="titlepage"><div><div><h4 class="title"><a id="contentpolicy"></a><a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cssblocker.js" target="_top">@torproject.org/cssblocker;1  | 
                    |
| 339 | 
                        +- components/cssblocker.js</a></h4></div></div></div><p>This is a key component to Torbutton's security measures. When Tor is  | 
                    |
| 340 | 
                        +toggled, Javascript is disabled, and pages are instructed to stop loading.  | 
                    |
| 341 | 
                        +However, CSS is still able to perform network operations by loading styles for  | 
                    |
| 342 | 
                        +onmouseover events and other operations. In addition, favicons can still be  | 
                    |
| 343 | 
                        +loaded by the browser. The cssblocker component prevents this by implementing  | 
                    |
| 344 | 
                        +and registering an <a class="ulink" href="https://developer.mozilla.org/en/nsIContentPolicy" target="_top">nsIContentPolicy</a>.  | 
                    |
| 345 | 
                        +When an nsIContentPolicy is registered, Firefox checks every attempted network  | 
                    |
| 346 | 
                        +request against its <a class="ulink" href="https://developer.mozilla.org/en/nsIContentPolicy#shouldLoad()" target="_top">shouldLoad</a>  | 
                    |
| 347 | 
                        +member function to determine if the load should proceed. In Torbutton's case,  | 
                    |
| 348 | 
                        +the content policy looks up the appropriate browser tab using the <a class="link" href="#windowmapper" title="@torproject.org/content-window-mapper;1 - components/window-mapper.js">window mapper</a>,  | 
                    |
| 349 | 
                        +and checks that tab's load tag against the current Tor state. If the tab was  | 
                    |
| 350 | 
                        +loaded in a different state than the current state, the fetch is denied.  | 
                    |
| 351 | 
                        +Otherwise, it is allowed.</p> This helps to achieve the <a class="link" href="#isolation">Network  | 
                    |
| 352 | 
                        +Isolation</a> requirements of Torbutton.  | 
                    |
| 353 | 
                        +  | 
                    |
| 354 | 
                        +<p>In addition, the content policy also blocks website javascript from  | 
                    |
| 355 | 
                        +<a class="ulink" href="http://pseudo-flaw.net/content/tor/torbutton/" target="_top">querying for  | 
                    |
| 356 | 
                        +versions and existence of extension chrome</a> while Tor is enabled, and  | 
                    |
| 357 | 
                        +also masks the presence of Torbutton to website javascript while Tor is  | 
                    |
| 358 | 
                        +disabled. </p><p>  | 
                    |
| 359 | 
                        +  | 
                    |
| 360 | 
                        +Finally, some of the work that logically belongs to the content policy is  | 
                    |
| 361 | 
                        +instead handled by the <span class="command"><strong>torbutton_http_observer</strong></span> and  | 
                    |
| 362 | 
                        +<span class="command"><strong>torbutton_weblistener</strong></span> in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js" target="_top">torbutton.js</a>. These two objects handle blocking of  | 
                    |
| 363 | 
                        +Firefox 3 favicon loads, popups, and full page plugins, which for whatever  | 
                    |
| 364 | 
                        +reason are not passed to the Firefox content policy itself (see Firefox Bugs  | 
                    |
| 365 | 
                        +<a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=437014" target="_top">437014</a> and  | 
                    |
| 366 | 
                        +<a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=401296" target="_top">401296</a>).  | 
                    |
| 367 | 
                        +  | 
                    |
| 368 | 
                        +</p><p>  | 
                    |
| 369 | 
                        +  | 
                    |
| 370 | 
                        +This helps to fulfill both the <a class="link" href="#setpreservation">Anonymity Set Preservation</a> and the <a class="link" href="#undiscoverability">Tor Undiscoverability</a> requirements of  | 
                    |
| 371 | 
                        +Torbutton.</p></div></div></div><div class="sect1" title="3. Chrome"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2511168"></a>3. Chrome</h2></div></div></div><p>The chrome is where all the torbutton graphical elements and windows are  | 
                    |
| 372 | 
                        +located. Each window is described as an <a class="ulink" href="http://developer.mozilla.org/en/docs/XUL_Reference" target="_top">XML file</a>, with zero or more Javascript  | 
                    |
| 373 | 
                        +files attached. The scope of these Javascript files is their containing  | 
                    |
| 374 | 
                        +window.</p><div class="sect2" title="3.1. Browser Overlay - torbutton.xul"><div class="titlepage"><div><div><h3 class="title"><a id="browseroverlay"></a>3.1. Browser Overlay - <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.xul" target="_top">torbutton.xul</a></h3></div></div></div><p>The browser overlay, torbutton.xul, defines the toolbar button, the status  | 
                    |
| 375 | 
                        +bar, and events for toggling the button. The overlay code is in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js" target="_top">chrome/content/torbutton.js</a>.  | 
                    |
| 376 | 
                        +It contains event handlers for preference update, shutdown, upgrade, and  | 
                    |
| 377 | 
                        +location change events.</p><p>The <a class="ulink" href="https://developer.mozilla.org/en/nsIWebProgressListener#onLocationChange" target="_top">location  | 
                    |
| 378 | 
                        +change</a> <a class="ulink" href="https://developer.mozilla.org/en/nsIWebProgress" target="_top">webprogress  | 
                    |
| 379 | 
                        +listener</a>, <span class="command"><strong>torbutton_weblistener</strong></span> is one of the most  | 
                    |
| 380 | 
                        +important parts of the chrome from a security standpoint. It is a <a class="ulink" href="https://developer.mozilla.org/en/nsIWebProgressListener" target="_top">webprogress  | 
                    |
| 381 | 
                        +listener</a> that handles receiving an event every time a page load or  | 
                    |
| 382 | 
                        +iframe load occurs. This class eventually calls down to  | 
                    |
| 383 | 
                        +<code class="function">torbutton_update_tags()</code> and  | 
                    |
| 384 | 
                        +<code class="function">torbutton_hookdoc()</code>, which apply the browser Tor load  | 
                    |
| 385 | 
                        +state tags, plugin permissions, and install the Javascript hooks to hook the  | 
                    |
| 386 | 
                        +<a class="ulink" href="https://developer.mozilla.org/en/DOM/window.screen" target="_top">window.screen</a>  | 
                    |
| 387 | 
                        +object to obfuscate browser and desktop resolution information.  | 
                    |
| 388 | 
                        +  | 
                    |
| 389 | 
                        +</p><p>  | 
                    |
| 390 | 
                        +The browser overlay helps to satisfy a number of Torbutton requirements. These  | 
                    |
| 391 | 
                        +are better enumerated in each of the Torbutton preferences below. However,  | 
                    |
| 392 | 
                        +there are also a number of Firefox preferences set in  | 
                    |
| 393 | 
                        +<code class="function">torbutton_update_status()</code> that aren't governed by any  | 
                    |
| 394 | 
                        +Torbutton setting. These are:  | 
                    |
| 395 | 
                        +</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="ulink" href="http://kb.mozillazine.org/Network.security.ports.banned" target="_top">network.security.ports.banned</a><p>  | 
                    |
| 396 | 
                        +Torbutton sets this setting to add ports 8123, 8118, 9050 and 9051 (which it  | 
                    |
| 397 | 
                        +reads from <span class="command"><strong>extensions.torbutton.banned_ports</strong></span>) to the list  | 
                    |
| 398 | 
                        +of ports Firefox is forbidden to access. These ports are Polipo, Privoxy, Tor,  | 
                    |
| 399 | 
                        +and the Tor control port, respectively. This is set for both Tor and Non-Tor  | 
                    |
| 400 | 
                        +usage, and prevents websites from attempting to do http fetches from these  | 
                    |
| 401 | 
                        +ports to see if they are open, which addresses the <a class="link" href="#undiscoverability">Tor Undiscoverability</a> requirement.  | 
                    |
| 402 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://kb.mozillazine.org/Browser.send_pings" target="_top">browser.send_pings</a><p>  | 
                    |
| 403 | 
                        +This setting is currently always disabled. If anyone ever complains saying  | 
                    |
| 404 | 
                        +that they *want* their browser to be able to send ping notifications to a  | 
                    |
| 405 | 
                        +page or arbitrary link, I'll make this a pref or Tor-only. But I'm not holding  | 
                    |
| 406 | 
                        +my breath. I haven't checked if the content policy is called for pings, but if  | 
                    |
| 407 | 
                        +not, this setting helps with meeting the <a class="link" href="#isolation">Network  | 
                    |
| 408 | 
                        +Isolation</a> requirement.  | 
                    |
| 409 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://kb.mozillazine.org/Browser.safebrowsing.remoteLookups" target="_top">browser.safebrowsing.remoteLookups</a><p>  | 
                    |
| 410 | 
                        +Likewise for this setting. I find it hard to imagine anyone who wants to ask  | 
                    |
| 411 | 
                        +Google in real time if each URL they visit is safe, especially when the list  | 
                    |
| 412 | 
                        +of unsafe URLs is downloaded anyway. This helps fulfill the <a class="link" href="#disk">Disk Avoidance</a> requirement, by preventing your entire  | 
                    |
| 413 | 
                        +browsing history from ending up on Google's disks.  | 
                    |
| 414 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://kb.mozillazine.org/Browser.safebrowsing.enabled" target="_top">browser.safebrowsing.enabled</a><p>  | 
                    |
| 415 | 
                        +Safebrowsing does <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=360387" target="_top">unauthenticated  | 
                    |
| 416 | 
                        +updates under Firefox 2</a>, so it is disabled during Tor usage.  | 
                    |
| 417 | 
                        +This helps fulfill the <a class="link" href="#updates">Update  | 
                    |
| 418 | 
                        +Safety</a> requirement. Firefox 3 has the fix for that bug, and so  | 
                    |
| 419 | 
                        +safebrowsing updates are enabled during Tor usage.  | 
                    |
| 420 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://kb.mozillazine.org/Network.protocol-handler.warn-external.%28protocol%29" target="_top">network.protocol-handler.warn-external.(protocol)</a><p>  | 
                    |
| 421 | 
                        +If Tor is enabled, we need to prevent random external applications from  | 
                    |
| 422 | 
                        +launching without at least warning the user. This group of settings only  | 
                    |
| 423 | 
                        +partially accomplishes this, however. Applications can still be launched via  | 
                    |
| 424 | 
                        +plugins. The mechanisms for handling this are described under the "Disable  | 
                    |
| 425 | 
                        +Plugins During Tor Usage" preference. This helps fulfill the <a class="link" href="#proxy">Proxy Obedience</a> requirement, by preventing external  | 
                    |
| 426 | 
                        +applications from accessing network resources at the command of Tor-fetched  | 
                    |
| 427 | 
                        +pages. Unfortunately, due to <a class="link" href="#FirefoxBugs" title="6. Relevant Firefox Bugs">Firefox Bug</a>  | 
                    |
| 428 | 
                        +<a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=440892" target="_top">440892</a>,  | 
                    |
| 429 | 
                        +these prefs are no longer obeyed. They are set still anyway out of respect for  | 
                    |
| 430 | 
                        +the dead.  | 
                    |
| 431 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://kb.mozillazine.org/Browser.sessionstore.max_tabs_undo" target="_top">browser.sessionstore.max_tabs_undo</a><p>  | 
                    |
| 432 | 
                        +  | 
                    |
| 433 | 
                        +To help satisfy the Torbutton <a class="link" href="#state">State Separation</a>  | 
                    |
| 434 | 
                        +and <a class="link" href="#isolation">Network Isolation</a> requirements,  | 
                    |
| 435 | 
                        +Torbutton needs to purge the Undo Tab history on toggle to prevent repeat  | 
                    |
| 436 | 
                        +"Undo Close" operations from accidentally restoring tabs from a different Tor  | 
                    |
| 437 | 
                        +State. This purge is accomplished by setting this preference to 0 and then  | 
                    |
| 438 | 
                        +restoring it to the previous user value upon toggle.  | 
                    |
| 439 | 
                        +  | 
                    |
| 440 | 
                        + </p></li><li class="listitem"><span class="command"><strong>security.enable_ssl2</strong></span><p>  | 
                    |
| 441 | 
                        +TLS Session IDs can persist for an indefinite duration, providing an  | 
                    |
| 442 | 
                        +identifier that is sent to TLS sites that can be used to link activity. This  | 
                    |
| 443 | 
                        +is particularly troublesome now that we have certificate verification in place  | 
                    |
| 444 | 
                        +in Firefox 3: The OCSP server can use this Session ID to build a history of  | 
                    |
| 445 | 
                        +TLS sites someone visits, and also correlate their activity as users move from  | 
                    |
| 446 | 
                        +network to network (such as home to work to coffee shop, etc), inside and  | 
                    |
| 447 | 
                        +outside of Tor. To handle this and to help satisfy our <a class="link" href="#state">State Separation Requirement</a>, we currently  | 
                    |
| 448 | 
                        +toggle  | 
                    |
| 449 | 
                        +<span class="command"><strong>security.enable_ssl2</strong></span>, which clears the SSL Session ID  | 
                    |
| 450 | 
                        +cache via the pref observer at <a class="ulink" href="http://mxr.mozilla.org/security/source/security/manager/ssl/src/nsNSSComponent.cpp#2134" target="_top">nsNSSComponent.cpp  | 
                    |
| 451 | 
                        +line 2134</a>. This is an arcane and potentially fragile fix. It would be  | 
                    |
| 452 | 
                        +better if there were a more standard interface for accomplishing the same  | 
                    |
| 453 | 
                        +thing. <a class="link" href="#FirefoxBugs" title="6. Relevant Firefox Bugs">Firefox Bug</a> <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=448747" target="_top">448747</a> has  | 
                    |
| 454 | 
                        +been filed for this.  | 
                    |
| 455 | 
                        +  | 
                    |
| 456 | 
                        + </p></li><li class="listitem"><span class="command"><strong><a class="ulink" href="http://www.mozilla.com/en-US/firefox/geolocation/" target="_top">geo.enabled</a></strong></span><p>  | 
                    |
| 457 | 
                        +  | 
                    |
| 458 | 
                        +Torbutton disables Geolocation support in Firefox 3.5 and above whenever tor  | 
                    |
| 459 | 
                        +is enabled. This helps Torbutton maintain its  | 
                    |
| 460 | 
                        +<a class="link" href="#location">Location Neutrality</a> requirement.  | 
                    |
| 461 | 
                        +While Firefox does prompt before divulging geolocational information,  | 
                    |
| 462 | 
                        +the assumption is that Tor users will never want to give their  | 
                    |
| 463 | 
                        +location away during Tor usage, and even allowing websites to prompt  | 
                    |
| 464 | 
                        +them to do so will only cause confusion and accidents to happen. Moreover,  | 
                    |
| 465 | 
                        +just because users may approve a site to know their location in non-Tor mode  | 
                    |
| 466 | 
                        +does not mean they want it divulged during Tor mode.  | 
                    |
| 467 | 
                        +  | 
                    |
| 468 | 
                        + </p></li><li class="listitem"><span class="command"><strong><a class="ulink" href="http://kb.mozillazine.org/Browser.zoom.siteSpecific" target="_top">browser.zoom.siteSpecific</a></strong></span><p>  | 
                    |
| 469 | 
                        +  | 
                    |
| 470 | 
                        +Firefox actually remembers your zoom settings for certain sites. CSS  | 
                    |
| 471 | 
                        +and Javascript rule can use this to recognize previous visitors to a site.  | 
                    |
| 472 | 
                        +This helps Torbutton fulfill its <a class="link" href="#state">State Separation</a>  | 
                    |
| 473 | 
                        +requirement.  | 
                    |
| 474 | 
                        +  | 
                    |
| 475 | 
                        + </p></li><li class="listitem"><span class="command"><strong><a class="ulink" href="https://developer.mozilla.org/en/controlling_dns_prefetching" target="_top">network.dns.disablePrefetch</a></strong></span><p>  | 
                    |
| 476 | 
                        +  | 
                    |
| 477 | 
                        +Firefox 3.5 and above implement prefetching of DNS resolution for hostnames in  | 
                    |
| 478 | 
                        +links on a page to decrease page load latency. While Firefox does typically  | 
                    |
| 479 | 
                        +disable this behavior when proxies are enabled, we set this pref for added  | 
                    |
| 480 | 
                        +safety during Tor usage. Additionally, to prevent Tor-loaded tabs from having  | 
                    |
| 481 | 
                        +their links prefetched after a toggle to Non-Tor mode occurs,  | 
                    |
| 482 | 
                        +we also set the docShell attribute  | 
                    |
| 483 | 
                        +<a class="ulink" href="http://www.oxymoronical.com/experiments/apidocs/interface/nsIDocShell" target="_top">  | 
                    |
| 484 | 
                        +allowDNSPrefetch</a> to false on Tor loaded tabs. This happens in the same  | 
                    |
| 485 | 
                        +positions in the code as those for disabling plugins via the allowPlugins  | 
                    |
| 486 | 
                        +docShell attribute. This helps Torbutton fulfill its <a class="link" href="#isolation">Network Isolation</a> requirement.  | 
                    |
| 487 | 
                        +  | 
                    |
| 488 | 
                        + </p></li><li class="listitem"><span class="command"><strong><a class="ulink" href="http://kb.mozillazine.org/Browser.cache.offline.enable" target="_top">browser.cache.offline.enable</a></strong></span><p>  | 
                    |
| 489 | 
                        +  | 
                    |
| 490 | 
                        +Firefox has the ability to store web applications in a special cache to allow  | 
                    |
| 491 | 
                        +them to continue to operate while the user is offline. Since this subsystem  | 
                    |
| 492 | 
                        +is actually different than the normal disk cache, it must be dealt with  | 
                    |
| 493 | 
                        +separately. Thus, Torbutton sets this preference to false whenever Tor is  | 
                    |
| 494 | 
                        +enabled. This helps Torbutton fulfill its <a class="link" href="#disk">Disk  | 
                    |
| 495 | 
                        +Avoidance</a> and <a class="link" href="#state">State Separation</a>  | 
                    |
| 496 | 
                        +requirements.  | 
                    |
| 497 | 
                        +  | 
                    |
| 498 | 
                        + </p></li></ol></div></div><div class="sect2" title="3.2. Preferences Window - preferences.xul"><div class="titlepage"><div><div><h3 class="title"><a id="id2521151"></a>3.2. Preferences Window - <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.xul" target="_top">preferences.xul</a></h3></div></div></div><p>The preferences window of course lays out the Torbutton preferences, with  | 
                    |
| 499 | 
                        +handlers located in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.js" target="_top">chrome/content/preferences.js</a>.</p></div><div class="sect2" title="3.3. Other Windows"><div class="titlepage"><div><div><h3 class="title"><a id="id2524897"></a>3.3. Other Windows</h3></div></div></div><p>There are additional windows that describe popups for right clicking on  | 
                    |
| 500 | 
                        +the status bar, the toolbutton, and the about page.</p></div></div><div class="sect1" title="4. Toggle Code Path"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2538737"></a>4. Toggle Code Path</h2></div></div></div><p>  | 
                    |
| 501 | 
                        +  | 
                    |
| 502 | 
                        +The act of toggling is connected to <code class="function">torbutton_toggle()</code>  | 
                    |
| 503 | 
                        +via the <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.xul" target="_top">torbutton.xul</a>  | 
                    |
| 504 | 
                        +and <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/popup.xul" target="_top">popup.xul</a>  | 
                    |
| 505 | 
                        +overlay files. Most of the work in the toggling process is present in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js" target="_top">torbutton.js</a>  | 
                    |
| 506 | 
                        +  | 
                    |
| 507 | 
                        +</p><p>  | 
                    |
| 508 | 
                        +  | 
                    |
| 509 | 
                        +Toggling is a 3 stage process: Button Click, Proxy Update, and  | 
                    |
| 510 | 
                        +Settings Update. These stages are reflected in the prefs  | 
                    |
| 511 | 
                        +<span class="command"><strong>extensions.torbutton.tor_enabled</strong></span>,  | 
                    |
| 512 | 
                        +<span class="command"><strong>extensions.torbutton.proxies_applied</strong></span>, and  | 
                    |
| 513 | 
                        +<span class="command"><strong>extensions.torbutton.settings_applied</strong></span>. The reason for the  | 
                    |
| 514 | 
                        +three stage preference update is to ensure immediate enforcement of <a class="link" href="#isolation">Network Isolation</a> via the <a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">content policy</a>. Since the content window  | 
                    |
| 515 | 
                        +javascript runs on a different thread than the chrome javascript, it is  | 
                    |
| 516 | 
                        +important to properly convey the stages to the content policy to avoid race  | 
                    |
| 517 | 
                        +conditions and leakage, especially with <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=409737" target="_top">Firefox Bug  | 
                    |
| 518 | 
                        +409737</a> unfixed. The content policy does not allow any network activity  | 
                    |
| 519 | 
                        +whatsoever during this three stage transition.  | 
                    |
| 520 | 
                        +  | 
                    |
| 521 | 
                        + </p><div class="sect2" title="4.1. Button Click"><div class="titlepage"><div><div><h3 class="title"><a id="id2519814"></a>4.1. Button Click</h3></div></div></div><p>  | 
                    |
| 522 | 
                        +  | 
                    |
| 523 | 
                        +This is the first step in the toggling process. When the user clicks the  | 
                    |
| 524 | 
                        +toggle button or the toolbar, <code class="function">torbutton_toggle()</code> is  | 
                    |
| 525 | 
                        +called. This function checks the current Tor status by comparing the current  | 
                    |
| 526 | 
                        +proxy settings to the selected Tor settings, and then sets the proxy settings  | 
                    |
| 527 | 
                        +to the opposite state, and sets the pref  | 
                    |
| 528 | 
                        +<span class="command"><strong>extensions.torbutton.tor_enabled</strong></span> to reflect the new state.  | 
                    |
| 529 | 
                        +It is this proxy pref update that gives notification via the <a class="ulink" href="https://developer.mozilla.org/en/NsIPrefBranch2#addObserver.28.29" target="_top">pref  | 
                    |
| 530 | 
                        +observer</a>  | 
                    |
| 531 | 
                        +<span class="command"><strong>torbutton_unique_pref_observer</strong></span> to perform the rest of the  | 
                    |
| 532 | 
                        +toggle.  | 
                    |
| 533 | 
                        +  | 
                    |
| 534 | 
                        + </p></div><div class="sect2" title="4.2. Proxy Update"><div class="titlepage"><div><div><h3 class="title"><a id="id2519526"></a>4.2. Proxy Update</h3></div></div></div><p>  | 
                    |
| 535 | 
                        +  | 
                    |
| 536 | 
                        +When Torbutton receives any proxy change notifications via its  | 
                    |
| 537 | 
                        +<span class="command"><strong>torbutton_unique_pref_observer</strong></span>, it calls  | 
                    |
| 538 | 
                        +<code class="function">torbutton_set_status()</code> which checks against the Tor  | 
                    |
| 539 | 
                        +settings to see if the Tor proxy settings match the current settings. If so,  | 
                    |
| 540 | 
                        +it calls <code class="function">torbutton_update_status()</code>, which determines if  | 
                    |
| 541 | 
                        +the Tor state has actually changed, and sets  | 
                    |
| 542 | 
                        +<span class="command"><strong>extensions.torbutton.proxies_applied</strong></span> to the appropriate Tor  | 
                    |
| 543 | 
                        +state value, and ensures that  | 
                    |
| 544 | 
                        +<span class="command"><strong>extensions.torbutton.tor_enabled</strong></span> is also set to the correct  | 
                    |
| 545 | 
                        +value. This is decoupled from the button click functionalty via the pref  | 
                    |
| 546 | 
                        +observer so that other addons (such as SwitchProxy) can switch the proxy  | 
                    |
| 547 | 
                        +settings between multiple proxies.  | 
                    |
| 548 | 
                        +  | 
                    |
| 549 | 
                        + </p></div><div class="sect2" title="4.3. Settings Update"><div class="titlepage"><div><div><h3 class="title"><a id="id2504564"></a>4.3. Settings Update</h3></div></div></div><p>  | 
                    |
| 550 | 
                        +  | 
                    |
| 551 | 
                        +The next stage is also handled by  | 
                    |
| 552 | 
                        +<code class="function">torbutton_update_status()</code>. This function sets scores of  | 
                    |
| 553 | 
                        +Firefox preferences, saving the original values to prefs under  | 
                    |
| 554 | 
                        +<span class="command"><strong>extensions.torbutton.saved.*</strong></span>, and performs the history  | 
                    |
| 555 | 
                        +clearing, cookie jaring, and ssl certificate jaring work of Torbutton. At the  | 
                    |
| 556 | 
                        +end of its work, it sets  | 
                    |
| 557 | 
                        +<span class="command"><strong>extensions.torbutton.settings_applied</strong></span>, which signifies the  | 
                    |
| 558 | 
                        +completion of the toggle operation to the <a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">content policy</a>.  | 
                    |
| 559 | 
                        +  | 
                    |
| 560 | 
                        + </p></div></div><div class="sect1" title="5. Description of Options"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2519462"></a>5. Description of Options</h2></div></div></div><p>This section provides a detailed description of Torbutton's options. Each  | 
                    |
| 561 | 
                        +option is presented as the string from the preferences window, a summary, the  | 
                    |
| 562 | 
                        +preferences it touches, and the effect this has on the components, chrome, and  | 
                    |
| 563 | 
                        +browser properties.</p><div class="sect2" title="5.1. Test Settings"><div class="titlepage"><div><div><h3 class="title"><a id="id2542642"></a>5.1. Test Settings</h3></div></div></div><p>  | 
                    |
| 564 | 
                        +This button under the Proxy Settings tab provides a way to verify that the  | 
                    |
| 565 | 
                        +proxy settings are correct, and actually do route through the Tor network. It  | 
                    |
| 566 | 
                        +performs this check by issuing an <a class="ulink" href="http://developer.mozilla.org/en/docs/XMLHttpRequest" target="_top">XMLHTTPRequest</a>  | 
                    |
| 567 | 
                        +for <a class="ulink" href="https://check.torproject.org/?TorButton=True" target="_top">https://check.torproject.org/?Torbutton=True</a>.  | 
                    |
| 568 | 
                        +This is a special page that returns very simple, yet well-formed XHTML that  | 
                    |
| 569 | 
                        +Torbutton can easily inspect for a hidden link with an id of  | 
                    |
| 570 | 
                        +<span class="command"><strong>TorCheckResult</strong></span> and a target of <span class="command"><strong>success</strong></span>  | 
                    |
| 571 | 
                        +or <span class="command"><strong>failure</strong></span> to indicate if the  | 
                    |
| 572 | 
                        +user hit the page from a Tor IP, a non-Tor IP. This check is handled in  | 
                    |
| 573 | 
                        +<code class="function">torbutton_test_settings()</code> in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js" target="_top">torbutton.js</a>.  | 
                    |
| 574 | 
                        +Presenting the results to the user is handled by the <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.xul" target="_top">preferences  | 
                    |
| 575 | 
                        +window</a>  | 
                    |
| 576 | 
                        +callback <code class="function">torbutton_prefs_test_settings()</code> in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/preferences.js" target="_top">preferences.js</a>.  | 
                    |
| 577 | 
                        +  | 
                    |
| 578 | 
                        + </p></div><div class="sect2" title="5.2. Disable plugins on Tor Usage (crucial)"><div class="titlepage"><div><div><h3 class="title"><a id="plugins"></a>5.2. Disable plugins on Tor Usage (crucial)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.no_tor_plugins</strong></span></p><p>Java and plugins <a class="ulink" href="http://java.sun.com/j2se/1.5.0/docs/api/java/net/class-use/NetworkInterface.html" target="_top">can query</a> the <a class="ulink" href="http://www.rgagnon.com/javadetails/java-0095.html" target="_top">local IP  | 
                    |
| 579 | 
                        +address</a> and report it back to the  | 
                    |
| 580 | 
                        +remote site. They can also <a class="ulink" href="http://decloak.net" target="_top">bypass proxy settings</a> and directly connect to a  | 
                    |
| 581 | 
                        +remote site without Tor. Every browser plugin we have tested with Firefox has  | 
                    |
| 582 | 
                        +some form of network capability, and every one ignores proxy settings or worse - only  | 
                    |
| 583 | 
                        +partially obeys them. This includes but is not limited to:  | 
                    |
| 584 | 
                        +QuickTime, Windows Media Player, RealPlayer, mplayerplug-in, AcroRead, and  | 
                    |
| 585 | 
                        +Flash.  | 
                    |
| 586 | 
                        +  | 
                    |
| 587 | 
                        + </p><p>  | 
                    |
| 588 | 
                        +Enabling this preference causes the above mentioned Torbutton chrome web progress  | 
                    |
| 589 | 
                        + listener <span class="command"><strong>torbutton_weblistener</strong></span> to disable Java via <span class="command"><strong>security.enable_java</strong></span> and to disable  | 
                    |
| 590 | 
                        + plugins via the browser <a class="ulink" href="https://developer.mozilla.org/en/XUL%3aProperty%3adocShell" target="_top">docShell</a>  | 
                    |
| 591 | 
                        + attribute <span class="command"><strong>allowPlugins</strong></span>. These flags are set every time a new window is  | 
                    |
| 592 | 
                        + created (<code class="function">torbutton_tag_new_browser()</code>), every time a web  | 
                    |
| 593 | 
                        +load  | 
                    |
| 594 | 
                        +event occurs  | 
                    |
| 595 | 
                        + (<code class="function">torbutton_update_tags()</code>), and every time the tor state is changed  | 
                    |
| 596 | 
                        + (<code class="function">torbutton_update_status()</code>). As a backup measure, plugins are also  | 
                    |
| 597 | 
                        + prevented from loading by the content policy in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cssblocker.js" target="_top">@torproject.org/cssblocker;1</a> if Tor is  | 
                    |
| 598 | 
                        + enabled and this option is set.  | 
                    |
| 599 | 
                        + </p><p>All of this turns out to be insufficient if the user directly clicks  | 
                    |
| 600 | 
                        +on a plugin-handled mime-type. <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=401296" target="_top">In this case</a>,  | 
                    |
| 601 | 
                        +the browser decides that maybe it should ignore all these other settings and  | 
                    |
| 602 | 
                        +load the plugin anyways, because maybe the user really did want to load it  | 
                    |
| 603 | 
                        +(never mind this same load-style could happen automatically with meta-refresh  | 
                    |
| 604 | 
                        +or any number of other ways..). To handle these cases, Torbutton stores a list  | 
                    |
| 605 | 
                        +of plugin-handled mime-types, and sets the pref  | 
                    |
| 606 | 
                        +<span class="command"><strong>plugin.disable_full_page_plugin_for_types</strong></span> to this list.  | 
                    |
| 607 | 
                        +Additionally, (since nothing can be assumed when relying on Firefox  | 
                    |
| 608 | 
                        +preferences and internals) if it detects a load of one of them from the web  | 
                    |
| 609 | 
                        +progress listener, it cancels the request, tells the associated DOMWindow to  | 
                    |
| 610 | 
                        +stop loading, clears the document, AND throws an exception. Anything short of  | 
                    |
| 611 | 
                        +all this and the plugin managed to find some way to load.  | 
                    |
| 612 | 
                        + </p><p>  | 
                    |
| 613 | 
                        + All this could be avoided, of course, if Firefox would either <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=401296" target="_top">obey  | 
                    |
| 614 | 
                        + allowPlugins</a> for directly visited URLs, or notify its content policy for such  | 
                    |
| 615 | 
                        + loads either <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=309524" target="_top">via</a> <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=380556" target="_top">shouldProcess</a> or shouldLoad. The fact that it does not is  | 
                    |
| 616 | 
                        + not very encouraging.  | 
                    |
| 617 | 
                        + </p><p>  | 
                    |
| 618 | 
                        +  | 
                    |
| 619 | 
                        +Since most plugins completely ignore browser proxy settings, the actions  | 
                    |
| 620 | 
                        +performed by this setting are crucial to satisfying the <a class="link" href="#proxy">Proxy Obedience</a> requirement.  | 
                    |
| 621 | 
                        +  | 
                    |
| 622 | 
                        + </p></div><div class="sect2" title="5.3. Isolate Dynamic Content to Tor State (crucial)"><div class="titlepage"><div><div><h3 class="title"><a id="id2536168"></a>5.3. Isolate Dynamic Content to Tor State (crucial)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.isolate_content</strong></span></p><p>Enabling this preference is what enables the <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cssblocker.js" target="_top">@torproject.org/cssblocker;1</a> content policy  | 
                    |
| 623 | 
                        +mentioned above, and causes it to block content load attempts in pages an  | 
                    |
| 624 | 
                        +opposite Tor state from the current state. Freshly loaded <a class="ulink" href="https://developer.mozilla.org/en/XUL/tabbrowser" target="_top">browser  | 
                    |
| 625 | 
                        +tabs</a> are tagged  | 
                    |
| 626 | 
                        +with a <span class="command"><strong>__tb_load_state</strong></span> member in  | 
                    |
| 627 | 
                        +<code class="function">torbutton_update_tags()</code> and this  | 
                    |
| 628 | 
                        +value is compared against the current tor state in the content policy.</p><p>It also kills all Javascript in each page loaded under that state by  | 
                    |
| 629 | 
                        +toggling the <span class="command"><strong>allowJavascript</strong></span> <a class="ulink" href="https://developer.mozilla.org/en/XUL%3aProperty%3adocShell" target="_top">docShell</a> property, and issues a  | 
                    |
| 630 | 
                        +<a class="ulink" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWebNavigation#stop()" target="_top">webNavigation.stop(webNavigation.STOP_ALL)</a> to each browser tab (the  | 
                    |
| 631 | 
                        +equivalent of hitting the STOP button).</p><p>  | 
                    |
| 632 | 
                        +  | 
                    |
| 633 | 
                        +Unfortunately, <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=409737" target="_top">Firefox bug  | 
                    |
| 634 | 
                        +409737</a> prevents <span class="command"><strong>docShell.allowJavascript</strong></span> from killing  | 
                    |
| 635 | 
                        +all event handlers, and event handlers registered with <a class="ulink" href="http://developer.mozilla.org/en/docs/DOM:element.addEventListener" target="_top">addEventListener()</a>  | 
                    |
| 636 | 
                        +are still able to execute. The <a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">Torbutton Content  | 
                    |
| 637 | 
                        +Policy</a> should prevent such code from performing network activity within  | 
                    |
| 638 | 
                        +the current tab, but activity that happens via a popup window or via a  | 
                    |
| 639 | 
                        +Javascript redirect can still slip by. For this reason, Torbutton blocks  | 
                    |
| 640 | 
                        +popups by checking for a valid <a class="ulink" href="http://developer.mozilla.org/en/docs/DOM:window.opener" target="_top">window.opener</a>  | 
                    |
| 641 | 
                        +attribute in <code class="function">torbutton_check_progress()</code>. If the window  | 
                    |
| 642 | 
                        +has an opener from a different Tor state, its load is blocked. The content  | 
                    |
| 643 | 
                        +policy also takes similar action to prevent Javascript redirects. This also  | 
                    |
| 644 | 
                        +has the side effect/feature of preventing the user from following any links  | 
                    |
| 645 | 
                        +from a page loaded in an opposite Tor state.  | 
                    |
| 646 | 
                        +  | 
                    |
| 647 | 
                        +</p><p>  | 
                    |
| 648 | 
                        +This setting is responsible for satisfying the <a class="link" href="#isolation">Network Isolation</a> requirement.  | 
                    |
| 649 | 
                        +</p></div><div class="sect2" title="5.4. Hook Dangerous Javascript"><div class="titlepage"><div><div><h3 class="title"><a id="jshooks"></a>5.4. Hook Dangerous Javascript</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.kill_bad_js</strong></span></p><p>This setting enables injection of the <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/jshooks.js" target="_top">Javascript  | 
                    |
| 650 | 
                        +hooking code</a>. This is done in the chrome in  | 
                    |
| 651 | 
                        +<code class="function">torbutton_hookdoc()</code>, which is called ultimately by both the  | 
                    |
| 652 | 
                        +<a class="ulink" href="https://developer.mozilla.org/en/nsIWebProgressListener" target="_top">webprogress  | 
                    |
| 653 | 
                        +listener</a> <span class="command"><strong>torbutton_weblistener</strong></span> and the <a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">content policy</a> (the latter being a hack to handle  | 
                    |
| 654 | 
                        +javascript: urls).  | 
                    |
| 655 | 
                        +  | 
                    |
| 656 | 
                        +In the Firefox 2 days, this option did a lot more than  | 
                    |
| 657 | 
                        +it does now. It used to be responsible for timezone and improved useragent  | 
                    |
| 658 | 
                        +spoofing, and history object cloaking. However, now it only provides  | 
                    |
| 659 | 
                        +obfuscation of the <a class="ulink" href="https://developer.mozilla.org/en/DOM/window.screen" target="_top">window.screen</a>  | 
                    |
| 660 | 
                        +object to mask your browser and desktop resolution.  | 
                    |
| 661 | 
                        +The resolution hooks  | 
                    |
| 662 | 
                        +effectively make the Firefox browser window appear to websites as if the renderable area  | 
                    |
| 663 | 
                        +takes up the entire desktop, has no toolbar or other GUI element space, and  | 
                    |
| 664 | 
                        +the desktop itself has no toolbars.  | 
                    |
| 665 | 
                        +These hooks drastically reduce the amount of information available to do <a class="link" href="#fingerprinting">anonymity set reduction attacks</a> and help to  | 
                    |
| 666 | 
                        +meet the <a class="link" href="#setpreservation">Anonymity Set Preservation</a>  | 
                    |
| 667 | 
                        +requirements. Unfortunately, Gregory Fleischer discovered it is still possible  | 
                    |
| 668 | 
                        +to retrieve the original screen values by using <a class="ulink" href="http://pseudo-flaw.net/tor/torbutton/unmask-sandbox-xpcnativewrapper.html" target="_top">XPCNativeWrapper</a>  | 
                    |
| 669 | 
                        +or <a class="ulink" href="http://pseudo-flaw.net/tor/torbutton/unmask-components-lookupmethod.html" target="_top">Components.lookupMethod</a>.  | 
                    |
| 670 | 
                        +We are still looking for a workaround as of Torbutton 1.2.4.  | 
                    |
| 671 | 
                        +  | 
                    |
| 672 | 
                        +  | 
                    |
| 673 | 
                        +  | 
                    |
| 674 | 
                        +</p></div><div class="sect2" title="5.5. Resize windows to multiples of 50px during Tor usage (recommended)"><div class="titlepage"><div><div><h3 class="title"><a id="id2530601"></a>5.5. Resize windows to multiples of 50px during Tor usage (recommended)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.resize_windows</strong></span></p><p>  | 
                    |
| 675 | 
                        +  | 
                    |
| 676 | 
                        +This option drastically cuts down on the number of distinct anonymity sets  | 
                    |
| 677 | 
                        +that divide the Tor web userbase. Without this setting, the dimensions for a  | 
                    |
| 678 | 
                        +typical browser window range from 600-1200 horizontal pixels and 400-1000  | 
                    |
| 679 | 
                        +vertical pixels, or about 600x600 = 360000 different sets. Resizing the  | 
                    |
| 680 | 
                        +browser window to multiples of 50 on each side reduces the number of sets by  | 
                    |
| 681 | 
                        +50^2, bringing the total number of sets to 144. Of course, the distribution  | 
                    |
| 682 | 
                        +among these sets are not uniform, but scaling by 50 will improve the situation  | 
                    |
| 683 | 
                        +due to this non-uniformity for users in the less common resolutions.  | 
                    |
| 684 | 
                        +Obviously the ideal situation would be to lie entirely about the browser  | 
                    |
| 685 | 
                        +window size, but this will likely cause all sorts of rendering issues, and is  | 
                    |
| 686 | 
                        +also not implementable in a foolproof way from extension land.  | 
                    |
| 687 | 
                        +  | 
                    |
| 688 | 
                        +</p><p>  | 
                    |
| 689 | 
                        +  | 
                    |
| 690 | 
                        +The implementation of this setting is spread across a couple of different  | 
                    |
| 691 | 
                        +locations in the Torbutton javascript <a class="link" href="#browseroverlay" title="3.1. Browser Overlay - torbutton.xul">browser  | 
                    |
| 692 | 
                        +overlay</a>. Since resizing minimized windows causes them to be restored,  | 
                    |
| 693 | 
                        +and since maximized windows remember their previous size to the pixel, windows  | 
                    |
| 694 | 
                        +must be resized before every document load (at the time of browser tagging)  | 
                    |
| 695 | 
                        +via <code class="function">torbutton_check_round()</code>, called by  | 
                    |
| 696 | 
                        +<code class="function">torbutton_update_tags()</code>. To prevent drift, the extension  | 
                    |
| 697 | 
                        +tracks the original values of the windows and uses this to perform the  | 
                    |
| 698 | 
                        +rounding on document load. In addition, to prevent the user from resizing a  | 
                    |
| 699 | 
                        +window to a non-50px multiple, a resize listener  | 
                    |
| 700 | 
                        +(<code class="function">torbutton_do_resize()</code>) is installed on every new browser  | 
                    |
| 701 | 
                        +window to record the new size and round it to a 50px multiple while Tor is  | 
                    |
| 702 | 
                        +enabled. In all cases, the browser's contentWindow.innerWidth and innerHeight  | 
                    |
| 703 | 
                        +are set. This ensures that there is no discrepancy between the 50 pixel cutoff  | 
                    |
| 704 | 
                        +and the actual renderable area of the browser (so that it is not possible to  | 
                    |
| 705 | 
                        +infer toolbar size/presence by the distance to the nearest 50 pixel roundoff).  | 
                    |
| 706 | 
                        +  | 
                    |
| 707 | 
                        +</p><p>  | 
                    |
| 708 | 
                        +This setting helps to meet the <a class="link" href="#setpreservation">Anonymity Set Preservation</a> requirements.  | 
                    |
| 709 | 
                        +</p></div><div class="sect2" title="5.6. Disable Updates During Tor"><div class="titlepage"><div><div><h3 class="title"><a id="id2513266"></a>5.6. Disable Updates During Tor</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.no_updates</strong></span></p><p>This setting causes Torbutton to disable the four <a class="ulink" href="http://wiki.mozilla.org/Update:Users/Checking_For_Updates#Preference_Controls_and_State" target="_top">Firefox  | 
                    |
| 710 | 
                        +update settings</a> during Tor  | 
                    |
| 711 | 
                        + usage: <span class="command"><strong>extensions.update.enabled</strong></span>,  | 
                    |
| 712 | 
                        +<span class="command"><strong>app.update.enabled</strong></span>,  | 
                    |
| 713 | 
                        + <span class="command"><strong>app.update.auto</strong></span>, and  | 
                    |
| 714 | 
                        +<span class="command"><strong>browser.search.update</strong></span>. These prevent the  | 
                    |
| 715 | 
                        + browser from updating extensions, checking for Firefox upgrades, and  | 
                    |
| 716 | 
                        + checking for search plugin updates while Tor is enabled.  | 
                    |
| 717 | 
                        + </p><p>  | 
                    |
| 718 | 
                        +This setting satisfies the <a class="link" href="#updates">Update Safety</a> requirement.  | 
                    |
| 719 | 
                        +</p></div><div class="sect2" title="5.7. Disable Search Suggestions during Tor (recommended)"><div class="titlepage"><div><div><h3 class="title"><a id="id2505201"></a>5.7. Disable Search Suggestions during Tor (recommended)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.no_search</strong></span></p><p>  | 
                    |
| 720 | 
                        +This setting causes Torbutton to disable <a class="ulink" href="http://kb.mozillazine.org/Browser.search.suggest.enabled" target="_top"><span class="command"><strong>browser.search.suggest.enabled</strong></span></a>  | 
                    |
| 721 | 
                        +during Tor usage.  | 
                    |
| 722 | 
                        +This governs if you get Google search suggestions during Tor  | 
                    |
| 723 | 
                        +usage. Your Google cookie is transmitted with google search suggestions, hence  | 
                    |
| 724 | 
                        +this is recommended to be disabled.  | 
                    |
| 725 | 
                        +  | 
                    |
| 726 | 
                        +</p><p>  | 
                    |
| 727 | 
                        +While this setting doesn't satisfy any Torbutton requirements, the fact that  | 
                    |
| 728 | 
                        +cookies are transmitted for partially typed queries does not seem desirable  | 
                    |
| 729 | 
                        +for Tor usage.  | 
                    |
| 730 | 
                        +</p></div><div class="sect2" title="5.8. Disable livemarks updates during Tor usage (recommended)"><div class="titlepage"><div><div><h3 class="title"><a id="id2505239"></a>5.8. Disable livemarks updates during Tor usage (recommended)</h3></div></div></div><p>Option:  | 
                    |
| 731 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.disable_livemarks</strong></span></td></tr></table><p>  | 
                    |
| 732 | 
                        + </p><p>  | 
                    |
| 733 | 
                        +This option causes Torbutton to prevent Firefox from loading <a class="ulink" href="http://www.mozilla.com/firefox/livebookmarks.html" target="_top">Livemarks</a> during  | 
                    |
| 734 | 
                        +Tor usage. Because people often have very personalized Livemarks (such as RSS  | 
                    |
| 735 | 
                        +feeds of Wikipedia articles they maintain, etc). This is accomplished both by  | 
                    |
| 736 | 
                        +<a class="link" href="#livemarks" title="@mozilla.org/browser/livemark-service;2 - components/block-livemarks.js">wrapping the livemark-service component</a> and  | 
                    |
| 737 | 
                        +by calling stopUpdateLivemarks() on the <a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/livemark-service;2" target="_top">Livemark  | 
                    |
| 738 | 
                        +service</a> when Tor is enabled.  | 
                    |
| 739 | 
                        +  | 
                    |
| 740 | 
                        +</p><p>  | 
                    |
| 741 | 
                        +This helps satisfy the <a class="link" href="#isolation">Network  | 
                    |
| 742 | 
                        +Isolation</a> and <a class="link" href="#setpreservation">Anonymity Set  | 
                    |
| 743 | 
                        +Preservation</a> requirements.  | 
                    |
| 744 | 
                        +</p></div><div class="sect2" title="5.9. Block Tor/Non-Tor access to network from file:// urls (recommended)"><div class="titlepage"><div><div><h3 class="title"><a id="id2505311"></a>5.9. Block Tor/Non-Tor access to network from file:// urls (recommended)</h3></div></div></div><p>Options:  | 
                    |
| 745 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.block_tor_file_net</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.block_nontor_file_net</strong></span></td></tr></table><p>  | 
                    |
| 746 | 
                        + </p><p>  | 
                    |
| 747 | 
                        +  | 
                    |
| 748 | 
                        +These settings prevent file urls from performing network operations during the  | 
                    |
| 749 | 
                        +respective Tor states. Firefox 2's implementation of same origin policy allows  | 
                    |
| 750 | 
                        +file urls to read and <a class="ulink" href="http://www.gnucitizen.org/blog/content-disposition-hacking/" target="_top">submit  | 
                    |
| 751 | 
                        +arbitrary files from the local filesystem</a> to arbitrary websites. To  | 
                    |
| 752 | 
                        +make matters worse, the 'Content-Disposition' header can be injected  | 
                    |
| 753 | 
                        +arbitrarily by exit nodes to trick users into running arbitrary html files in  | 
                    |
| 754 | 
                        +the local context. These preferences cause the <a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">content policy</a> to block access to any network  | 
                    |
| 755 | 
                        +resources from File urls during the appropriate Tor state.  | 
                    |
| 756 | 
                        +  | 
                    |
| 757 | 
                        +</p><p>  | 
                    |
| 758 | 
                        +  | 
                    |
| 759 | 
                        +This preference helps to ensure Tor's <a class="link" href="#isolation">Network  | 
                    |
| 760 | 
                        +Isolation</a> requirement, by preventing file urls from executing network  | 
                    |
| 761 | 
                        +operations in opposite Tor states. Also, allowing pages to submit arbitrary  | 
                    |
| 762 | 
                        +files to arbitrary sites just generally seems like a bad idea.  | 
                    |
| 763 | 
                        +  | 
                    |
| 764 | 
                        +</p></div><div class="sect2" title="5.10. Close all Tor/Non-Tor tabs and windows on toggle (optional)"><div class="titlepage"><div><div><h3 class="title"><a id="id2505383"></a>5.10. Close all Tor/Non-Tor tabs and windows on toggle (optional)</h3></div></div></div><p>Options:  | 
                    |
| 765 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.close_nontor</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.close_tor</strong></span></td></tr></table><p>  | 
                    |
| 766 | 
                        + </p><p>  | 
                    |
| 767 | 
                        +  | 
                    |
| 768 | 
                        +These settings cause Torbutton to enumerate through all windows and close all  | 
                    |
| 769 | 
                        +tabs in each window for the appropriate Tor state. This code can be found in  | 
                    |
| 770 | 
                        +<code class="function">torbutton_update_status()</code>. The main reason these settings  | 
                    |
| 771 | 
                        +exist is as a backup mechanism in the event of any Javascript or content policy  | 
                    |
| 772 | 
                        +leaks due to <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=409737" target="_top">Firefox Bug  | 
                    |
| 773 | 
                        +409737</a>. Torbutton currently tries to block all Javascript network  | 
                    |
| 774 | 
                        +activity via the content policy, but until that bug is fixed, there is some  | 
                    |
| 775 | 
                        +risk that there are alternate ways to bypass the policy. This option is  | 
                    |
| 776 | 
                        +available as an extra assurance of <a class="link" href="#isolation">Network  | 
                    |
| 777 | 
                        +Isolation</a> for those who would like to be sure that when Tor is toggled  | 
                    |
| 778 | 
                        +all page activity has ceased. It also serves as a potential future workaround  | 
                    |
| 779 | 
                        +in the event a content policy failure is discovered, and provides an additional  | 
                    |
| 780 | 
                        +level of protection for the <a class="link" href="#disk">Disk Avoidance</a>  | 
                    |
| 781 | 
                        +protection so that browser state is not sitting around waiting to be swapped  | 
                    |
| 782 | 
                        +out longer than necessary.  | 
                    |
| 783 | 
                        +  | 
                    |
| 784 | 
                        +</p><p>  | 
                    |
| 785 | 
                        +While this setting doesn't satisfy any Torbutton requirements, the fact that  | 
                    |
| 786 | 
                        +cookies are transmitted for partially typed queries does not seem desirable  | 
                    |
| 787 | 
                        +for Tor usage.  | 
                    |
| 788 | 
                        +</p></div><div class="sect2" title="5.11. Isolate Access to History navigation to Tor state (crucial)"><div class="titlepage"><div><div><h3 class="title"><a id="id2505464"></a>5.11. Isolate Access to History navigation to Tor state (crucial)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.block_js_history</strong></span></p><p>  | 
                    |
| 789 | 
                        +This setting determines if Torbutton installs an <a class="ulink" href="http://www.oxymoronical.com/experiments/apidocs/interface/nsISHistoryListener" target="_top">nsISHistoryListener</a>  | 
                    |
| 790 | 
                        +attached to the <a class="ulink" href="http://www.oxymoronical.com/experiments/apidocs/interface/nsISHistory" target="_top">sessionHistory</a> of  | 
                    |
| 791 | 
                        +of each browser's <a class="ulink" href="https://developer.mozilla.org/en/XUL%3aProperty%3awebNavigation" target="_top">webNavigatator</a>.  | 
                    |
| 792 | 
                        +The nsIShistoryListener is instantiated with a reference to the containing  | 
                    |
| 793 | 
                        +browser window and blocks the back, forward, and reload buttons on the browser  | 
                    |
| 794 | 
                        +navigation bar when Tor is in an opposite state than the one to load the  | 
                    |
| 795 | 
                        +current tab. In addition, Tor clears the session history during a new document  | 
                    |
| 796 | 
                        +load if this setting is enabled.  | 
                    |
| 797 | 
                        +  | 
                    |
| 798 | 
                        + </p><p>  | 
                    |
| 799 | 
                        +  | 
                    |
| 800 | 
                        +This is marked as a crucial setting in part  | 
                    |
| 801 | 
                        +because Javascript access to the history object is indistinguishable from  | 
                    |
| 802 | 
                        +user clicks, and because  | 
                    |
| 803 | 
                        +<a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=409737" target="_top">Firefox Bug  | 
                    |
| 804 | 
                        +409737</a> allows javascript to execute in opposite Tor states, javascript  | 
                    |
| 805 | 
                        +can issue reloads after Tor toggle to reveal your original IP. Even without  | 
                    |
| 806 | 
                        +this bug, however, Javascript is still able to access previous pages in your  | 
                    |
| 807 | 
                        +session history that may have been loaded under a different Tor state, to  | 
                    |
| 808 | 
                        +attempt to correlate your activity.  | 
                    |
| 809 | 
                        +  | 
                    |
| 810 | 
                        + </p><p>  | 
                    |
| 811 | 
                        +  | 
                    |
| 812 | 
                        +This setting helps to fulfill Torbutton's <a class="link" href="#state">State  | 
                    |
| 813 | 
                        +Separation</a> and (until Bug 409737 is fixed) <a class="link" href="#isolation">Network Isolation</a>  | 
                    |
| 814 | 
                        +requirements.  | 
                    |
| 815 | 
                        +  | 
                    |
| 816 | 
                        + </p></div><div class="sect2" title="5.12. History Access Settings"><div class="titlepage"><div><div><h3 class="title"><a id="id2505548"></a>5.12. History Access Settings</h3></div></div></div><p>Options:  | 
                    |
| 817 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.block_thread</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.block_nthread</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.block_thwrite</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.block_nthwrite</strong></span></td></tr></table><p>  | 
                    |
| 818 | 
                        + </p><p>These four settings govern the behavior of the <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/ignore-history.js" target="_top">components/ignore-history.js</a>  | 
                    |
| 819 | 
                        +history blocker component mentioned above. By hooking the browser's view of  | 
                    |
| 820 | 
                        +the history itself via the <a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/global-history;2" target="_top">@mozilla.org/browser/global-history;2</a>  | 
                    |
| 821 | 
                        +and <a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/browser/nav-history-service;1" target="_top">@mozilla.org/browser/nav-history-service;1</a>  | 
                    |
| 822 | 
                        +components, this mechanism defeats all document-based <a class="ulink" href="http://whattheinternetknowsaboutyou.com/" target="_top">history disclosure  | 
                    |
| 823 | 
                        +attacks</a>, including <a class="ulink" href="http://ha.ckers.org/weird/CSS-history.cgi" target="_top">CSS-only attacks</a>.  | 
                    |
| 824 | 
                        +  | 
                    |
| 825 | 
                        +The component also hooks functions involved in writing history to disk via  | 
                    |
| 826 | 
                        +both the <a class="ulink" href="http://developer.mozilla.org/en/docs/Places_migration_guide#History" target="_top">Places  | 
                    |
| 827 | 
                        +Database</a> and the older Firefox 2 mechanisms.  | 
                    |
| 828 | 
                        +  | 
                    |
| 829 | 
                        +</p><p>  | 
                    |
| 830 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> and <a class="link" href="#disk">Disk Avoidance</a> requirements.  | 
                    |
| 831 | 
                        +</p></div><div class="sect2" title="5.13. Clear History During Tor Toggle (optional)"><div class="titlepage"><div><div><h3 class="title"><a id="id2505661"></a>5.13. Clear History During Tor Toggle (optional)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.clear_history</strong></span></p><p>This setting governs if Torbutton calls  | 
                    |
| 832 | 
                        +<a class="ulink" href="https://developer.mozilla.org/en/nsIBrowserHistory#removeAllPages.28.29" target="_top">nsIBrowserHistory.removeAllPages</a>  | 
                    |
| 833 | 
                        +and <a class="ulink" href="http://www.oxymoronical.com/experiments/apidocs/interface/nsISHistory" target="_top">nsISHistory.PurgeHistory</a>  | 
                    |
| 834 | 
                        +for each tab on Tor toggle.</p><p>  | 
                    |
| 835 | 
                        +This setting is an optional way to help satisfy the <a class="link" href="#state">State Separation</a> requirement.  | 
                    |
| 836 | 
                        +</p></div><div class="sect2" title="5.14. Block Password+Form saving during Tor/Non-Tor"><div class="titlepage"><div><div><h3 class="title"><a id="id2505706"></a>5.14. Block Password+Form saving during Tor/Non-Tor</h3></div></div></div><p>Options:  | 
                    |
| 837 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.block_tforms</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.block_ntforms</strong></span></td></tr></table><p>  | 
                    |
| 838 | 
                        + </p><p>These settings govern if Torbutton disables  | 
                    |
| 839 | 
                        +<span class="command"><strong>browser.formfill.enable</strong></span>  | 
                    |
| 840 | 
                        +and <span class="command"><strong>signon.rememberSignons</strong></span> during Tor and Non-Tor usage.  | 
                    |
| 841 | 
                        +Since form fields can be read at any time by Javascript, this setting is a lot  | 
                    |
| 842 | 
                        +more important than it seems.  | 
                    |
| 843 | 
                        +</p><p>  | 
                    |
| 844 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> and <a class="link" href="#disk">Disk Avoidance</a> requirements.  | 
                    |
| 845 | 
                        +</p></div><div class="sect2" title="5.15. Block Tor disk cache and clear all cache on Tor Toggle"><div class="titlepage"><div><div><h3 class="title"><a id="id2547259"></a>5.15. Block Tor disk cache and clear all cache on Tor Toggle</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.clear_cache</strong></span>  | 
                    |
| 846 | 
                        + </p><p>This option causes Torbutton to call <a class="ulink" href="https://developer.mozilla.org/en/nsICacheService#evictEntries.28.29" target="_top">nsICacheService.evictEntries(0)</a>  | 
                    |
| 847 | 
                        +on Tor toggle to remove all entries from the cache. In addition, this setting  | 
                    |
| 848 | 
                        +causes Torbutton to set <a class="ulink" href="http://kb.mozillazine.org/Browser.cache.disk.enable" target="_top">browser.cache.disk.enable</a> to false.  | 
                    |
| 849 | 
                        +</p><p>  | 
                    |
| 850 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> and <a class="link" href="#disk">Disk Avoidance</a> requirements.  | 
                    |
| 851 | 
                        +</p></div><div class="sect2" title="5.16. Block disk and memory cache during Tor"><div class="titlepage"><div><div><h3 class="title"><a id="id2547309"></a>5.16. Block disk and memory cache during Tor</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.block_cache</strong></span></p><p>This setting  | 
                    |
| 852 | 
                        +causes Torbutton to set <a class="ulink" href="http://kb.mozillazine.org/Browser.cache.memory.enable" target="_top">browser.cache.memory.enable</a>,  | 
                    |
| 853 | 
                        +<a class="ulink" href="http://kb.mozillazine.org/Browser.cache.disk.enable" target="_top">browser.cache.disk.enable</a> and  | 
                    |
| 854 | 
                        +<a class="ulink" href="http://kb.mozillazine.org/Network.http.use-cache" target="_top">network.http.use-cache</a> to false during tor usage.  | 
                    |
| 855 | 
                        +</p><p>  | 
                    |
| 856 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> and <a class="link" href="#disk">Disk Avoidance</a> requirements.  | 
                    |
| 857 | 
                        +</p></div><div class="sect2" title="5.17. Clear Cookies on Tor Toggle"><div class="titlepage"><div><div><h3 class="title"><a id="id2547362"></a>5.17. Clear Cookies on Tor Toggle</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.clear_cookies</strong></span>  | 
                    |
| 858 | 
                        + </p><p>  | 
                    |
| 859 | 
                        +  | 
                    |
| 860 | 
                        +This setting causes Torbutton to call <a class="ulink" href="https://developer.mozilla.org/en/nsICookieManager#removeAll.28.29" target="_top">nsICookieManager.removeAll()</a> on  | 
                    |
| 861 | 
                        +every Tor toggle. In addition, this sets <a class="ulink" href="http://kb.mozillazine.org/Network.cookie.lifetimePolicy" target="_top">network.cookie.lifetimePolicy</a>  | 
                    |
| 862 | 
                        +to 2 for Tor usage, which causes all cookies to be demoted to session cookies,  | 
                    |
| 863 | 
                        +which prevents them from being written to disk.  | 
                    |
| 864 | 
                        +  | 
                    |
| 865 | 
                        +</p><p>  | 
                    |
| 866 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> and <a class="link" href="#disk">Disk Avoidance</a> requirements.  | 
                    |
| 867 | 
                        +</p></div><div class="sect2" title="5.18. Store Non-Tor cookies in a protected jar"><div class="titlepage"><div><div><h3 class="title"><a id="id2547413"></a>5.18. Store Non-Tor cookies in a protected jar</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.cookie_jars</strong></span>  | 
                    |
| 868 | 
                        + </p><p>  | 
                    |
| 869 | 
                        +  | 
                    |
| 870 | 
                        +This setting causes Torbutton to use <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js" target="_top">@torproject.org/cookie-jar-selector;2</a> to store  | 
                    |
| 871 | 
                        +non-tor cookies in a cookie jar during Tor usage, and clear the Tor cookies  | 
                    |
| 872 | 
                        +before restoring the jar.  | 
                    |
| 873 | 
                        +</p><p>  | 
                    |
| 874 | 
                        +This setting also sets <a class="ulink" href="http://kb.mozillazine.org/Network.cookie.lifetimePolicy" target="_top">network.cookie.lifetimePolicy</a>  | 
                    |
| 875 | 
                        +to 2 for Tor usage, which causes all cookies to be demoted to session cookies,  | 
                    |
| 876 | 
                        +which prevents them from being written to disk.  | 
                    |
| 877 | 
                        +  | 
                    |
| 878 | 
                        +</p><p>  | 
                    |
| 879 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> and <a class="link" href="#disk">Disk Avoidance</a> requirements.  | 
                    |
| 880 | 
                        +</p></div><div class="sect2" title="5.19. Store both Non-Tor and Tor cookies in a protected jar (dangerous)"><div class="titlepage"><div><div><h3 class="title"><a id="id2547469"></a>5.19. Store both Non-Tor and Tor cookies in a protected jar (dangerous)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.dual_cookie_jars</strong></span>  | 
                    |
| 881 | 
                        + </p><p>  | 
                    |
| 882 | 
                        +  | 
                    |
| 883 | 
                        +This setting causes Torbutton to use <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js" target="_top">@torproject.org/cookie-jar-selector;2</a> to store  | 
                    |
| 884 | 
                        +both Tor and Non-Tor cookies into protected jars.  | 
                    |
| 885 | 
                        +</p><p>  | 
                    |
| 886 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> requirement.  | 
                    |
| 887 | 
                        +</p></div><div class="sect2" title="5.20. Manage My Own Cookies (dangerous)"><div class="titlepage"><div><div><h3 class="title"><a id="id2547508"></a>5.20. Manage My Own Cookies (dangerous)</h3></div></div></div><p>Options: None</p><p>This setting disables all Torbutton cookie handling by setting the above  | 
                    |
| 888 | 
                        +cookie prefs all to false.</p></div><div class="sect2" title="5.21. Disable DOM Storage during Tor usage (crucial)"><div class="titlepage"><div><div><h3 class="title"><a id="id2547523"></a>5.21. Disable DOM Storage during Tor usage (crucial)</h3></div></div></div><div class="sect2" title="5.21.1. Do not write Tor/Non-Tor cookies to disk"><div class="titlepage"><div><div><h3 class="title"><a id="id2547525"></a>5.21.1. Do not write Tor/Non-Tor cookies to disk</h3></div></div></div><p>Options:  | 
                    |
| 889 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.tor_memory_jar</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.nontor_memory_jar</strong></span></td></tr></table><p>  | 
                    |
| 890 | 
                        + </p><p>  | 
                    |
| 891 | 
                        +These settings (contributed by arno) cause Torbutton to set <a class="ulink" href="http://kb.mozillazine.org/Network.cookie.lifetimePolicy" target="_top">network.cookie.lifetimePolicy</a>  | 
                    |
| 892 | 
                        +to 2 during the appropriate Tor state, and to store cookies acquired in that  | 
                    |
| 893 | 
                        +state into a Javascript  | 
                    |
| 894 | 
                        +<a class="ulink" href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Processing_XML_with_E4X" target="_top">E4X</a>  | 
                    |
| 895 | 
                        +object as opposed to writing them to disk.  | 
                    |
| 896 | 
                        +</p><p>  | 
                    |
| 897 | 
                        +This allows Torbutton to provide an option to preserve a user's  | 
                    |
| 898 | 
                        +cookies while still satisfying the <a class="link" href="#disk">Disk Avoidance</a>  | 
                    |
| 899 | 
                        +requirement.  | 
                    |
| 900 | 
                        +</p></div><p>Option: <span class="command"><strong>extensions.torbutton.disable_domstorage</strong></span>  | 
                    |
| 901 | 
                        + </p><p>  | 
                    |
| 902 | 
                        +  | 
                    |
| 903 | 
                        +This setting causes Torbutton to toggle <span class="command"><strong>dom.storage.enabled</strong></span> during Tor  | 
                    |
| 904 | 
                        +usage to prevent  | 
                    |
| 905 | 
                        +<a class="ulink" href="http://developer.mozilla.org/en/docs/DOM:Storage" target="_top">DOM Storage</a> from  | 
                    |
| 906 | 
                        + being used to store persistent information across Tor states.</p><p>  | 
                    |
| 907 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> requirement.  | 
                    |
| 908 | 
                        +</p></div><div class="sect2" title="5.22. Clear HTTP Auth on Tor Toggle (recommended)"><div class="titlepage"><div><div><h3 class="title"><a id="id2547627"></a>5.22. Clear HTTP Auth on Tor Toggle (recommended)</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.clear_http_auth</strong></span>  | 
                    |
| 909 | 
                        + </p><p>  | 
                    |
| 910 | 
                        +This setting causes Torbutton to call <a class="ulink" href="http://www.oxymoronical.com/experiments/apidocs/interface/nsIHttpAuthManager" target="_top">nsIHttpAuthManager.clearAll()</a>  | 
                    |
| 911 | 
                        +every time Tor is toggled.  | 
                    |
| 912 | 
                        +</p><p>  | 
                    |
| 913 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> requirement.  | 
                    |
| 914 | 
                        +</p></div><div class="sect2" title="5.23. Clear cookies on Tor/Non-Tor shutdown"><div class="titlepage"><div><div><h3 class="title"><a id="id2547664"></a>5.23. Clear cookies on Tor/Non-Tor shutdown</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.shutdown_method</strong></span>  | 
                    |
| 915 | 
                        + </p><p> This option variable can actually take 3 values: 0, 1, and 2. 0 means no  | 
                    |
| 916 | 
                        +cookie clearing, 1 means clear only during Tor-enabled shutdown, and 2 means  | 
                    |
| 917 | 
                        +clear for both Tor and Non-Tor shutdown. When set to 1 or 2, Torbutton listens  | 
                    |
| 918 | 
                        +for the <a class="ulink" href="http://developer.mozilla.org/en/docs/Observer_Notifications#Application_shutdown" target="_top">quit-application-granted</a> event in  | 
                    |
| 919 | 
                        +<code class="function">torbutton_uninstall_observer()</code> and use <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js" target="_top">@torproject.org/cookie-jar-selector;2</a>  | 
                    |
| 920 | 
                        +to clear out all cookies and all cookie jars upon shutdown. </p><p>  | 
                    |
| 921 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> requirement.  | 
                    |
| 922 | 
                        +</p></div><div class="sect2" title="5.24. Reload cookie jar/clear cookies on Firefox crash"><div class="titlepage"><div><div><h3 class="title"><a id="id2547718"></a>5.24. Reload cookie jar/clear cookies on Firefox crash</h3></div></div></div><p>Options:  | 
                    |
| 923 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.reload_crashed_jar</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.crashed</strong></span></td></tr></table><p>  | 
                    |
| 924 | 
                        + </p><p>This is no longer a user visible option, and is enabled by default. In  | 
                    |
| 925 | 
                        +the event of a crash, the Torbutton <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js" target="_top">components/crash-observer.js</a>  | 
                    |
| 926 | 
                        + component will notify the Chrome (via the  | 
                    |
| 927 | 
                        + <span class="command"><strong>extensions.torbutton.crashed</strong></span> pref and a <a class="ulink" href="https://developer.mozilla.org/en/NsIPrefBranch2#addObserver.28.29" target="_top">pref  | 
                    |
| 928 | 
                        +observer</a> in  | 
                    |
| 929 | 
                        +the chrome that listens for this update), and Torbutton will load the  | 
                    |
| 930 | 
                        + correct jar for the current Tor state via the <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/cookie-jar-selector.js" target="_top">@torproject.org/cookie-jar-selector;2</a>  | 
                    |
| 931 | 
                        + component.</p><p>  | 
                    |
| 932 | 
                        +This setting helps to satisfy the <a class="link" href="#state">State Separation</a> requirement in the event of Firefox  | 
                    |
| 933 | 
                        +crashes.  | 
                    |
| 934 | 
                        +</p></div><div class="sect2" title="5.25. On crash recovery or session restored startup, restore via: Tor, Non-Tor"><div class="titlepage"><div><div><h3 class="title"><a id="id2547794"></a>5.25. On crash recovery or session restored startup, restore via: Tor, Non-Tor</h3></div></div></div><p>Options:  | 
                    |
| 935 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.restore_tor</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.crashed</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.normal_exit</strong></span></td></tr></table><p>  | 
                    |
| 936 | 
                        + </p><p>This option works with the Torbutton <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js" target="_top">crash-observer.js</a>  | 
                    |
| 937 | 
                        + to set the Tor state after a crash is detected (via the  | 
                    |
| 938 | 
                        + <span class="command"><strong>extensions.torbutton.crashed</strong></span> pref). To confirm for  | 
                    |
| 939 | 
                        +false positives (such as session restore failures, upgrade, normal  | 
                    |
| 940 | 
                        +session restore, etc), Torbutton also sets the pref  | 
                    |
| 941 | 
                        +extensions.torbutton.normal_exit in torbutton_uninstall_observer() during  | 
                    |
| 942 | 
                        +Firefox exit and checks this value as well during startup.  | 
                    |
| 943 | 
                        +</p><p>  | 
                    |
| 944 | 
                        +  | 
                    |
| 945 | 
                        +Since the Tor state after a Firefox crash is unknown/indeterminate, this  | 
                    |
| 946 | 
                        +setting helps to satisfy the <a class="link" href="#state">State Separation</a>  | 
                    |
| 947 | 
                        +requirement in the event of Firefox crashes by ensuring all cookies,  | 
                    |
| 948 | 
                        +settings and saved sessions are reloaded from a fixed Tor state.  | 
                    |
| 949 | 
                        +  | 
                    |
| 950 | 
                        +</p></div><div class="sect2" title="5.26. On normal startup, set state to: Tor, Non-Tor, Shutdown State"><div class="titlepage"><div><div><h3 class="title"><a id="id2547866"></a>5.26. On normal startup, set state to: Tor, Non-Tor, Shutdown State</h3></div></div></div><p>Options:  | 
                    |
| 951 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.startup_state</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.noncrashed</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.normal_exit</strong></span></td></tr></table><p>  | 
                    |
| 952 | 
                        + </p><p>This option also works with the Torbutton <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/crash-observer.js" target="_top">crash-observer.js</a>  | 
                    |
| 953 | 
                        + to set the Tor state after a normal startup is detected (via the  | 
                    |
| 954 | 
                        + <span class="command"><strong>extensions.torbutton.noncrashed</strong></span> pref). To confirm for  | 
                    |
| 955 | 
                        +false positives  | 
                    |
| 956 | 
                        +(such as session restore failures, etc), Torbutton also sets the pref  | 
                    |
| 957 | 
                        +extensions.torbutton.normal_exit in torbutton_uninstall_observer() during  | 
                    |
| 958 | 
                        +Firefox exit and checks this value as well during startup.  | 
                    |
| 959 | 
                        +  | 
                    |
| 960 | 
                        +</p></div><div class="sect2" title="5.27. Prevent session store from saving Non-Tor/Tor-loaded tabs"><div class="titlepage"><div><div><h3 class="title"><a id="id2547925"></a>5.27. Prevent session store from saving Non-Tor/Tor-loaded tabs</h3></div></div></div><p>Options:  | 
                    |
| 961 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.nonontor_sessionstore</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.notor_sessionstore</strong></span></td></tr></table><p>  | 
                    |
| 962 | 
                        + </p><p>If these options are enabled, the <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/components/nsSessionStore3.js" target="_top">replacement nsSessionStore.js</a>  | 
                    |
| 963 | 
                        + component checks the <span class="command"><strong>__tb_tor_fetched</strong></span> tag of tabs before writing them  | 
                    |
| 964 | 
                        + out. If the tag is from a blocked Tor state, the tab is not written to disk.  | 
                    |
| 965 | 
                        + </p><p>  | 
                    |
| 966 | 
                        +This setting helps to satisfy the <a class="link" href="#disk">Disk Avoidance</a>  | 
                    |
| 967 | 
                        +requirement, and also helps to satisfy the <a class="link" href="#state">State Separation</a> requirement in the event of Firefox  | 
                    |
| 968 | 
                        +crashes.  | 
                    |
| 969 | 
                        +  | 
                    |
| 970 | 
                        +</p></div><div class="sect2" title="5.28. Set user agent during Tor usage (crucial)"><div class="titlepage"><div><div><h3 class="title"><a id="id2547990"></a>5.28. Set user agent during Tor usage (crucial)</h3></div></div></div><p>Options:  | 
                    |
| 971 | 
                        + </p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.set_uagent</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.platform_override</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.oscpu_override</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.buildID_override</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.productsub_override</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.appname_override</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.appversion_override</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.useragent_override</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.useragent_vendor</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.useragent_vendorSub</strong></span></td></tr></table><p>  | 
                    |
| 972 | 
                        + </p><p>On face, user agent switching appears to be straight-forward in Firefox.  | 
                    |
| 973 | 
                        +It provides several options for controlling the browser user agent string:  | 
                    |
| 974 | 
                        +<span class="command"><strong>general.appname.override</strong></span>,  | 
                    |
| 975 | 
                        +<span class="command"><strong>general.appversion.override</strong></span>,  | 
                    |
| 976 | 
                        +<span class="command"><strong>general.platform.override</strong></span>,  | 
                    |
| 977 | 
                        +<span class="command"><strong>general.oscpu.override</strong></span>,  | 
                    |
| 978 | 
                        +<span class="command"><strong>general.productSub.override</strong></span>,  | 
                    |
| 979 | 
                        +<span class="command"><strong>general.buildID.override</strong></span>,  | 
                    |
| 980 | 
                        +<span class="command"><strong>general.useragent.override</strong></span>,  | 
                    |
| 981 | 
                        +<span class="command"><strong>general.useragent.vendor</strong></span>, and  | 
                    |
| 982 | 
                        +<span class="command"><strong>general.useragent.vendorSub</strong></span>. If  | 
                    |
| 983 | 
                        +the Torbutton preference <span class="command"><strong>extensions.torbutton.set_uagent</strong></span> is  | 
                    |
| 984 | 
                        +true, Torbutton copies all of the other above prefs into their corresponding  | 
                    |
| 985 | 
                        +browser preferences during Tor usage.</p><p>  | 
                    |
| 986 | 
                        +  | 
                    |
| 987 | 
                        +It also turns out that it is possible to detect the original Firefox version  | 
                    |
| 988 | 
                        +by <a class="ulink" href="http://ha.ckers.org/blog/20070516/read-firefox-settings-poc/" target="_top">inspecting  | 
                    |
| 989 | 
                        +certain resource:// files</a>. These cases are handled by Torbutton's  | 
                    |
| 990 | 
                        +<a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">content policy</a>.  | 
                    |
| 991 | 
                        +  | 
                    |
| 992 | 
                        +</p><p>  | 
                    |
| 993 | 
                        +This setting helps to satisfy the <a class="link" href="#setpreservation">Anonymity Set Preservation</a> requirement.  | 
                    |
| 994 | 
                        +</p></div><div class="sect2" title="5.29. Spoof US English Browser"><div class="titlepage"><div><div><h3 class="title"><a id="id2548164"></a>5.29. Spoof US English Browser</h3></div></div></div><p>Options:  | 
                    |
| 995 | 
                        +</p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.spoof_english</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.spoof_charset</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.spoof_language</strong></span></td></tr></table><p>  | 
                    |
| 996 | 
                        +</p><p> This option causes Torbutton to set  | 
                    |
| 997 | 
                        +<span class="command"><strong>general.useragent.locale</strong></span>  | 
                    |
| 998 | 
                        +<span class="command"><strong>intl.accept_languages</strong></span> to the value specified in  | 
                    |
| 999 | 
                        +<span class="command"><strong>extensions.torbutton.spoof_locale</strong></span>,  | 
                    |
| 1000 | 
                        +<span class="command"><strong>extensions.torbutton.spoof_charset</strong></span> and  | 
                    |
| 1001 | 
                        +<span class="command"><strong>extensions.torbutton.spoof_language</strong></span> during Tor usage, as  | 
                    |
| 1002 | 
                        +well as hooking <span class="command"><strong>navigator.language</strong></span> via its <a class="link" href="#jshooks" title="5.4. Hook Dangerous Javascript">javascript hooks</a>.  | 
                    |
| 1003 | 
                        + </p><p>  | 
                    |
| 1004 | 
                        +This setting helps to satisfy the <a class="link" href="#setpreservation">Anonymity Set Preservation</a> and <a class="link" href="#location">Location Neutrality</a> requirements.  | 
                    |
| 1005 | 
                        +</p></div><div class="sect2" title="5.30. Don't send referrer during Tor Usage"><div class="titlepage"><div><div><h3 class="title"><a id="id2548257"></a>5.30. Don't send referrer during Tor Usage</h3></div></div></div><p>Option: <span class="command"><strong>extensions.torbutton.disable_referer</strong></span>  | 
                    |
| 1006 | 
                        +</p><p>  | 
                    |
| 1007 | 
                        +This option causes Torbutton to set <a class="ulink" href="http://kb.mozillazine.org/Network.http.sendSecureXSiteReferrer" target="_top">network.http.sendSecureXSiteReferrer</a> and  | 
                    |
| 1008 | 
                        +<a class="ulink" href="http://kb.mozillazine.org/Network.http.sendRefererHeader" target="_top">network.http.sendRefererHeader</a> during Tor usage.</p><p>  | 
                    |
| 1009 | 
                        +This setting also does not directly satisfy any Torbutton requirement, but  | 
                    |
| 1010 | 
                        +some may desire to mask their referrer for general privacy concerns.  | 
                    |
| 1011 | 
                        +</p></div><div class="sect2" title="5.31. Store SSL/CA Certs in separate jars for Tor/Non-Tor (recommended)"><div class="titlepage"><div><div><h3 class="title"><a id="id2548297"></a>5.31. Store SSL/CA Certs in separate jars for Tor/Non-Tor (recommended)</h3></div></div></div><p>Options:  | 
                    |
| 1012 | 
                        +</p><table border="0" summary="Simple list" class="simplelist"><tr><td><span class="command"><strong>extensions.torbutton.jar_certs</strong></span></td></tr><tr><td><span class="command"><strong>extensions.torbutton.jar_ca_certs</strong></span></td></tr></table><p>  | 
                    |
| 1013 | 
                        +</p><p>  | 
                    |
| 1014 | 
                        +  | 
                    |
| 1015 | 
                        +These settings govern if Torbutton attempts to isolate the user's SSL  | 
                    |
| 1016 | 
                        +certificates into separate jars for each Tor state. This isolation is  | 
                    |
| 1017 | 
                        +implemented in <code class="function">torbutton_jar_certs()</code> in <a class="ulink" href="https://git.torproject.org/checkout/torbutton/master/src/chrome/content/torbutton.js" target="_top">chrome/content/torbutton.js</a>,  | 
                    |
| 1018 | 
                        +which calls <code class="function">torbutton_jar_cert_type()</code> and  | 
                    |
| 1019 | 
                        +<code class="function">torbutton_unjar_cert_type()</code> for each certificate type in  | 
                    |
| 1020 | 
                        +the <a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/security/nsscertcache;1" target="_top">@mozilla.org/security/nsscertcache;1</a>.  | 
                    |
| 1021 | 
                        +Certificates are deleted from and imported to the <a class="ulink" href="http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/components/%40mozilla.org/security/x509certdb;1" target="_top">@mozilla.org/security/x509certdb;1</a>.  | 
                    |
| 1022 | 
                        +</p><p>  | 
                    |
| 1023 | 
                        +The first time this pref is used, a backup of the user's certificates is  | 
                    |
| 1024 | 
                        +created in their profile directory under the name  | 
                    |
| 1025 | 
                        +<code class="filename">cert8.db.bak</code>. This file can be copied back to  | 
                    |
| 1026 | 
                        +<code class="filename">cert8.db</code> to fully restore the original state of the  | 
                    |
| 1027 | 
                        +user's certificates in the event of any error.  | 
                    |
| 1028 | 
                        +</p><p>  | 
                    |
| 1029 | 
                        +Since exit nodes and malicious sites can insert content elements sourced to  | 
                    |
| 1030 | 
                        +specific SSL sites to query if a user has a certain certificate,  | 
                    |
| 1031 | 
                        +this setting helps to satisfy the <a class="link" href="#state">State  | 
                    |
| 1032 | 
                        +Separation</a> requirement of Torbutton. Unfortunately, <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=435159" target="_top">Firefox Bug  | 
                    |
| 1033 | 
                        +435159</a> prevents it from functioning correctly in the event of rapid Tor toggle, so it  | 
                    |
| 1034 | 
                        +is currently not exposed via the preferences UI.  | 
                    |
| 1035 | 
                        +  | 
                    |
| 1036 | 
                        +</p></div></div><div class="sect1" title="6. Relevant Firefox Bugs"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="FirefoxBugs"></a>6. Relevant Firefox Bugs</h2></div></div></div><p>  | 
                    |
| 1037 | 
                        +  | 
                    |
| 1038 | 
                        + </p><div class="sect2" title="6.1. Bugs impacting security"><div class="titlepage"><div><div><h3 class="title"><a id="FirefoxSecurity"></a>6.1. Bugs impacting security</h3></div></div></div><p>  | 
                    |
| 1039 | 
                        +  | 
                    |
| 1040 | 
                        +Torbutton has to work around a number of Firefox bugs that impact its  | 
                    |
| 1041 | 
                        +security. Most of these are mentioned elsewhere in this document, but they  | 
                    |
| 1042 | 
                        +have also been gathered here for reference. Several of these have fixes in  | 
                    |
| 1043 | 
                        +Firefox3.0/trunk, but are listed because they still have not been backported  | 
                    |
| 1044 | 
                        +to FF2.0. In order of decreasing severity, they are:  | 
                    |
| 1045 | 
                        +  | 
                    |
| 1046 | 
                        + </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=392274" target="_top">Bug 392274 - Timezone  | 
                    |
| 1047 | 
                        +config/chrome API</a><p>  | 
                    |
| 1048 | 
                        +  | 
                    |
| 1049 | 
                        +The lack of a config or API to configure the timezone requires Torbutton to  | 
                    |
| 1050 | 
                        +<a class="link" href="#jshooks" title="5.4. Hook Dangerous Javascript">insert client content window javascript</a> to hook  | 
                    |
| 1051 | 
                        +the Date object. Additionally, a way to <a class="ulink" href="http://pseudo-flaw.net/tor/torbutton/unmask-date.html" target="_top">remove the Date  | 
                    |
| 1052 | 
                        +hooks</a> was discovered by Greg Fleischer. Worse, on Firefox 3,  | 
                    |
| 1053 | 
                        +javascript sandboxing prevents most of the javascript hooks from being  | 
                    |
| 1054 | 
                        +installed, including the Date hooks. On Windows and Linux, you can set the TZ  | 
                    |
| 1055 | 
                        +environment variable to "UTC" as a workaround. Firefox will obey this  | 
                    |
| 1056 | 
                        +environment variable for your Timezone on those platforms, but on Windows this  | 
                    |
| 1057 | 
                        +does not take effect until browser restart. A fix for this has landed in  | 
                    |
| 1058 | 
                        +Firefox 3.5, but still has not been backported to Firefox 3.0. The lack of an  | 
                    |
| 1059 | 
                        +easy way to reliably spoof the timezone interferes with Torbutton's ability to  | 
                    |
| 1060 | 
                        +fulfill its <a class="link" href="#location">Location Neutrality</a> requirement.  | 
                    |
| 1061 | 
                        +  | 
                    |
| 1062 | 
                        +  | 
                    |
| 1063 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=435159" target="_top">Bug 435159 -  | 
                    |
| 1064 | 
                        +nsNSSCertificateDB::DeleteCertificate has race conditions</a><p>  | 
                    |
| 1065 | 
                        +  | 
                    |
| 1066 | 
                        +In Torbutton 1.2.0rc1, code was added to attempt to isolate SSL certificates  | 
                    |
| 1067 | 
                        +the user has installed. Unfortunately, the method call to delete a certificate  | 
                    |
| 1068 | 
                        +from the current certificate database acts lazily: it only sets a variable  | 
                    |
| 1069 | 
                        +that marks a cert for deletion later, and it is not cleared if that  | 
                    |
| 1070 | 
                        +certificate is re-added. This means that if the Tor state is toggled quickly,  | 
                    |
| 1071 | 
                        +that certificate could remain present until it is re-inserted (causing an  | 
                    |
| 1072 | 
                        +error dialog), and worse, it would still be deleted after that. The lack of  | 
                    |
| 1073 | 
                        +this functionality is considered a Torbutton security bug because cert  | 
                    |
| 1074 | 
                        +isolation is considered a <a class="link" href="#state">State Separation</a>  | 
                    |
| 1075 | 
                        +feature.  | 
                    |
| 1076 | 
                        +  | 
                    |
| 1077 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=409737" target="_top">Bug 409737 -  | 
                    |
| 1078 | 
                        +javascript.enabled and docShell.allowJavascript do not disable all event  | 
                    |
| 1079 | 
                        +handlers</a><p>  | 
                    |
| 1080 | 
                        +  | 
                    |
| 1081 | 
                        +This bug allows pages to execute javascript via addEventListener and perhaps  | 
                    |
| 1082 | 
                        +other callbacks. In order to prevent this bug from enabling an attacker to  | 
                    |
| 1083 | 
                        +break the <a class="link" href="#isolation">Network Isolation</a> requirement,  | 
                    |
| 1084 | 
                        +Torbutton 1.1.13 began blocking popups and history manipulation from different  | 
                    |
| 1085 | 
                        +Tor states. So long as there are no ways to open popups or redirect the user  | 
                    |
| 1086 | 
                        +to a new page, the <a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">Torbutton content  | 
                    |
| 1087 | 
                        +policy</a> should block Javascript network access. However, if there are  | 
                    |
| 1088 | 
                        +ways to open popups or perform redirects such that Torbutton cannot block  | 
                    |
| 1089 | 
                        +them, pages may still have free reign to break that requirement and reveal a  | 
                    |
| 1090 | 
                        +user's original IP address.  | 
                    |
| 1091 | 
                        +  | 
                    |
| 1092 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=448743" target="_top">Bug 448743 -  | 
                    |
| 1093 | 
                        +Decouple general.useragent.locale from spoofing of navigator.language</a><p>  | 
                    |
| 1094 | 
                        +  | 
                    |
| 1095 | 
                        +Currently, Torbutton spoofs the <span class="command"><strong>navigator.language</strong></span>  | 
                    |
| 1096 | 
                        +attribute via <a class="link" href="#jshooks" title="5.4. Hook Dangerous Javascript">Javascript hooks</a>. Unfortunately,  | 
                    |
| 1097 | 
                        +these do not work on Firefox 3. It would be ideal to have  | 
                    |
| 1098 | 
                        +a pref to set this value (something like a  | 
                    |
| 1099 | 
                        +<span class="command"><strong>general.useragent.override.locale</strong></span>),  | 
                    |
| 1100 | 
                        +to avoid fragmenting the anonymity set of users of foreign locales. This issue  | 
                    |
| 1101 | 
                        +impedes Torbutton from fully meeting its <a class="link" href="#setpreservation">Anonymity Set Preservation</a>  | 
                    |
| 1102 | 
                        +requirement on Firefox 3.  | 
                    |
| 1103 | 
                        +  | 
                    |
| 1104 | 
                        + </p></li></ol></div></div><div class="sect2" title="6.2. Bugs blocking functionality"><div class="titlepage"><div><div><h3 class="title"><a id="FirefoxWishlist"></a>6.2. Bugs blocking functionality</h3></div></div></div><p>  | 
                    |
| 1105 | 
                        +The following bugs impact Torbutton and similar extensions' functionality.  | 
                    |
| 1106 | 
                        + </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=445696" target="_top">Bug 445696 -  | 
                    |
| 1107 | 
                        +Extensions cannot determine if firefox is fullScreen</a><p>  | 
                    |
| 1108 | 
                        +  | 
                    |
| 1109 | 
                        +The windowState property of <a class="ulink" href="https://developer.mozilla.org/en/XUL/window" target="_top">ChromeWindows</a> does not accurately reflect the true  | 
                    |
| 1110 | 
                        +state of the window in some cases on Linux. This causes Torbutton to attempt  | 
                    |
| 1111 | 
                        +to resize maximized and minimized windows when it should not.  | 
                    |
| 1112 | 
                        +  | 
                    |
| 1113 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=290456" target="_top">Bug 290456 -  | 
                    |
| 1114 | 
                        +Block/clear Flash MX "cookies" as well</a><p>  | 
                    |
| 1115 | 
                        +  | 
                    |
| 1116 | 
                        +Today, it is possible to allow plugins if you have a transparent proxy such as  | 
                    |
| 1117 | 
                        +<a class="ulink" href="http://anonymityanywhere.com/incognito/" target="_top">Incognito</a> to prevent proxy bypass. However, flash cookies can still be used to  | 
                    |
| 1118 | 
                        +link your Tor and Non-Tor activity, and this reveal your IP to an adversary  | 
                    |
| 1119 | 
                        +that does so. This can be solved by manually removing your flash cookies (like  | 
                    |
| 1120 | 
                        +<a class="ulink" href="https://addons.mozilla.org/en-US/firefox/addon/6623" target="_top">BetterPrivacy</a> does), but  | 
                    |
| 1121 | 
                        +it would be nice if there was a standard way to do this from a Firefox API.  | 
                    |
| 1122 | 
                        +  | 
                    |
| 1123 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=417869" target="_top">Bug 417869 -  | 
                    |
| 1124 | 
                        +Browser context is difficult to obtain from many XPCOM callbacks</a><p>  | 
                    |
| 1125 | 
                        +  | 
                    |
| 1126 | 
                        +It is difficult to determine which tabbrowser many XPCOM callbacks originate  | 
                    |
| 1127 | 
                        +from, and in some cases absolutely no context information is provided at all.  | 
                    |
| 1128 | 
                        +While this doesn't have much of an effect on Torbutton, it does make writing  | 
                    |
| 1129 | 
                        +extensions that would like to do per-tab settings and content filters (such as  | 
                    |
| 1130 | 
                        +FoxyProxy) difficult to impossible to implement securely.  | 
                    |
| 1131 | 
                        +  | 
                    |
| 1132 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=418321" target="_top">Bug 418321 -  | 
                    |
| 1133 | 
                        +Components do not expose disk interfaces</a><p>  | 
                    |
| 1134 | 
                        +  | 
                    |
| 1135 | 
                        +Several components currently provide no way of reimplementing their disk  | 
                    |
| 1136 | 
                        +access to easily satisfy Torbutton's <a class="link" href="#disk">Disk  | 
                    |
| 1137 | 
                        +Avoidance</a> requirements. Workarounds exist, but they are <a class="link" href="#sessionstore" title="@mozilla.org/browser/sessionstore;1 - components/nsSessionStore36.js">clunky</a>, and  | 
                    |
| 1138 | 
                        +some of them involve disabling functionality during Tor usage.  | 
                    |
| 1139 | 
                        +  | 
                    |
| 1140 | 
                        + </p></li></ol></div></div><div class="sect2" title="6.3. Low Priority Bugs"><div class="titlepage"><div><div><h3 class="title"><a id="FirefoxMiscBugs"></a>6.3. Low Priority Bugs</h3></div></div></div><p>  | 
                    |
| 1141 | 
                        +The following bugs have an effect upon Torbutton, but are superseded by more  | 
                    |
| 1142 | 
                        +practical and more easily fixable variant bugs above; or have stable, simple  | 
                    |
| 1143 | 
                        +workarounds.  | 
                    |
| 1144 | 
                        + </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=435151" target="_top">Bug 435151 - XPCSafeJSObjectWrapper breaks evalInSandbox</a><p>  | 
                    |
| 1145 | 
                        +  | 
                    |
| 1146 | 
                        +Under Firefox 3, the XPCSafeJSObjectWrapper breaks when you try to use  | 
                    |
| 1147 | 
                        +constructors of classes defined from within the scope of the sandbox, among  | 
                    |
| 1148 | 
                        +other things. This prevents Torbutton from applying the Timezone hooks under  | 
                    |
| 1149 | 
                        +Firefox 3, but a better solution for Torbutton's specific date hooking needs  | 
                    |
| 1150 | 
                        +would be a fix for the above mentioned Bug 392274. Of course, many more  | 
                    |
| 1151 | 
                        +extensions may be interested in the sandbox hooking functionality working  | 
                    |
| 1152 | 
                        +properly though.  | 
                    |
| 1153 | 
                        +  | 
                    |
| 1154 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=440892" target="_top">Bug 440892 -  | 
                    |
| 1155 | 
                        +network.protocol-handler.warn-external are ignored</a><p>  | 
                    |
| 1156 | 
                        +  | 
                    |
| 1157 | 
                        +Sometime in the Firefox 3 development cycle, the preferences that governed  | 
                    |
| 1158 | 
                        +warning a user when external apps were launched got disconnected from the code  | 
                    |
| 1159 | 
                        +that does the launching. Torbutton depended on these prefs to prevent websites  | 
                    |
| 1160 | 
                        +from launching specially crafted documents and application arguments that  | 
                    |
| 1161 | 
                        +caused Proxy Bypass. We currently work around this issue by <a class="link" href="#appblocker" title="@mozilla.org/uriloader/external-protocol-service;1 , @mozilla.org/uriloader/external-helper-app-service;1, and @mozilla.org/mime;1 - components/external-app-blocker.js">wrapping the app launching components</a> to present a  | 
                    |
| 1162 | 
                        +popup before launching external apps while Tor is enabled. While this works,  | 
                    |
| 1163 | 
                        +it would be nice if these prefs were either fixed or removed.  | 
                    |
| 1164 | 
                        +  | 
                    |
| 1165 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=437014" target="_top">Bug 437014 -  | 
                    |
| 1166 | 
                        +nsIContentPolicy::shouldLoad no longer called for favicons</a><p>  | 
                    |
| 1167 | 
                        +  | 
                    |
| 1168 | 
                        +Firefox 3.0 stopped calling the shouldLoad call of content policy for favicon  | 
                    |
| 1169 | 
                        +loads. Torbutton had relied on this call to block favicon loads for opposite  | 
                    |
| 1170 | 
                        +Tor states. The workaround it employs for Firefox 3 is to cancel the request  | 
                    |
| 1171 | 
                        +when it arrives in the <span class="command"><strong>torbutton_http_observer</strong></span> used for  | 
                    |
| 1172 | 
                        +blocking full page plugin loads. This seems to work just fine, but is a bit  | 
                    |
| 1173 | 
                        +dirty.  | 
                    |
| 1174 | 
                        +  | 
                    |
| 1175 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=418986" target="_top">Bug 418986 - window.screen  | 
                    |
| 1176 | 
                        +provides a large amount of identifiable information</a><p>  | 
                    |
| 1177 | 
                        +  | 
                    |
| 1178 | 
                        +As <a class="link" href="#fingerprinting">mentioned above</a>, a large amount of  | 
                    |
| 1179 | 
                        +information is available from <a class="ulink" href="http://developer.mozilla.org/en/docs/DOM:window.screen" target="_top">window.screen</a>.  | 
                    |
| 1180 | 
                        +Currently, there is no way to obscure this information without Javascript  | 
                    |
| 1181 | 
                        +hooking. This bug is a feature request to provide some other method to change  | 
                    |
| 1182 | 
                        +these values.  | 
                    |
| 1183 | 
                        +  | 
                    |
| 1184 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=309524" target="_top">Bug 309524</a>  | 
                    |
| 1185 | 
                        +and <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=380556" target="_top">Bug  | 
                    |
| 1186 | 
                        +380556</a> - nsIContentPolicy::shouldProcess is not called.  | 
                    |
| 1187 | 
                        + <p>  | 
                    |
| 1188 | 
                        +  | 
                    |
| 1189 | 
                        +This is a call that would be useful to develop a better workaround for the  | 
                    |
| 1190 | 
                        +allowPlugins issue above. If the content policy were called before a URL was  | 
                    |
| 1191 | 
                        +handed over to a plugin or helper app, it would make the workaround for the  | 
                    |
| 1192 | 
                        +above allowPlugins bug a lot cleaner. Obviously this bug is not as severe as  | 
                    |
| 1193 | 
                        +the others though, but it might be nice to have this API as a backup.  | 
                    |
| 1194 | 
                        +  | 
                    |
| 1195 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=401296" target="_top">Bug 401296 - docShell.allowPlugins  | 
                    |
| 1196 | 
                        +not honored for direct links</a> (Perhaps subset of <a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=282106" target="_top">Bug 282106</a>?)  | 
                    |
| 1197 | 
                        + <p>  | 
                    |
| 1198 | 
                        +  | 
                    |
| 1199 | 
                        +Similar to the javascript plugin disabling attribute, the plugin disabling  | 
                    |
| 1200 | 
                        +attribute is also not perfect — it is ignored for direct links to plugin  | 
                    |
| 1201 | 
                        +handled content, as well as meta-refreshes to plugin handled content. This  | 
                    |
| 1202 | 
                        +requires Torbutton to listen to a number of different http events to intercept  | 
                    |
| 1203 | 
                        +plugin-related mime type URLs and cancel their requests. Again, since plugins  | 
                    |
| 1204 | 
                        +are quite horrible about obeying proxy settings, loading a plugin pretty much  | 
                    |
| 1205 | 
                        +ensures a way to break the <a class="link" href="#isolation">Network Isolation</a>  | 
                    |
| 1206 | 
                        +requirement and reveal a user's original IP address. Torbutton's code to  | 
                    |
| 1207 | 
                        +perform this workaround has been subverted at least once already by Kyle  | 
                    |
| 1208 | 
                        +Williams.  | 
                    |
| 1209 | 
                        +  | 
                    |
| 1210 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=448747" target="_top">Bug 448747 -  | 
                    |
| 1211 | 
                        +Provide Mechanism to clear TLS Session IDs</a><p>  | 
                    |
| 1212 | 
                        +  | 
                    |
| 1213 | 
                        +As <a class="link" href="#browseroverlay" title="3.1. Browser Overlay - torbutton.xul">mentioned above</a>, Torbutton currently  | 
                    |
| 1214 | 
                        +toggles <span class="command"><strong>security.enable_ssl2</strong></span> to clear the SSL  | 
                    |
| 1215 | 
                        +Session ID cache via the pref observer at <a class="ulink" href="http://mxr.mozilla.org/security/source/security/manager/ssl/src/nsNSSComponent.cpp#2134" target="_top">nsNSSComponent.cpp  | 
                    |
| 1216 | 
                        +line 2134</a>. This is an arcane and potentially fragile fix. It would be  | 
                    |
| 1217 | 
                        +better if there were a more standard interface for accomplishing the same  | 
                    |
| 1218 | 
                        +thing.  | 
                    |
| 1219 | 
                        +  | 
                    |
| 1220 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://bugzilla.mozilla.org/show_bug.cgi?id=419598" target="_top">Bug 419598 - 'var  | 
                    |
| 1221 | 
                        +Date' is deletable</a><p>  | 
                    |
| 1222 | 
                        +  | 
                    |
| 1223 | 
                        +Based on Page 62 of the <a class="ulink" href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf" target="_top">ECMA-262  | 
                    |
| 1224 | 
                        +Javascript spec</a>, it seems like it should be possible to do something  | 
                    |
| 1225 | 
                        +like the following to prevent the Date object from being unmasked:  | 
                    |
| 1226 | 
                        +</p><pre class="screen">  | 
                    |
| 1227 | 
                        +with(window) {
                       | 
                    |
| 1228 | 
                        + var Date = fakeDate;  | 
                    |
| 1229 | 
                        + var otherVariable = 42;  | 
                    |
| 1230 | 
                        +}  | 
                    |
| 1231 | 
                        +  | 
                    |
| 1232 | 
                        +delete window.Date; // Should fail. Instead succeeds, revealing original Date.  | 
                    |
| 1233 | 
                        +delete window.otherVariable; // Fails, leaving window.otherVariable set to 42.  | 
                    |
| 1234 | 
                        +</pre><p>  | 
                    |
| 1235 | 
                        +  | 
                    |
| 1236 | 
                        +From the ECMA-262 spec:  | 
                    |
| 1237 | 
                        +  | 
                    |
| 1238 | 
                        +</p><div class="blockquote"><blockquote class="blockquote">  | 
                    |
| 1239 | 
                        +If the variable statement occurs inside a FunctionDeclaration, the variables  | 
                    |
| 1240 | 
                        +are defined with function-local scope in that function, as described in  | 
                    |
| 1241 | 
                        +s10.1.3. Otherwise, they are defined with global scope (that is, they are  | 
                    |
| 1242 | 
                        +created as members of the global object, as described in 10.1.3) using  | 
                    |
| 1243 | 
                        +property attributes { DontDelete }. Variables are created when the execution
                       | 
                    |
| 1244 | 
                        +scope is entered. A Block does not define a new execution scope. Only Program  | 
                    |
| 1245 | 
                        +and FunctionDeclaration produce a new scope. Variables are initialized to  | 
                    |
| 1246 | 
                        +undefined when created. A variable with an Initialiser is assigned the value  | 
                    |
| 1247 | 
                        +of its AssignmentExpression when the VariableStatement is executed, not when  | 
                    |
| 1248 | 
                        +the variable is created.  | 
                    |
| 1249 | 
                        +</blockquote></div><p>  | 
                    |
| 1250 | 
                        +  | 
                    |
| 1251 | 
                        +In fact, this is exactly how the with statement with a variable declaration  | 
                    |
| 1252 | 
                        +behaves <span class="emphasis"><em>for all other variables other than ones that shadow system  | 
                    |
| 1253 | 
                        +variables</em></span>. Some variables (such as  | 
                    |
| 1254 | 
                        +<span class="command"><strong>window.screen</strong></span>, and <span class="command"><strong>window.history</strong></span>) can't  | 
                    |
| 1255 | 
                        +even be shadowed in this way, and give an error about lacking a setter. If  | 
                    |
| 1256 | 
                        +such shadowing were possible, it would greatly simplify the Javascript hooking  | 
                    |
| 1257 | 
                        +code, which currently relies on undocumented semantics of  | 
                    |
| 1258 | 
                        +<span class="command"><strong>__proto__</strong></span> to copy the original values in the event of a  | 
                    |
| 1259 | 
                        +delete. This <span class="command"><strong>__proto__</strong></span> hack unfortunately does not work for  | 
                    |
| 1260 | 
                        +the Date object though.  | 
                    |
| 1261 | 
                        +  | 
                    |
| 1262 | 
                        + </p></li></ol></div></div></div><div class="sect1" title="7. Testing"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="TestPlan"></a>7. Testing</h2></div></div></div><p>  | 
                    |
| 1263 | 
                        +  | 
                    |
| 1264 | 
                        +The purpose of this section is to cover all the known ways that Tor browser  | 
                    |
| 1265 | 
                        +security can be subverted from a penetration testing perspective. The hope  | 
                    |
| 1266 | 
                        +is that it will be useful both for creating a "Tor Safety Check"  | 
                    |
| 1267 | 
                        +page, and for developing novel tests and actively attacking Torbutton with the  | 
                    |
| 1268 | 
                        +goal of finding vulnerabilities in either it or the Mozilla components,  | 
                    |
| 1269 | 
                        +interfaces and settings upon which it relies.  | 
                    |
| 1270 | 
                        +  | 
                    |
| 1271 | 
                        + </p><div class="sect2" title="7.1. Single state testing"><div class="titlepage"><div><div><h3 class="title"><a id="SingleStateTesting"></a>7.1. Single state testing</h3></div></div></div><p>  | 
                    |
| 1272 | 
                        +  | 
                    |
| 1273 | 
                        +Torbutton is a complicated piece of software. During development, changes to  | 
                    |
| 1274 | 
                        +one component can affect a whole slough of unrelated features. A number of  | 
                    |
| 1275 | 
                        +aggregated test suites exist that can be used to test for regressions in  | 
                    |
| 1276 | 
                        +Torbutton and to help aid in the development of Torbutton-like addons and  | 
                    |
| 1277 | 
                        +other privacy modifications of other browsers. Some of these test suites exist  | 
                    |
| 1278 | 
                        +as a single automated page, while others are a series of pages you must visit  | 
                    |
| 1279 | 
                        +individually. They are provided here for reference and future regression  | 
                    |
| 1280 | 
                        +testing, and also in the hope that some brave soul will one day decide to  | 
                    |
| 1281 | 
                        +combine them into a comprehensive automated test suite.  | 
                    |
| 1282 | 
                        +  | 
                    |
| 1283 | 
                        + </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><a class="ulink" href="http://decloak.net/" target="_top">Decloak.net</a><p>  | 
                    |
| 1284 | 
                        +  | 
                    |
| 1285 | 
                        +Decloak.net is the canonical source of plugin and external-application based  | 
                    |
| 1286 | 
                        +proxy-bypass exploits. It is a fully automated test suite maintained by <a class="ulink" href="http://digitaloffense.net/" target="_top">HD Moore</a> as a service for people to  | 
                    |
| 1287 | 
                        +use to test their anonymity systems.  | 
                    |
| 1288 | 
                        +  | 
                    |
| 1289 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://deanonymizer.com/" target="_top">Deanonymizer.com</a><p>  | 
                    |
| 1290 | 
                        +  | 
                    |
| 1291 | 
                        +Deanonymizer.com is another automated test suite that tests for proxy bypass  | 
                    |
| 1292 | 
                        +and other information disclosure vulnerabilities. It is maintained by Kyle  | 
                    |
| 1293 | 
                        +Williams, the author of <a class="ulink" href="http://www.janusvm.com/" target="_top">JanusVM</a>  | 
                    |
| 1294 | 
                        +and <a class="ulink" href="http://www.januspa.com/" target="_top">JanusPA</a>.  | 
                    |
| 1295 | 
                        +  | 
                    |
| 1296 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://www.jondos.de/en/anontest" target="_top">JonDos  | 
                    |
| 1297 | 
                        +AnonTest</a><p>  | 
                    |
| 1298 | 
                        +  | 
                    |
| 1299 | 
                        +The <a class="ulink" href="https://www.jondos.de" target="_top">JonDos people</a> also provide an  | 
                    |
| 1300 | 
                        +anonymity tester. It is more focused on HTTP headers than plugin bypass, and  | 
                    |
| 1301 | 
                        +points out a couple of headers Torbutton could do a better job with  | 
                    |
| 1302 | 
                        +obfuscating.  | 
                    |
| 1303 | 
                        +  | 
                    |
| 1304 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://browserspy.dk" target="_top">Browserspy.dk</a><p>  | 
                    |
| 1305 | 
                        +  | 
                    |
| 1306 | 
                        +Browserspy.dk provides a tremendous collection of browser fingerprinting and  | 
                    |
| 1307 | 
                        +general privacy tests. Unfortunately they are only available one page at a  | 
                    |
| 1308 | 
                        +time, and there is not really solid feedback on good vs bad behavior in  | 
                    |
| 1309 | 
                        +the test results.  | 
                    |
| 1310 | 
                        +  | 
                    |
| 1311 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://analyze.privacy.net/" target="_top">Privacy  | 
                    |
| 1312 | 
                        +Analyzer</a><p>  | 
                    |
| 1313 | 
                        +  | 
                    |
| 1314 | 
                        +The Privacy Analyzer provides a dump of all sorts of browser attributes and  | 
                    |
| 1315 | 
                        +settings that it detects, including some information on your origin IP  | 
                    |
| 1316 | 
                        +address. Its page layout and lack of good vs bad test result feedback makes it  | 
                    |
| 1317 | 
                        +not as useful as a user-facing testing tool, but it does provide some  | 
                    |
| 1318 | 
                        +interesting checks in a single page.  | 
                    |
| 1319 | 
                        +  | 
                    |
| 1320 | 
                        + </p></li><li class="listitem"><a class="ulink" href="http://ha.ckers.org/mr-t/" target="_top">Mr. T</a><p>  | 
                    |
| 1321 | 
                        +  | 
                    |
| 1322 | 
                        +Mr. T is a collection of browser fingerprinting and deanonymization exploits  | 
                    |
| 1323 | 
                        +discovered by the <a class="ulink" href="http://ha.ckers.org" target="_top">ha.ckers.org</a> crew  | 
                    |
| 1324 | 
                        +and others. It is also not as user friendly as some of the above tests, but it  | 
                    |
| 1325 | 
                        +is a useful collection.  | 
                    |
| 1326 | 
                        +  | 
                    |
| 1327 | 
                        + </p></li><li class="listitem">Gregory Fleischer's <a class="ulink" href="http://pseudo-flaw.net/content/tor/torbutton/" target="_top">Torbutton</a> and  | 
                    |
| 1328 | 
                        +<a class="ulink" href="http://pseudo-flaw.net/content/defcon/dc-17-demos/d.html" target="_top">Defcon  | 
                    |
| 1329 | 
                        +17</a> Test Cases  | 
                    |
| 1330 | 
                        + <p>  | 
                    |
| 1331 | 
                        +  | 
                    |
| 1332 | 
                        +Gregory Fleischer has been hacking and testing Firefox and Torbutton privacy  | 
                    |
| 1333 | 
                        +issues for the past 2 years. He has an excellent collection of all his test  | 
                    |
| 1334 | 
                        +cases that can be used for regression testing. In his Defcon work, he  | 
                    |
| 1335 | 
                        +demonstrates ways to infer Firefox version based on arcane browser properties.  | 
                    |
| 1336 | 
                        +We are still trying to determine the best way to address some of those test  | 
                    |
| 1337 | 
                        +cases.  | 
                    |
| 1338 | 
                        +  | 
                    |
| 1339 | 
                        + </p></li><li class="listitem"><a class="ulink" href="https://torcheck.xenobite.eu/index.php" target="_top">Xenobite's  | 
                    |
| 1340 | 
                        +TorCheck Page</a><p>  | 
                    |
| 1341 | 
                        +  | 
                    |
| 1342 | 
                        +This page checks to ensure you are using a valid Tor exit node and checks for  | 
                    |
| 1343 | 
                        +some basic browser properties related to privacy. It is not very fine-grained  | 
                    |
| 1344 | 
                        +or complete, but it is automated and could be turned into something useful  | 
                    |
| 1345 | 
                        +with a bit of work.  | 
                    |
| 1346 | 
                        +  | 
                    |
| 1347 | 
                        + </p></li></ol></div><p>  | 
                    |
| 1348 | 
                        + </p></div><div class="sect2" title="7.2. Multi-state testing"><div class="titlepage"><div><div><h3 class="title"><a id="id2549304"></a>7.2. Multi-state testing</h3></div></div></div><p>  | 
                    |
| 1349 | 
                        +  | 
                    |
| 1350 | 
                        +The tests in this section are geared towards a page that would instruct the  | 
                    |
| 1351 | 
                        +user to toggle their Tor state after the fetch and perform some operations:  | 
                    |
| 1352 | 
                        +mouseovers, stray clicks, and potentially reloads.  | 
                    |
| 1353 | 
                        +  | 
                    |
| 1354 | 
                        + </p><div class="sect3" title="Cookies and Cache Correlation"><div class="titlepage"><div><div><h4 class="title"><a id="id2549316"></a>Cookies and Cache Correlation</h4></div></div></div><p>  | 
                    |
| 1355 | 
                        +The most obvious test is to set a cookie, ask the user to toggle tor, and then  | 
                    |
| 1356 | 
                        +have them reload the page. The cookie should no longer be set if they are  | 
                    |
| 1357 | 
                        +using the default Torbutton settings. In addition, it is possible to leverage  | 
                    |
| 1358 | 
                        +the cache to <a class="ulink" href="http://crypto.stanford.edu/sameorigin/safecachetest.html" target="_top">store unique  | 
                    |
| 1359 | 
                        +identifiers</a>. The default settings of Torbutton should also protect  | 
                    |
| 1360 | 
                        +against these from persisting across Tor Toggle.  | 
                    |
| 1361 | 
                        +  | 
                    |
| 1362 | 
                        + </p></div><div class="sect3" title="Javascript timers and event handlers"><div class="titlepage"><div><div><h4 class="title"><a id="id2549339"></a>Javascript timers and event handlers</h4></div></div></div><p>  | 
                    |
| 1363 | 
                        +  | 
                    |
| 1364 | 
                        +Javascript can set timers and register event handlers in the hopes of fetching  | 
                    |
| 1365 | 
                        +URLs after the user has toggled Torbutton.  | 
                    |
| 1366 | 
                        + </p></div><div class="sect3" title="CSS Popups and non-script Dynamic Content"><div class="titlepage"><div><div><h4 class="title"><a id="id2549351"></a>CSS Popups and non-script Dynamic Content</h4></div></div></div><p>  | 
                    |
| 1367 | 
                        +  | 
                    |
| 1368 | 
                        +Even if Javascript is disabled, CSS is still able to  | 
                    |
| 1369 | 
                        +<a class="ulink" href="http://www.tjkdesign.com/articles/css%20pop%20ups/" target="_top">create popup-like  | 
                    |
| 1370 | 
                        +windows</a>  | 
                    |
| 1371 | 
                        +via the 'onmouseover' CSS attribute, which can cause arbitrary browser  | 
                    |
| 1372 | 
                        +activity as soon as the mouse enters into the content window. It is also  | 
                    |
| 1373 | 
                        +possible for meta-refresh tags to set timers long enough to make it likely  | 
                    |
| 1374 | 
                        +that the user has toggled Tor before fetching content.  | 
                    |
| 1375 | 
                        +  | 
                    |
| 1376 | 
                        + </p></div></div><div class="sect2" title="7.3. Active testing (aka How to Hack Torbutton)"><div class="titlepage"><div><div><h3 class="title"><a id="HackTorbutton"></a>7.3. Active testing (aka How to Hack Torbutton)</h3></div></div></div><p>  | 
                    |
| 1377 | 
                        +  | 
                    |
| 1378 | 
                        +The idea behind active testing is to discover vulnerabilities in Torbutton to  | 
                    |
| 1379 | 
                        +bypass proxy settings, run script in an opposite Tor state, store unique  | 
                    |
| 1380 | 
                        +identifiers, leak location information, or otherwise violate <a class="link" href="#requirements" title="1.2. Torbutton Requirements">its requirements</a>. Torbutton has ventured out  | 
                    |
| 1381 | 
                        +into a strange and new security landscape. It depends on Firefox mechanisms  | 
                    |
| 1382 | 
                        +that haven't necessarily been audited for security, certainly not for the  | 
                    |
| 1383 | 
                        +threat model that Torbutton seeks to address. As such, it and the interfaces  | 
                    |
| 1384 | 
                        +it depends upon still need a 'trial by fire' typical of new technologies. This  | 
                    |
| 1385 | 
                        +section of the document was written with the intention of making that period  | 
                    |
| 1386 | 
                        +as fast as possible. Please help us get through this period by considering  | 
                    |
| 1387 | 
                        +these attacks, playing with them, and reporting what you find (and potentially  | 
                    |
| 1388 | 
                        +submitting the test cases back to be run in the standard batch of Torbutton  | 
                    |
| 1389 | 
                        +tests.  | 
                    |
| 1390 | 
                        +  | 
                    |
| 1391 | 
                        + </p><div class="sect3" title="Some suggested vectors to investigate"><div class="titlepage"><div><div><h4 class="title"><a id="id2549406"></a>Some suggested vectors to investigate</h4></div></div></div><p>  | 
                    |
| 1392 | 
                        + </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">Strange ways to register Javascript <a class="ulink" href="http://en.wikipedia.org/wiki/DOM_Events" target="_top">events</a> and <a class="ulink" href="http://www.devshed.com/c/a/JavaScript/Using-Timers-in-JavaScript/" target="_top">timeouts</a> should  | 
                    |
| 1393 | 
                        +be verified to actually be ineffective after Tor has been toggled.</li><li class="listitem">Other ways to cause Javascript to be executed after  | 
                    |
| 1394 | 
                        +<span class="command"><strong>javascript.enabled</strong></span> has been toggled off.</li><li class="listitem">Odd ways to attempt to load plugins. Kyle Williams has had  | 
                    |
| 1395 | 
                        +some success with direct loads/meta-refreshes of plugin-handled URLs.</li><li class="listitem">The Date and Timezone hooks should be verified to work with  | 
                    |
| 1396 | 
                        +crazy combinations of iframes, nested iframes, iframes in frames, frames in  | 
                    |
| 1397 | 
                        +iframes, and popups being loaded and  | 
                    |
| 1398 | 
                        +reloaded in rapid succession, and/or from one another. Think race conditions and deep,  | 
                    |
| 1399 | 
                        +parallel nesting, involving iframes from both <a class="ulink" href="http://en.wikipedia.org/wiki/Same_origin_policy" target="_top">same-origin and  | 
                    |
| 1400 | 
                        +non-same-origin</a> domains.</li><li class="listitem">In addition, there may be alternate ways and other  | 
                    |
| 1401 | 
                        +methods to query the timezone, or otherwise use some of the Date object's  | 
                    |
| 1402 | 
                        +methods in combination to deduce the timezone offset. Of course, the author  | 
                    |
| 1403 | 
                        +tried his best to cover all the methods he could foresee, but it's always good  | 
                    |
| 1404 | 
                        +to have another set of eyes try it out.</li><li class="listitem">Similarly, is there any way to confuse the <a class="link" href="#contentpolicy" title="@torproject.org/cssblocker;1 - components/cssblocker.js">content policy</a>  | 
                    |
| 1405 | 
                        +mentioned above to cause it to allow certain types of page fetches? For  | 
                    |
| 1406 | 
                        +example, it was recently discovered that favicons are not fetched by the  | 
                    |
| 1407 | 
                        +content, but the chrome itself, hence the content policy did not look up the  | 
                    |
| 1408 | 
                        +correct window to determine the current Tor tag for the favicon fetch. Are  | 
                    |
| 1409 | 
                        +there other things that can do this? Popups? Bookmarklets? Active bookmarks? </li><li class="listitem">Alternate ways to store and fetch unique identifiers. For example, <a class="ulink" href="http://developer.mozilla.org/en/docs/DOM:Storage" target="_top">DOM Storage</a>  | 
                    |
| 1410 | 
                        +caught us off guard.  | 
                    |
| 1411 | 
                        +It was  | 
                    |
| 1412 | 
                        +also discovered by <a class="ulink" href="http://pseudo-flaw.net" target="_top">Gregory  | 
                    |
| 1413 | 
                        +Fleischer</a> that <a class="ulink" href="http://pseudo-flaw.net/content/tor/torbutton/" target="_top">content window access to  | 
                    |
| 1414 | 
                        +chrome</a> can be used to build <a class="link" href="#fingerprinting">unique  | 
                    |
| 1415 | 
                        +identifiers</a>.  | 
                    |
| 1416 | 
                        +Are there any other  | 
                    |
| 1417 | 
                        +arcane or experimental ways that Firefox provides to create and store unique  | 
                    |
| 1418 | 
                        +identifiers? Or perhaps unique identifiers can be queried or derived from  | 
                    |
| 1419 | 
                        +properties of the machine/browser that Javascript has access to? How unique  | 
                    |
| 1420 | 
                        +can these identifiers be?  | 
                    |
| 1421 | 
                        + </li><li class="listitem">Is it possible to get the browser to write some history to disk  | 
                    |
| 1422 | 
                        +(aside from swap) that can be retrieved later? By default, Torbutton should  | 
                    |
| 1423 | 
                        +write no history, cookie, or other browsing activity information to the  | 
                    |
| 1424 | 
                        +harddisk.</li><li class="listitem">Do popup windows make it easier to break any of the above  | 
                    |
| 1425 | 
                        +behavior? Are javascript events still canceled in popups? What about recursive  | 
                    |
| 1426 | 
                        +popups from Javascript, data, and other funky URL types? What about CSS  | 
                    |
| 1427 | 
                        +popups? Are they still blocked after Tor is toggled?</li><li class="listitem">Chrome-escalation attacks. The interaction between the  | 
                    |
| 1428 | 
                        +Torbutton chrome Javascript and the client content window javascript is pretty  | 
                    |
| 1429 | 
                        +well-defined and carefully constructed, but perhaps there is a way to smuggle  | 
                    |
| 1430 | 
                        +javascript back in a return value, or otherwise inject network-loaded  | 
                    |
| 1431 | 
                        +javascript into the chrome (and thus gain complete control of the browser).  | 
                    |
| 1432 | 
                        +</li></ul></div><p>  | 
                    |
| 1433 | 
                        +  | 
                    |
| 1434 | 
                        + </p></div></div></div></div></body></html>  | 
                    |
| 0 | 1435 |