Thursday, August 21, 2014

What does a pointer look like, anyway?

Posted by Chris Evans, Renderer of Modern Art



These updates resolve memory leakage vulnerabilities that could be used to bypass memory address randomization (CVE-2014-0540, CVE-2014-0542, CVE-2014-0543, CVE-2014-0544, CVE-2014-0545).

I reported cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter four of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se. I’d like to thank Adobe for fixing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m so quickly -- about 30 days between report and broad availability of a patch. That’s well within Project Zero’s 90-day deadline on bug disclosure.
They are all interesting bugs in image decoding, leading to uninitialized pixels in image canvases. There exist rich ActionScript APIs to read pixels out of canvases, so any uninitialized data can be examined easily by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker. Let’s take a visual tour of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 four bugs:

CVE-2014-0542  [link to our public bug]

flashleak.png
The image above, which includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “got probable pointer” text, is a sample rendering from running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proof of concept file. The trigger for this bug is a particularly weird JPEG image: one with two color components per pixel. Most images have one component per pixel (greyscale) or three components per pixel (red, green, blue or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r scheme). In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of two color components, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image processing “gave up” on rendering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 foreign image. This left completely uninitialized RGB (red, green, blue) values in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 canvas, thus leaking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory that was last allocated where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new canvas now is.

If you look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probable pointer value, you’ll see that one byte is marked as “??”. This is because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 canvas is in fact RGBA (red, green, blue, alpha) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alpha component -- which is every fourth byte -- is initialized to a constant 0xff value.
CVE-2014-0543  [link to our public bug]

1bpp.png
The trigger for this bug is a 1bpp image. 1bpp is shorthand for “one bit per pixel”. If we just have 1 bit to represent every pixel, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image should only contain two different colors, one color for pixels where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit is 0 and anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r color for pixels where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit is 1.

Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image, we have a rich range of colors so right away we know something is wrong. What has happened here is that 1bpp images can be declared in a SWF image tag, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are not supported. Upon hitting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unsupported image, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 per-row conversion code “gives up”, leaving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row buffer uninitialized. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is just one row buffer (it is reused every row), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image looks very distinct. Every row is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same.

The long hexadecimal number below cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image represents a bit of uninitialized data pulled out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image canvas and into script.
CVE-2014-0544  [link to our public bug]

8bppleak.png
This bug resolves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question “what does a pointer look like?” cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most definitively. It also leaks contiguous uninitialized memory very clearly, making it cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most powerful leak yet. There is no “??” in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extracted pointer value, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no uncertainty.

The bug works by rendering image pixels that are compressed via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zlib compression algorithm. This particular image is a 64x64 canvas, which requires 4096 pixels to fill. The trick we pull is to terminate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zlib stream immediately, after emitting exactly 0 pixels. This leaves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 canvas… you guessed it… uninitialized.

If you look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image, you’ll notice it appears to be comprised of columns. This effect is because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 width is 64 pixels, and a pointer is 8 bytes (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se images are all rendered on 64-bit Linux). Since 64 is an exact multiple of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer size, any pointers will be nicely aligned. And this image is chock full of pointers. A pointer value on 64-bit Linux is particularly visible because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two most significant bytes are zero (rendered as black), leading to distinct vertical black bars.
CVE-2014-0545  [link to our public bug]

jpgalpha.png
This final bug is also a very powerful memory leak, as evidenced by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complete pointer value extracted. It also works by embedding truncated zlib stream in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image. In this case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 truncated zlib stream (again truncated a 0 pixels) is for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image’s alpha channel. By extracting only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alpha channel byte values from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rendered image, we can recover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content of contiguous uninitialized memory.

Conclusion

My personal conclusion is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a strange beauty to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 visualization of uninitialized memory and pointer values. I hope you enjoyed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se slightly unusual bugs.

1 comment:

  1. Thank you so much for posting this article. It's really helped me a lot. I really appreciat for posting

    PIC Scheme Singapore

    ReplyDelete