On Wed, Apr 29, 2015 at 11:12 AM, C. Scott Ananian <[email protected]>
wrote:

> On Wed, Apr 29, 2015 at 2:07 PM, Mark S. Miller <[email protected]>
> wrote:
>
>> Hi Scott, I think your approach is on the right track. How about the
>> following?
>>
>> Anyone see a way to attack it?
>>
>>
>>
>> const goodPromises = new WeakSet();
>> class DefensivePromise {
>>   constructor(x) {
>>     super(x);
>>     if (new.target === DefensivePromise) {
>>       Object.freeze(this);
>>       goodPromises.add(this);
>>     }
>>   }
>>   static resolve(x) {
>>     if (goodPromises.has(x)) {
>>       return x;  // should be equiv to super.resolve(x);
>>     }
>>     return new DefensivePromise(r => {r(x)});
>>   }
>> }
>>
>
> Assuming that you don't export DefensivePromise to the attacker, this is
> fine.  Otherwise, I think this is still vulnerable to Reflect.construct
> lying about new.target:
> ```
> class BadPromise extends DefensivePromise {
>   then(r) { r(); r(); }
> }
> var bp = Reflect.construct(BadPromise, DefensivePromise);
> ```
>

Clever. Yes, this attack works.



> Since it's `Promise.then` you care about, I think the approach in my
> previous message (where `then` is tested directly) is preferable.
>  --scott
>

As demonstrated, vulnerable to TOCTTOU.



-- 
    Cheers,
    --MarkM
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to