Какие виды веб-приложений могут реально зависеть от плавающей ошибки? - PullRequest
9 голосов
/ 09 февраля 2011

Существует простой способ полностью заблокировать много JVM:

class runhang {
public static void main(String[] args) {
  System.out.println("Test:");
  double d = Double.parseDouble("2.2250738585072012e-308");
  System.out.println("Value: " + d);
 }
}

или, чтобы повесить компилятор:

class compilehang {
public static void main(String[] args) {
  double d = 2.2250738585072012e-308;
  System.out.println("Value: " + d);
 }
}

как объяснено здесь: http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

У меня очень простой вопрос: какие хорошо продуманные веб-приложения вы знаете, на которые это может реально повлиять?

Другими словами: на каких веб-приложениях злоумышленник может выполнить Отказ в обслуживании , используя этот известный недостаток?

Это плохо, это ужасно плохо. Но кроме программистов, использующих вычисления с плавающей запятой для денежных вычислений, я не вижу многих сайтов с поддержкой Java, которые могут быть повреждены.

Я могу видеть, как игрушечные научные апплеты являются кандидатами, но кроме этого ...

Вот нить заблокированного потока (выполняется с помощью «kill -3» в Linux):

"main" prio=1 tid=0x09ab8a10 nid=0x57e9 runnable [0xbfbde000..0xbfbde728]
        at sun.misc.FDBigInt.mult(FloatingDecimal.java:2617)
        at sun.misc.FloatingDecimal.multPow52(FloatingDecimal.java:158)
        at sun.misc.FloatingDecimal.doubleValue(FloatingDecimal.java:1510)
        at java.lang.Double.parseDouble(Double.java:482)

EDIT

JVM заблокированы здесь:

Java-версия "1.5.0_10" Среда выполнения Java (TM) 2, стандартная версия (сборка 1.5.0_10-b03) Серверная виртуальная машина Java HotSpot (TM) (сборка 1.5.0_10-b03, смешанный режим)

Java-версия "1.6.0_17" Java (TM) SE Runtime Environment (сборка 1.6.0_17-b04) Серверная виртуальная машина Java HotSpot (TM) (сборка 14.3-b01, смешанный режим)

Ответы [ 5 ]

8 голосов
/ 10 февраля 2011

Многие веб-серверы анализируют часть заголовков http, используя Double.parse, поэтому мы имеем дело с инфраструктурой (в дополнение к любым проблемам с приложениями, которые запускаются в контейнере).В комментариях блога «Изучение двоичного кода», на который вы ссылаетесь, в качестве примера приведено следующее:

GET / HTTP/1.1
Host: myhost
Connection: keep-alive
Accept-Language: en-us;q=2.2250738585072012e-308

Если сервлет, против которого идет запрос, вызывает любой из API локализации (который затем попытаетсяразберите языковой заголовок), приведенное выше приведет к остановке сервера.

Так что да, это очень большая проблема.Поверхность атаки довольно велика, а последствия достаточно велики.

7 голосов
/ 09 февраля 2011

Ненавижу утверждать очевидное, но все приложения, которые позволяют пользователю отправлять строку "2.2250738585072011e-308" и вызывают parse double on, могут "реально" быть затронуты.

4 голосов
/ 10 февраля 2011

Все версии Tomcat были исправлены и выпущены для обработки условия «Accept-Language».

Oracle выпустила оперативное исправление, которое можно найти здесь:

http://www.oracle.com/technetwork/java/javase/fpupdater-tool-readme-305936.html

Исправление будет работать для Java 1.4, 1.5 и 1.6.

1 голос
/ 09 февраля 2011

Все, что вы позволяете пользователю вводить с плавающей запятой и сравнивать или вычислять его, должно быть подозрительным. Я бы сказал, что форма оплаты, кредитный калькулятор и форма для торгов будут наиболее распространенными. Все, что потребуется, - это маленькая утилита калькулятора во всем приложении, чтобы можно было повесить веб-сервер при повторных попаданиях.

0 голосов
/ 12 февраля 2011

Я понимаю, что это число только одно из целого ряда, которое может вызвать сбой приложения, но просто не может противостоять комментированию, проверьте последние 4 цифры. 2012, это говорит о многом из числа, древний предсказанный конец света, и наши современные приложения указывают на порог сбоя, если не исправлено: -)

...