Понимание вектора атаки
Как работают HashMaps
Скажем, форма комментария в блоге принимает параметры - first_name, last_name, comment - в качестве параметров публикации.Внутри Tomcat сохраняет эти параметры в виде HashMap.
Логическая структура этого HashMap выглядит следующим образом -
"first_name" --> "Sripathi"
"last_name" --> "Krishnan"
"comment" ---> "DoS using poor Hashes"
Но физическая структура это отличается.Сначала ключи преобразуются в хеш-код, а затем хэш-код преобразуется в индекс массива.
Идеальная физическая структура , таким образом, становится -
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" имеют одинаковый хэш-код.
Из-за свойства, называемого "Эквивалентные подстроки", мы можем сгенерировать несколько других строк с одинаковымихэш-код, просто начиная с этих двух строк.
Первая итерация: «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