A bug in Oracle's Java programming framework causes computers to freeze when they encounter certain numerical values with large numbers of decimal places, a flaw that makes websites susceptible to highly efficient denial-of-service attacks.
The vulnerability in the latest version of Java is similar to a flaw discovered last month that plagued the PHP language. It is trigged when applications attempt to process values such as 2.2250738585072011e-308. Systems running both Windows- and Linux-based apps that try to assign the value to a “double” variable succumb to an infinite loop that consumes 100 percent of their CPU's resources.
Bryan Sullivan, a senior security researcher at Adobe Systems, has dubbed the bugs “application-level denial of service” vulnerabilities and warned they make sensitive websites vulnerable to attacks that can inflict serious harm with minimal resources.
“The worst part about all of these techniques is that they’re both extremely effective at soaking up server resources and also extremely asymmetric in terms of attacker effort versus effect,” he wrote last month. “In most cases, a single HTTP request of less than 1,000 bytes is enough to exploit the vulnerability. This essentially reduces the attacker’s cost to zero, makes it unlikely that he’ll ever be caught, and makes it even more unlikely that you’ll be able to prevent the attack with any kind of IPS or firewall.”
Sullivan has offered a simple blacklist filtering script that developers can use to insulate their Java-based apps from danger until Oracle issues a patch. The temporary workaround is easy enough to use, but it may generate false positives, he said.
The Java vulnerability was first disclosed by Konstantin Preißer. He said that Windows machines running the latest 32-bit or 64-bit editions of JRE/JDK 1.6.0_23 were vulnerable. He also experienced the problem with 32-bit Java running on OpenSuse Linux.
The bug stems from the difficulty of representing some floating-point numbers in the binary format that computers need to perform certain tasks. Such values are frequently best approximations that are calculated by the underlying CPU. As Sullivan explained in an email to The Register:
The problem with this particular range of values that causes the hang for Java is that there's a logic flaw in the Java code that performs the approximation. There's a loop in the code that tests different possibilities to try to get as close as possible to the correct value: a little higher value this iteration, then a little lower, and so on until the best approximation is made. But when this code tries to approximate values around 2.225073858507201E-208, it loops forever, never finding an acceptable approximation.
It took PHP maintainers about 48 hours to fix the denial-of-service bug after it first came to light. Oracle has generally not been as nimble in fixing security bugs in Java except when security watchers raise a big stink.
Word of the denial-of-service threat came a few days before a separate researcher warned of an unrelated Java bug that makes users vulnerable to attacks that allow hackers to rename or upload files at will and could be used for delayed Remote Code Execution exploits. Researcher Sami Koivu said he reported the flaw to Sun in 2008 but that it still hasn't been fixed.®