Closed
Bug 692067
Opened 13 years ago
Closed 13 years ago
WebSockets don't trigger content policies
Categories
(Core :: Networking: WebSockets, defect)
Core
Networking: WebSockets
Tracking
()
RESOLVED
FIXED
mozilla11
People
(Reporter: ecfbugzilla, Assigned: khuey)
References
(Blocks 1 open bug, )
Details
(Whiteboard: [parity-Chrome][sg:low])
Attachments
(1 file, 2 obsolete files)
(deleted),
patch
|
smaug
:
review+
dveditz
:
review+
|
Details | Diff | Splinter Review |
It seems that the current WebSockets implementation creates a connection without triggering content policies. I would have expected a content policies call in nsWebSocket::Init(), probably with type nsIContentPolicy.TYPE_OTHER and the requesting document as context (similar to XMLHttpRequest). It is generally strange that aPrincipal parameter in this function is unused, shouldn't there be some security checks beyond HTTPS-to-HTTP check? Steps to reproduce:
* Install Adblock Plus from (https://addons.mozilla.org/addon/adblock-plus/), restart browser.
* Go to http://html5demos.com/web-socket
* Press Ctrl-Shift-V to open the list of blockable items that Adblock Plus shows.
Expected results:
ws://node.remysharp.com:8001 shows up in the list of requests made by the page.
Actual results (Firefox 7.0.1 and current 10.0a1 nightly):
No such request, web socket requests go completely unnoticed by extensions like Adblock Plus.
Note that Chrome correctly reports WebSocket requests via its webRequest API (http://code.google.com/chrome/extensions/trunk/experimental.webRequest.html).
Assignee | ||
Updated•13 years ago
|
Assignee: nobody → khuey
Assignee | ||
Comment 1•13 years ago
|
||
Attachment #570671 -
Flags: review?(Olli.Pettay)
Comment 2•13 years ago
|
||
Comment on attachment 570671 [details] [diff] [review]
Patch
>+ // Check content policy.
>+ PRInt16 shouldLoad = nsIContentPolicy::ACCEPT;
>+ rv = NS_CheckContentLoadPolicy(nsIContentPolicy::TYPE_XMLHTTPREQUEST,
TYPE_DATAREQUEST
>+ mURI,
>+ mPrincipal,
>+ originDoc,
>+ EmptyCString(),
>+ nsnull,
>+ &shouldLoad,
>+ nsContentUtils::GetContentPolicy(),
>+ nsContentUtils::GetSecurityManager());
>+ NS_ENSURE_SUCCESS(rv, rv);
>+ if (NS_CP_REJECTED(shouldLoad)) {
>+ // Disallowed by content policy.
>+ return NS_ERROR_CONTENT_BLOCKED;
Ok, this is consistent with XHR.
Could you file a followup to change the error type. It should be something defined
in some spec. Maybe SECURITY_ERR or NETWORK_ERR.
Attachment #570671 -
Flags: review?(Olli.Pettay) → review+
Assignee | ||
Comment 3•13 years ago
|
||
Sure.
Assignee | ||
Comment 4•13 years ago
|
||
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla10
Assignee | ||
Comment 5•13 years ago
|
||
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
Assignee | ||
Comment 6•13 years ago
|
||
This failed on tinderbox because nsNoDataProtocolContentPolicy is vetoing WebSockets loads since they come from a protocol that has URI_DOES_NOT_RETURN_DATA set.
I'm not really sure which side is broken here, the protocol or the content policy. Boris?
Comment 7•13 years ago
|
||
The content policy is doing this very much on purpose. It only exists to not allow loads of protocols that would cause external apps to run, unknown protocol alerts to pop up, and whatnot and whatnot, except in a very restricted set of contexts.
On the assumption that the protocol actually has DOES_NOT_RETURN_DATA for a reason, seems like the right fix is to use a new nsIContentPolicy type for this check and whitelist it in the content policy...
Assignee | ||
Comment 8•13 years ago
|
||
More like this, then.
Attachment #570671 -
Attachment is obsolete: true
Attachment #571335 -
Flags: review?(bugs)
Assignee | ||
Comment 9•13 years ago
|
||
Forgot to qref
Attachment #571335 -
Attachment is obsolete: true
Attachment #571335 -
Flags: review?(bugs)
Attachment #571336 -
Flags: review?(bugs)
Updated•13 years ago
|
Attachment #571336 -
Flags: review?(dveditz)
Attachment #571336 -
Flags: review?(bugs)
Attachment #571336 -
Flags: review+
Comment 10•13 years ago
|
||
Comment on attachment 571335 [details] [diff] [review]
Patch
Nix the trailing comma in the old comment?
Assignee | ||
Comment 11•13 years ago
|
||
dveditz, can you review this before the next aurora merge?
Comment 12•13 years ago
|
||
If web sockets weren't triggering content policies then they were also not controllable by CSP.
Whiteboard: [parity-Chrome] → [parity-Chrome][sg:low]
Comment 13•13 years ago
|
||
Comment on attachment 571336 [details] [diff] [review]
Now with qref
Review of attachment 571336 [details] [diff] [review]:
-----------------------------------------------------------------
r=dveditz with those changes, especially the contentSecurityPolicy.js one
::: content/base/public/nsIContentPolicy.idl
@@ +145,1 @@
> /* Please update nsContentBlocker when adding new content types. */
Websockets will bypass CSP, unlike EventSource which uses TYPE_DATAREQUEST. you'll need to add a line like the one for XHR at https://mxr.mozilla.org/mozilla-central/source/content/base/src/contentSecurityPolicy.js#104
csp._MAPPINGS[cp.TYPE_WEBSOCKET] = cspr_sd.XHR_SRC;
The "XHR_SRC" is on purpose, we're aliasing those together per the CSP spec (needs to be renamed "connect-src", but that's bug 666056)
::: extensions/permissions/nsContentBlocker.cpp
@@ +68,5 @@
> "objectsubrequest",
> "dtd",
> "font",
> + "media",
> + "websocket"};
I guess "websocket" should be added to NS_CP_ContentTypeName(), too, but I can't find any callers so maybe we can just kill the whole function as DEADC0DE
https://mxr.mozilla.org/mozilla-central/source/content/base/public/nsContentPolicyUtils.h#124
Attachment #571336 -
Flags: review?(dveditz) → review+
Comment 14•13 years ago
|
||
+ /**
+ * Indicated a WebSocket load.
+ */
Also, s/Indicated/Indicates/
Assignee | ||
Comment 15•13 years ago
|
||
Status: REOPENED → RESOLVED
Closed: 13 years ago → 13 years ago
Resolution: --- → FIXED
Target Milestone: mozilla10 → mozilla11
You need to log in
before you can comment on or make changes to this bug.
Description
•