Monday, September 24, 2012

The joys and hazards of multi-process browser security

Web browsers with some form of multi-process model are becoming increasingly common. Depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact setup, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re can be significant consequences for security posture and exploitation methods.

Spray techniques

Probably cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most significant security effect of multi-process models is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effect on spraying. Spraying, of course, is a technique where parts of a processes' heap or address space are filled with data helpful for exploitation. It's sometimes useful to spray cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap with a certain pattern of data, or spray cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address space in general with executable JIT mappings, or both.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 good ol' days, when every part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser and all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 plug-ins were run in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same process, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were many possible attack permutations:
  • Spray Java JIT pages to exploit a browser bug.
  • Spray Java JIT pages to exploit a Flash bug.
  • Spray Flash JIT pages to exploit a browser bug.
  • Spray Java JIT pages to exploit Java.
  • You could even spray browser JS JIT pages to exploit Java if you wanted to ;-)
  • ...etc.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 good ol' days, various things happened to lock all this down:
  • The Java plug-in was rearchitected so that it runs out-of-process in most browsers.
  • IE and Chromium placed page limits on JavaScript-derived JIT pages (covered a little in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 famous Accuvant paper.)
  • Firefox introduced its out-of-process plug-ins feature (for some plug-ins, most notably Flash) and Chromium had all plug-ins out-of-process since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first release.

The end result is trickier exploitation, although it's worth noting that one worrysome combination remains: IE still runs Flash in-process, and this has been abused by attackers in many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 recent IE 0days.

One-shot vs. multi-shot

The terms "one-shot" and "multi-shot" have long been used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world of server-side exploitation. "One-shot" refers to a service that is dead after just one crash -- so your exploit had better be reliable! "Multi-shot" refers to a service whereby it remains running after your lousy exploit causes a crash. This could be because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 service has a parent process that launches new children if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y die or it could simply be because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 service is launched by a framework that automatically restarts dead services.

Although moving to a multi-process browser is generally very positive thing for security and stability, you do run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risk of introducing "multi-shot" attacks.

In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, let's say your exploit isn't 100% reliable. Wouldn't it be nice if you could just use a bit of JavaScript to run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit over and over in a child process until it works? Perhaps you simply weren't able to default ASLR and you're in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 situation where you have a 1/256 chance of your hard-coded address being correct. Again, this could be brute-forced in a "multi-shot" attack.

The most likely "multi-shot" attacks are against plug-ins that are run out-of-process, or against browser tabs, if browser tabs can have separate processes.

These attacks can be defended against by limiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rate of child process crashes or spawns. Chromium deploys some tricks in this area.

Broker escalation

Once an attack has gained code execution inside a sandbox, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are various directions it might go next. It might attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS kernel. Or for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purposes of this discussion, it might attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 privileged broker. The privileged broker typically runs outside of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox, so any memory corruption vulnerability in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 broker is a possible avenue for sandbox escape.

To attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory corruption bug, you'll likely need to defeat DEP / ASLR in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 broker process. An interesting question is, how far along are you already, by virtue of code execution in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxed process? Obviously, you know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full memory map layout of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compromised sandboxed process.

The answer, is it depends on your OS and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various processes relate to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. The situation is not ideal on Windows; due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS works, certain system-critical DLLs are typically located at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same address across all processes. So ASLR in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 broker process is already compromised to an extent, no matter how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxed processes are created. I found this interesting.

The situation is better on Linux, where each process can have a totally different address space layout, including system libraries, executable, heap, etc. This is taken advantage of by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromium "zygote" process model for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxed processes. So a compromise of a sandboxed process does not give any direct details about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address space layout of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 broker process. There may be ways to leak it, but not directly, and /proc certainly isn't mapped in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxed context! All this is anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r reason I recommend 64-bit Linux running Chrome as a browsing platform.