On Nov 11, 2013, at 5:33 PM, Ryosuke Niwa <[email protected]> wrote:

> On Nov 11, 2013, at 5:13 PM, Adam Barth <[email protected]> wrote:
>> On Mon, Nov 11, 2013 at 12:57 AM, Ryosuke Niwa <[email protected]> wrote:
>>> On Nov 11, 2013, at 3:56 PM, Adam Barth <[email protected]> wrote:
>>>> Can you help me understand what security properties your proposal
>>>> achieves and how it achieves them?  I spent some time thinking about
>>>> this problem a couple of years ago when this issue was discussed in
>>>> depth, but I couldn't come up with a design that was simultaneously
>>>> useful and secure.
>>>> 
>>>> For example, your proposal seems to have the vulnerability described below:
>>>> 
>>>> == Trusted container document ==
>>>> 
>>>> <link rel="import"
>>>> href="https://untrusted.org/untrusted-components.html";
>>>> importcomponents="name-card">
>>>> <body>
>>>> <name-card ></name-card>
>>>> 
>>>> == untrusted-components.html ==
>>>> 
>>>> <template defines="name-card" interface="NameCardElement">
>>>> Name: {{name}}<br>Email:{{email}}
>>>> </template>
>>>> <script>
>>>> NameCardElement.prototype.created = function (shadowRoot) {
>>>> var victim = shadowRoot.ownerDocument;
>>>> var script = victim.createElement("script");
>>>> script.textContent = "alert(/hacked/);";
>>>> victim.body.appendChild(script);
>>>> };
>>>> </script>
>>>> 
>>>> Maybe I'm not understanding your proposal correct?  If this issue is
>>>> indeed a vulnerability with your proposal, I have no doubt that you
>>>> can modify your proposal to patch this hole, but iterating in that way
>>>> isn't likely to lead to a secure design.
>>> 
>>> The owner document of the shadow root in that case will be that of the 
>>> component; i.e. https://untrusted.org/untrusted-components.html in this 
>>> case.
>>> 
>>> In other words, we’re inserting a security boundary between the host 
>>> element and the shadow root.  The shadow root in this case is a funky node 
>>> object in that it has its host element in an entirely different document.
>> 
>> Was that written somewhere in your proposal and I missed it?
> 
> I intended to state this in point 6 but now I realize it wasn’t entirely 
> clear from the way I phrase it so let me elaborate a little more on this 
> point.
> 
> When a cross-origin custom element is instantiated, the browser creates the 
> JS wrapper for the custom element in the context of the imported document.  
> It then creates a shadow root inside the imported document, attaches it to 
> the host element, and calls createdCallback with the shadow root.
> 
> The custom element JS object is only visible inside the imported document.  
> It’s HTMLUnknownElement in the context of the host document although we’re 
> open to creating a proxy/fake element subclass which is not visible in the 
> global scope and identical to HTMLKnownElement in its prototype chain in the 
> host document as well.

Of course, the imported document will have a different script context (i.e. 
global object) than the host document.

(Anne: Thank you for pointing this out).

- R. Niwa

Reply via email to