Волшебные числа сводят Java с ума dl // 08.02.11 02:35
В актуальной версии Java обнаружилась уязвимость, связанная с обработкой чисел с плавающей точкой. [Не забывайте при копировании материала указывать полный адрес источника: //bugtraq.ru/rsn/archive/2011/02/01.html] Присваивании double-переменным чего-нибудь очень маленького с большим количеством значащих цифр (конкретные "волшебные" числа лежат в диапазоне от 2.2250738585072011E-208 до 2.2250738585072013E-208) уводит фреймворк в бесконечный цикл со стопроцентной загрузкой процессора. Как минимум уязвимости подвержены 32 и 64-битные windows-версии JRE/JDK 1.6.0_23, проверялась (успешно) и 32-битная OpenSuse-версия. Судя по всему, ошибка заключена в коде, отвечающем за аппроксимацию вещественных значений - код, пытающийся подобраться как можно ближе к правильному значению, в подобных условиях просто зацикливается.
Любопытно, что всего месяц назад точно такая же проблема была обнаружена в PHP. Тогда у разработчиков ушло всего два дня на исправление, но вряд ли стоит ожидать такой оперативности от Oracle. С учетом того, сколь незначительными усилиями можно использовать данную уязвимость для эффективной DoS-атаки, разработчикам стоит самим взяться за спасение утопающих. В качестве основного рецепта предлагается фильтровать потенциально вредоносную последовательность 2.225073858507201 (вредоносные числа, мама дорогая) перед конвертацией полученных извне строк в числа.