Понимание вектора атаки
Как работают хэш-карты
Скажем, форма комментариев в блоге принимает параметры — 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).
Вкратце: если вы вставите тысячи ключей с одинаковым хэш-кодом, серверу потребуется много циклов ЦП.
Как вы генерируете ключи с одним и тем же хэшем?
В 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. Значение по умолчанию — 10 000. Чем ниже, тем лучше, если это не нарушает вашу функциональность.
Ограничьте размер POST-запроса. Чтобы атака сработала, полезная нагрузка должна быть огромной. Размер POST по умолчанию, разрешенный Tomcat, составляет 2 МБ. Уменьшение этого значения до 200 КБ снизит эффективность этой атаки. Параметр в tomcat — maxPostSize.
Брандмауэр веб-приложения. Если у вас есть брандмауэр веб-приложения, вы можете настроить его так, чтобы блокировать запросы, которые выглядят подозрительно. Это реактивная мера, но она полезна, если вы не можете использовать одно из вышеперечисленных решений.
К сведению: документация Tomcat находится здесь — http://tomcat.apache.org/tomcat-6.0-doc/config/http.html
person
Sripathi Krishnan
schedule
29.12.2011