[tbb-dev] Bug: plugin-container exhausts memory leading to thrash and/or crash

Georg Koppen gk at torproject.org
Fri Nov 24 09:22:00 UTC 2017


Hi!

astian:
> STR
> ---

Thanks for the detailed bug report and the patch. That's really
appreciated. I've created
https://trac.torproject.org/projects/tor/ticket/24398 for your report.

I am sorry that you had issues with out bug tracker. One thing you might
be interested in is that we don't require an account to be created
before commenting/reporting bugs. You can use the "cypherpunks" account
for that. See: https://trac.torproject.org/projects/tor "Unofficial
Documentation" for more about that.

Georg

> 1. Run one of the platforms affected by the recent "tormoil" vulnerability (I
>    tested this on a GNU/Linux distro).
> 
> 2. Under Tor Browser 7.0.10's installation directory, create
>    `Browser/TorBrowser/Data/Browser/profile.default/chrome/userContent.css`
>    with the following content (you can use whatever you want here, just adjust
>    the next steps accordingly):
> 
>      body {
>        background-color: blue !important;
>        color: white !important;
>      }
> 
> 3. Start Tor Browser.
> 
> 4. Confirm that the content background looks blue.
> 
> 5. Right click the blue background on an empty spot (body element) and choose
>    "Inspect Element".
> 
> 6. Wait until the Inspector window shows up.  Observe memory consumption of
>    process "plugin-container" continually rise.
> 
> Analysis
> --------
> 
> I think this regression is caused by the workaround [0] for the recent critical
> vulnerability [1], but it has exposed what looks to me (not being privy to the
> details of "tormoil") like another bug, this one in javascript code.
> 
>   0: https://gitweb.torproject.org/tor-browser.git/commit/?h=tor-browser-52.5.0esr-7.0-1&id=643117230bb3402c997f065980db1eec19c7a6ed
>   1: https://trac.torproject.org/projects/tor/ticket/24052
> 
> `newChannelForURL` in DevToolsUtils.js (packed inside
> `Browser/browser/omni.ja`) will recursively call itself when
> `NetUtil.newChannel` raises an exception, prepending "file://" to the input
> URL:
> 
>   /**
>    * Opens a channel for given URL. Tries a bit harder than NetUtil.newChannel.
>    *
>    * @param {String} url - The URL to open a channel for.
>    * @param {Object} options - The options object passed to @method fetch.
>    * @return {nsIChannel} - The newly created channel. Throws on failure.
>    */
>   function newChannelForURL(url, { policy, window, principal }) {
>     var securityFlags = Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL;
> 
>     let uri;
>     try {
>       uri = Services.io.newURI(url, null, null);
>     } catch (e) {
>       // In the xpcshell tests, the script url is the absolute path of the test
>       // file, which will make a malformed URI error be thrown. Add the file
>       // scheme to see if it helps.
>       uri = Services.io.newURI("file://" + url, null, null);
>     }
> 
>     [...]
> 
>     try {
>       return NetUtil.newChannel(channelOptions);
>     } catch (e) {
>       // In xpcshell tests on Windows, nsExternalProtocolHandler::NewChannel()
>       // can throw NS_ERROR_UNKNOWN_PROTOCOL if the external protocol isn't
>       // supported by Windows, so we also need to handle the exception here if
>       // parsing the URL above doesn't throw.
>       return newChannelForURL("file://" + url, { policy, window, principal });
>     }
>   }
> 
> With the mentioned patch, the call to `NetUtil.newChannel` raises an
> exception.  This results in infinite recursion coupled with rapid (though
> linear) memory consumption.  Thus, `plugin-container` will, in just a few
> seconds, exhaust all available memory.
> 
> Partial fix
> -----------
> 
> AFAICT, the current patch for "tormoil" is just a hurried stop-gap workaround
> and as such it is acceptable, and somewhat expected, for it to cause other,
> less severe, kinds of breakage.  However, ISTM that the code in
> `newChannelForURL` is buggy regardless: the recursion has no (evident)
> termination condition.
> 
> The comment before the recursive call says that it is needed due to some tests
> for which `newChannel` can raise `NS_ERROR_UNKNOWN_PROTOCOL`.  So maybe it
> should only catch the exception (and make the recursive call) if the error is
> that one and `url` does not already start with "file://".  The attached patch
> does this.  It does not fix the regression (the Developer Toolbox still fails
> to show the appropriate styles and stylesheets), but at least fixes the DoS
> caused by the runaway memory allocation.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.torproject.org/pipermail/tbb-dev/attachments/20171124/3622c70d/attachment.sig>


More information about the tbb-dev mailing list