Ответ 1
Понимание вектора атаки
Как работают HashMaps
Скажем, форма комментария в блоге принимает параметры - first_name, last_name, comment - в качестве параметров публикации. Внутри Tomcat хранит эти параметры в виде HashMap.
Логическая структура этого HashMap такая:
"first_name" --> "Sripathi"
"last_name" --> "Krishnan"
"comment" ---> "DoS using poor Hashes"
Но физическая структура отличается. Ключи сначала преобразуются в hashCode, а затем hashCode преобразуется в индекс массива.
Таким образом, идеальная физическая структура становится
0 --> "Sripathi"
1 --> "Krishnan"
2 --> "DoS using poor Hashes"
Но возможные ключи бесконечны. Так что в какой-то момент два ключа будут иметь одинаковый хеш-код. Это становится коллизиям хэшей.
При столкновениях физическая структура становится:
0 --> "Sripathi", "Krishnan"
1 --> Empty
2 --> "DoS using poor hashes"
Хеш-коллизии и влияние на производительность
Когда у вас есть коллизии хешей, вставка новой записи означает последовательную итерацию по всем элементам в одном "хеше" хеша, просто чтобы выяснить, существует ли она уже на карте. Вставка одного элемента может приблизить сложность O (n), если все элементы хешируют к одному значению. Вставка n элементов в этом наихудшем случае усложняет O (n * n).
Вкратце: если вы вставите тысячи ключей с одинаковым hashCode, серверу потребуется много циклов ЦП.
Как вы генерируете ключи с тем же хешем?
В Java "Aa" и "BB" имеют одинаковый хэш-код.
Благодаря свойству "Эквивалентные подстроки" мы можем сгенерировать несколько других строк с тем же хеш-кодом, просто начав с этих 2 строк.
Первая итерация: "AAAA", "AABb", "BbAA", "BbBb" имеют одинаковый хэш-код
Теперь у нас есть 4 строки с одинаковым хеш-кодом. Мы можем переставить их для генерации 16 строк, которые будут иметь одинаковый хэш-код. Например:
"AaAaAaAa", "AaAaBBBB", "AaAaAaBB", "AaAaBBAa",
"BBBBAaAa", "BBBBBBBB", "BBBBAaBB", "BBBBBBAa",
"AaBBAaAa", "AaBBBBBB", "AaBBAaBB", "AaBBBBAa",
"BBAaAaAa", "BBAaBBBB", "BBAaAaBB", "BBAaBBAa",
Все эти 16 строк имеют одинаковый хэш-код.
Теперь вы можете взять эти 16 строк и сгенерировать 256 строк с одинаковым хеш-кодом.
Короче говоря: очень легко создать большой набор строк, которые будут иметь точный хэш-код.
Как вы атакуете сервер?
- Создайте тысячи строк с одинаковым хеш-кодом (см. Выше)
- Создайте POST-запрос следующим образом: AaAa = & AaBB = & BBAa = & BBBB =....
- Отправить форму
- Повторите в цикле и создайте несколько потоков, чтобы все ресурсы сервера были использованы
Поскольку это всего лишь запрос POST, злоумышленник также может использовать невинные браузеры для атаки на сервер. Просто найдите веб-сайт с уязвимостью межсайтового скриптинга, вставьте код для выполнения запроса POST, а затем используйте социальную инженерию, чтобы распространить ссылку как можно большему числу пользователей.
профилактика
Как правило, базовая платформа не может это исправить. Это считается проблемой структуры приложения. Другими словами, это должен исправить Tomcat, а не Oracle/Sun.
Возможные исправления включают в себя:
-
Ограничьте количество параметров POST - Tomcat 6.0. 35+ имеет новый параметр maxParameterCount. Значение по умолчанию составляет 10000. Чем ниже, тем лучше, если это не нарушает вашу функциональность.
-
Ограничьте размер запроса POST - чтобы атака работала, полезная нагрузка должна быть огромной. POST по умолчанию, разрешенный Tomcat, составляет 2 МБ. Сокращение этого до 200КБ снизит эффективность этой атаки. Параметром в tomcat является maxPostSize
-
Брандмауэр веб-приложений - если у вас есть брандмауэр веб-приложений, вы можете настроить его для блокировки запросов, которые выглядят подозрительно. Это реактивная мера, но ее приятно иметь в случае, если вы не можете использовать одно из указанных выше решений.
К вашему сведению - документация Tomcat находится здесь - http://tomcat.apache.org/tomcat-6.0-doc/config/http.html