Friday, August 29, 2008

Ode to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug that almost was

This post is a tribute to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hundreds of bugs that never quite were serious, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emotional roller coaster ride on which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y take researchers.

Some brief background. The skill in finding serious bugs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days isn't in being a demon code auditor or a furious fuzzer; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are thousands of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se. The skill lies instead in finding a piece of software, or a piece of functionality, that has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 curious mix of being important yet not having seen much scrutiny.

Onto today's almost-bug: an interesting integer condition in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ZIP parser of Sun's JDK. The ZIP parser is a critical piece of code because not only is it used to parse JARs, but also server-side Java applications will often parse untrusted ZIPs. (Such direct server-side attacks, along cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lines of my JDK ICC parser vulnerabilities last year, are nasty, and starting to recently become in-vogue for Python, Ruby and Perl too). The affected API is java.util.zip.ZipFile. Best I know, java.util.zip.ZipInputStream is not backed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same native code, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby unaffected.

The interesting code, in zip_util.c follows:


/* Following are unsigned 32-bit */
jlong endpos, cenpos, cenlen;
...
/* Get position and length of central directory */
cenlen = ENDSIZ(endbuf);
if (cenlen > endpos)
ZIP_FORMAT_ERROR("invalid END header (bad central directory size)");
cenpos = endpos - cenlen;


jlong is a signed 64-bit type. The ENDSIZ macro, because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way it is formulated, returned a signed int. Therefore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 assignment to cenlen triggers sign extension. This means that cenlen can end up being negative, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stated intent of being treated as an unsigned 32-bit quantity. The negative value will of course bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security check and lead to subsequent undesirable state. (Note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best fix is not to enhance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check, but to add a cast to unsigned int to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying macro as it is used in multiple places).

So why does this appear to be just a bug and not a security vulnerability? Well, on systems without mmap(), a huge allocation will eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cleanly fail, or a read() attempt past EOF will cleanly fail. On systems with mmap(), things are more interesting. A 32-bit build will attempt a 2Gb large mapping on a potentially much smaller file. This could lead to interesting SIGBUS conditions as a server DoS. By quite some luck, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Sun JVM process seems to spray mappings liberally through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address space, leaving no room for a contiguous 2Gb mapping.

The same sign-extension bug exists in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r parts of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ZIP handling, and leads to some interesting negative values getting to some interesting places. But lower-level sanity checks save cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 day in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cases that I could find.

A zip file capable of triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interesting log line "mmap failed for CEN and END part of zip file" is available at http://scary.beasts.org/misc/mmap_fail.zip.

Ah well, maybe next time. Come to thing of it, my pipeline does include real JDK vulns. Watch this space.

3 comments:

Alex said...

I heard about not bad application-Fix zip file, recovers information from damaged zip files and minimizes data loss during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zip recovery process, allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program to minimize data loss during zip recovery, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user sees as much as possible about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 files being recovered, repair self-extracting (SFX) files.

Raju said...

Thanks for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nice post.

Anonymous said...

Do you know a very nice application Advanced Advanced Zip Repair. It is a powerful tool to recover messages, folders and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r objects from corrupt or damaged zip files.