Thursday, July 16, 2015

Significant Flash exploit mitigations are live in v18.0.0.209

Posted by Mark Brand and Chris Evans, isolators of heaps


Whilst Project Zero has gained a reputation for vulnerability and exploitation research, that's not all that we do. One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main reasons we perform this research is to provide data to defenders; and one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 things that defenders can do with this data is to devise exploit mitigations.

Sometimes, we'll take on exploit mitigations ourselves. Recently, we've been working with Adobe on Flash mitigations, and this post describes some significant mitigations have landed over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past couple of Flash versions.

Now is a good time to check your current Flash version because you really want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest one. For example, if you're running Google Chrome, you can visit about:version to check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 versions of various components. If you have Flash v18.0.0.209 (or newer), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new goodies. If not, you can (on Windows) visit chrome://chrome to give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 autoupdater a kick. (If you’re running an older version of Chrome, you will in fact receive a more active warning and block when encountering Flash content.)

Before we dive into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technicalities of some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mitigations landed, it's worth reminding ourselves how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vast majority of recent Flash 0-day, 1-day and research exploits have worked:



In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above diagram, we see a heap overflow vulnerability being exploited. The attacker has performed "heap grooming", which attempts to place an object of interest after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object from which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap overflow originates. The chosen object of interest is a Vector. buffer, which starts with a length. The desired corruption is to corrupt and increase this length. This technique was used in recent 0-days, as well as various 1-days.



And in this diagram, we see a use-after-free vulnerability being exploited. The attacker has caused a heap chunk to be freed whilst it is still referenced. The attacker cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n allocates a Vector. into this freed heap chunk and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsequent use-after-free writes over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Vector. length with a larger value. This technique was used in at least two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 recent Hacking Team 0-days.

The commonality between both cases is an abuse of a corruption of a Vector. buffer object's length, which has been cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 go-to method for Flash exploitation for a while. Aside from 0-days and 1-days, Project Zero's own research has used this technique. For example, when working on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new exploit primitive "parallel thread corruption", we used Vector.. And why wouldn't we? There's no point in doing something complicated when something simple exists to solve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem. And it is exactly because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Vector. primitive is so simple and powerful that it needs to be addressed.

Mitigation: Vector. buffer heap partitioning

Heap partitioning is a technique that isolates different types of objects on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap from one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Chrome uses heap partitioning extensively, and it has become a common defensive technique in multiple browsers. We have now introduced this technology into Flash. In its initial form, Vector. buffer objects (and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r very similar objects) are now isolated from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general Flash heap, because we put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard system heap:



We have now defended cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integrity of Vector. buffers from both heap overflow and use-after-free attacks! In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of a heap overflow within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Vector. buffer objects are simply not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re to corrupt. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use-after-free, when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker tries to allocate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Vector. buffer to occupy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 free heap chunk of interest, it will not end up being allocated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re because it lives in a different heap.

It's worth noting that this defense is much more powerful in a 64-bit build of Flash, because of address space limitations of 32-bit processes. Now is a good time to upgrade to a 64-bit browser and Flash. For example, if you're using Chrome on Windows 7 x64 (or newer), you might be running a 32-bit browser on a 64-bit capable system. To check, visit chrome://chrome and look for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string "64-bit" -- its presence or absence will indicate whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r you have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 32-bit or 64-bit build. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r details on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advantages of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 64-bit Windows build are covered on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromium blog.

Mitigation: stronger randomization for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap

One day, while browsing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap mappings for a Flash process on x64 Windows 7, we noticed a strong determinism in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 position of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap. We filed bug 276, which is now fixed. Beyond fixing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 immediate issue of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap being at a predictable location, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch we provided had useful side effects to hamper exploitation:

  • Large allocations (> 1MB) are also randomized better than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y used to be. This means, for example, that this previous Project Zero work, which relied on 1GB+ allocations being packed in predictable locations, is no longer a viable exploitation technique.

  • On 64-bit systems, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap will likely end up very far away from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r memory mappings. This provides some interesting properties. For example, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same exploit, a buffer length is corrupted and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n used to read function pointers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PLT section of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash library. A buffer length is typically 32-bit, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 range of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corruption that can be effected by an errant buffer might be something like 2^32 * sizeof(unsigned int), or 16GB. With this new mitigation in place, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary sections are unlikely to be close enough to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap for buffer corruptions to be able to reach cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. The attacker would need an additional level of indirection.

To look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime effect of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 combination of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above two mitigations, we can run a simple Flash program which allocates a large Vector. and a large ByteArray:

     _bigVec = new Vector.;
     _bigVec.length = ((512 * 1024 * 1024) - 500) / 4;
     _bigVec[0] = 0xf2f2f2f2;
     _bigArr = new ByteArray();
     _bigArr.length = 512 * 1024 * 1024;
     _bigArr[0] = 0xf1;

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting process mappings; Chrome Linux x64 in this case:

2d7ef200000-2d7ef209000   rw-p 00000000 00:00 0
35001005000-35022005000   rw-p 00000000 00:00 0  // Isolated 512MB ByteArray buffer.
a7026000000-a7026100000   rw-p 00000000 00:00 0
[...]
11655c57f000-11657c87f000 rw-p 00000000 00:00 0  // tcmalloc heap; Vector.
                                                // buffer at 0x11655c6ae000
[...]
3d3c8715f000-3d3c8716f000 r-xp 00000000 00:00 0  // Main Flash heap mappings (x3)
3d3c8716f000-3d3c8760b000 rw-p 00000000 00:00 0
3d3c8760b000-3d3c87f4b000 ---p 00000000 00:00 0

This new heap partitioning is currently enabled for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pepper plug-in versions of Flash, so you can see it in action right away in Google Chrome (all operating systems). Adobe are planning to extend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 partitioning to cover non-Pepper plug-ins in August.

Mitigation: Vector.<*> length validation

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same Flash patch, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are not one, but two mitigations for Vector length corruptions! This second mitigation was authored by Adobe. It works by storing Vector lengths alongside a validation secret. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker corrupts a length, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not know what value to set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 secret to, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting mismatch results in a runtime abort. This mitigation is present across all Flash builds as of 18.0.0.209.

It may sound strange to have two mitigations for one exploitation primitive, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mitigations actually complement each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r very nicely. Heap partitioning is very effective in 64-bit builds, but address space limitations can cause a bit of a squeeze in 32-bit. Perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best example of this is our blog post on bug 229, which is a bug that only has impact on 32-bit builds. The primitive provided by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to write at any absolute address in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 32-bit address space. Obviously, this primitive crosses partitions and a heap spray on 32-bit can make a chosen address likely to be mapped. Therefore, attempts to exploit this bug on 32-bit may sidestep partitioning but get hampered by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length validation.

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap partitioning does not cover Vector. buffers due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way garbage collection works. The length validation covers this and all types of Vector. Finally, we note that Vector. buffers are (currently) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system heap as opposed to a distinct partition. So even though most allocations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash process occur in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s still cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possibility that a memory corruption in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system heap could corrupt a Vector. buffer and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length validation helps here.

The future

We believe we've contributed a strong step forward in Flash security, but we're very far from finished. For every mitigation landed by defenders, attackers will attempt to devise a counter-mitigation. It's a cat-and-mouse-game, but we'll be looking out for attackers' attempts to adapt, and devising furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r mitigations based on what we see. Perhaps more importantly, we're also devising a next level of defenses based on what we expect we might see. Our partitioning mitigation is far from finished. We’ll be analyzing object types to see what else might benefit from partitioning, and moving forward incrementally.

On top of this, we're continuing to help lock down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various browser sandboxes, and working on compiler-based mitigations. As always, we'll fully share our work when we have something interesting to show.

We'd like to thank Adobe for working with us.

2 comments:

  1. Great post! Mitigations like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se can significantly raise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bar and delay cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next wave of Flash 0days.

    ReplyDelete
  2. Does this cover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Linux" version (11.2.202.481) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advisory? Or is this anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r reason to avoid cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 combination of Flash+Firefox+Linux?

    ReplyDelete