On Thu, Mar 1, 2012 at 9:54 AM, Geoffrey Sneddon <[email protected]> wrote:
> On 26/02/12 09:39, David Bruant wrote: > >> Le 26/02/2012 01:23, Geoffrey Sneddon a écrit : >> >>> I've basically implemented something close to what is attributed to >>> >>> Dave Herman on the wiki in Carakan now, albeit without the context >>> check, though I agree it's a good idea. I wonder if it's >>> web-compatible to disallow cross-context prototype chains (both >>> through __proto__ and Object.create). >>> >> What is asked to be disallowed is only changing the prototype with >> __proto__ in a cross-context manner. >> Creating cross-context chains with Object.create has not been discussed >> I think and should be fine... >> >> ....or not? >> Given an attacker from context A, a defender from context D (I'll use >> these letters to refer to the global object of each context). An >> attacker can create an object like >> ----- >> var maliciousProto = Object.create(D.Object.**prototype); >> // Add whatever own properties to maliciousProto >> >> someObjectInD.__proto__ = maliciousProto >> ----- >> >> I was enthusiastic by Gavin Object.prototype ownership-based solution, >> but it seems that as long as an attacker has the possibility to create >> cross-context objects, an Object.prototype-based solution actually does >> not prevent anything. >> > > I don't think there's much in the way of a security risk here (given that > if you have access to D anyway you can execute arbitrary code within it). Hi Geoffrey, I agree with your conclusion -- the Object.prototype-based solution seems sound -- see my previous reply to David. But I completely disagree with your reasoning. Now that ES5 is deployed, you can lock down D so that you can execute untrusted code in it securely. In fact, this is the *only* form of execution in which modern browsers support confinement of untrusted code. HTML5 unique origin sandboxed iframes are much weaker as a security mechanism -- in this and many other ways. > Even if __proto__ has been deleted you can just create a new object > "someObjectInD" with mailiciousProto through Object.create. > > The only reason to prefer to avoid cross-context prototype chains is one > of elegance: in my view it seems somewhat inelegant, though the more I > think about it the less I can justify that position. > > > The one thing I would prefer, however, would be that the setter is >>> optional (i.e., it is permissible to have __proto__ have just a getter >>> or have both a getter and a setter, but not just a setter). >>> >> I think that it's unrealistic since the web does use the setter as well. >> If the setter was standardized as optional, all implementations would >> implement it anyway. >> > > I was speaking to Jeff Walden a few or two back about this — both of us at > least still live in hope of someday getting rid of the setter. As far as > either of us are aware, there isn't much legacy for the setter, mostly > concentrated within a few libraries, which hopefully we can evangelize it > out of — and then re-evaluate where we are in a few years and see whether > the legacy has decreased, and older versions of the libraries have gone. > Being obliged per spec to implement the setter forever seems undesirable, > if we can manage to get rid of the legacy. > > > -- > Geoffrey Sneddon — Opera Software > <http://gsnedders.com> > <http://opera.com> > ______________________________**_________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/**listinfo/es-discuss<https://mail.mozilla.org/listinfo/es-discuss> > -- Cheers, --MarkM
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

