On Nov 15, 2012, at 12:22 AM, Chris Evans <[email protected]> wrote:

> On Wed, Nov 14, 2012 at 11:32 PM, Maciej Stachowiak <[email protected]> wrote:
> 
> On Nov 14, 2012, at 11:09 PM, Chris Evans <[email protected]> wrote:
> 
>> On Wed, Nov 14, 2012 at 8:59 PM, Ryosuke Niwa <[email protected]> wrote:
>> On Wed, Nov 14, 2012 at 8:52 PM, Elliott Sprehn <[email protected]> wrote:
>> I was present for one of the discussions about the exploit and how an arena 
>> like allocator could have helped at Google. One proposed solution was to 
>> allocate all the JS typed buffers in an arena.
>> 
>> Is there a reason we can't just do that? It's much less intrusive to 
>> allocate ArrayBuffer in an arena than to allocate all DOM objects in one.
>> 
>> I don’t think allocating all JS objects in an arena is good enough because 
>> attackers can inject nearly arbitrary sequence of bytes into DOM objects 
>> (e.g. text node).
>> 
>> Yeah, pretty much this. The worry is that it's very hard to be sure you've 
>> identified all cases / classes where the attacker has reasonable control 
>> over the size and exact content of the allocation. You have to start looking 
>> at the buffers backing ArrayBuffers, the buffers backing WTF::Vectors, the 
>> buffers backing the (multitude of) string classes, and even then, you're 
>> left worrying about objects that simply have a bunch of consecutive ints 
>> that the attacker can set as properties, etc. And even in the unlikely event 
>> you catch everything in WebKit, you still have other very 
>> attacker-controllable allocations going on in the same process such as audio 
>> and video packets; canvas buffers; rendered image buffers; the list goes on. 
>> I don't think it's a battle than can be won.
>> 
>> So we think the problem is best approached from another observation:
>> 
>> - Use-after-free of certain classes is either very lethal, or very common, 
>> or both.
>> 
>> Use-after-free is pretty common for the RenderObject hierarchy and the Node 
>> hierarchy. Inferno ran a quick script for use-after-free stats in automated 
>> ClusterFuzz reports and it was approximately 332 Render and 134 Node. Due to 
>> historical accident, we already have a protection for RenderObject.
>> 
>> The most lethal use-after-frees, though, are DOM objects. A freed DOM object 
>> is often wired directly into Javascript and the attacker can prod all sorts 
>> of methods and properties on the freed object in order to cause a chosen set 
>> of accesses (corresponding to reads, writes and vtable usages under the 
>> covers) in a chosen order.
>> 
>> I'm not comfortable sharing it verbatim on a public list, but happy to send 
>> you a copy of the Pinkie Pie exploit if you're interested. It relies on a 
>> lethal DOM use-after-free.
>> 
>> Because use-after-free in the Node hierarchy is both common and lethal, a 
>> separate allocation area seems a profitable path forward.
> 
> It still seems to me like the key difference is vtable vs no vtable,
> 
> It's an important difference, but if we partitioned in to two based on that 
> difference alone, we'd have the following issues:
> 
> 1) Classes with multiple vtables would spoil our day. The sheer number of 
> classes in the "vtable" partition would practically ensure that an attacker 
> could overlap data of their choosing on top of a secondary vtable.
> Overlap of attacker data onto a secondary vtable is also a concern with the 
> DOM partition approach, but the chances of it being possible are much much 
> lower. In the Pinkie Pie exploit case, the DOM arena solution made it 
> impossible.
> 
> 2) The Pinkie Pie exploit wasn't exclusively about the vtable.
> Before you can abuse an overlap with a freed vtable pointer, you need to 
> defeat ASLR. This was partly achieved by overlapping the pointer and size of 
> a freed WTF::Vector member with arbitrary data. (This is highly dangerous for 
> DOM objects as it can lead to a direct arbitrary memory read or write 
> primitive from Javascript!) Again, the sheer number of classes in a "vtable" 
> partition would make a collision profitable to the attacker a statistical 
> likelihood. Again, with a strict DOM arena, possibilities are really shut 
> down. Back to the Pinkie Pie case, there wasn't any immediately useful 
> overlap in either the 32-bit or 64-bit memory layout.

I would probably need to know more about it to comment intelligently. Maybe we 
could discuss offline or on the security list.

> 
> rather than DOM vs. not DOM. Also having a per-document arena for DOM nodes 
> (as is done for render objects via RenderArena) seems irrelevant to the 
> security goal and likely to cause bad memory fragmentation.
> 
> My read on the Arena is that it's fragmentation resistant (i.e. it will not 
> repurpose a larger free chunk to satisfy a smaller allocation.) However, 
> memory usage at any given time is defined by peak usage since it cannot 
> release pages back to the system without ruining its security guarantee.

I'm talking about external fragmentation, not internal fragmentation. 
RenderArena is not resistant to it in any way.

> Interestingly, it can't be super bad: we already bite this bullet for 
> RenderArena as used by RenderObjects. The RenderArena lifetime is the same as 
> the document / DOM and I was surprised to recently be told that we don't 
> throw away the RenderArena on a full layout.

As mentioned previously, RenderObjects have some key different properties - 
they are guaranteed not to outlive the Document (or more specifically 
Document::detach) and they cannot be transferred from one render tree to 
another. So you know the whole arena can be discarded at a deterministic time. 
But that doesn't work for DOM nodes.

Regards,
Maciej




_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to