wtorek, 8 lutego 2011

Jaki jest Twój ulubiony numer?

Ostatnio wśród wielbicieli i zagorzałych przeciwników Javy modne stało się pytanie o ulubioną liczbę.
Skąd takie pytanie?
Otóż jest pewien wartość sprawiająca Javie kłopoty.

Jaki jest Twoim zdaniem efekt uruchomienia programu:

package pl.matt.fne;

public class Main {
public static void main(String[] args) {
double d = Double.valueOf("22.250738585072012e-309");
System.out.println(d);
}
}

No więc niestety. Program uruchamia się bez końca. Po prostu się zapętla. Także ulubionym numerem prawdziwego hakera jest ostatnio:
22.250738585072012e-309.

Próbę wytłumaczenia tego fenomenu można znaleźć pod tym adresem. Ja niestety wymiękłem podczas analizy klasy FloatingDecimal.

22.250738585072012e-309 to bardzo przebiegła liczba.
Spróbujmy skompilować program:

package pl.matt.fne;

public class Main {
public static void main(String[] args) {
double d = 22.250738585072012e-309;
System.out.println(d == 12);
}
}

Znowu niespodzianka.
javac też się zawiesza.

Czy ta ciekawostka może być groźna.
Ano może.
Wyobraźmy sobie aplikację, która przyjmuje podaną użytkownika liczbę niecałkowitą i konwertuje ją do zmiennej typu double.
Odpowiednio spreparowane żądanie do takiej aplikacji może na zawsze zająć jej wątek. Atak DoS jak się patrzy.
Spróbuję w przyszłym tygodniu przygotować przykład ilustrujący ten scenariusz.

Tymczasem Oracle wypuścił patcha mającego wyeliminować powyższe niedogodności.
Działa u was?
Ja jeszcze nie instalowałem.

4 komentarze:

ags pisze...

308

pnowicki pisze...

ten sam problem dotyczy też PHP

WooKasZ pisze...

lud domaga się nowych postów!

kadoel pisze...

Cholernie ciężko ją analizować. Operacje na bitach maski etc. Ciekawe gdzie tkwi błąd.