РЕДАКТИРОВАТЬпо тому, как точка обходной путь здесь, чтобы повторно использовать все существующие HashMap (как ConcurrentHashMap и т.д.) вместо того, чтобы заново изобретать полностью колесо. Языки с использованием рандомизированных хеш-функций (например, Perl) защищены от этой атаки.Отделка HashMap добавления случайности, чтобы предотвратить (D) DoS
В свете недавнего и разрушительного DDoS, использующего известный недостаток в нескольких реализациях hashmap (известный как веб-серверы Java, но также PHP и другие), Apache Tomcat только что вышел с «исправлением» в форме патч, позволяющий установить ограничение на максимально допустимое количество параметров в запросе POST (исправить ваш Tomcat до версии 6.0.35+ или 7.0.23+ кстати).
DoS, по-видимому, в основном использует тот факт, что строки могут создаваться так, что они сталкиваются при хэшировании и что многие веб-серверы «глупо» ставят параметры ключа/значения в (сломанные) хэшмапы.
Мне было интересно, можно ли написать декоратор вокруг HashMap {String, String}, чтобы каждая строка добавила случайную (случайную с точки зрения атакуемого) значение в String, как это:
... get(String s) {
return wrappedBrokenMap.get(s + crunch(s);
}
... put(String key, String value) {
wrappedBrokenMap.put(s + crunch(s), value);
}
И здесь бы одна реализация хруста (...) (это просто пример, дело: злоумышленник не знает реализации):
private static final int MY_MAGICAL_NUMBER = 0x42BABE; // attacker doesn't know that number
private static String crunch(String s) {
return s.length + "" + MY_MAGICAL_NUMBER;
}
Если для любой строки s crunch (s) возвращает воспроизводимую строку, которую злоумышленник не может догадаться, эффективно предотвращена атака DDoS?
Будет ли это работать?
Вместо того, чтобы использовать жёстко прописанный номер, который всегда имеет свои проблемы (открыть снабжают получает код .. «интересно», по крайней мере), почему бы не использовать 'System.milliSeconds()' при запуске вместо. Похоже, это простое решение, если hashmaps не сериализованы. – Voo
У вас есть ссылка на эту атаку? Я не совсем понимаю, с тех пор, когда происходит столкновение, оно разрешено. Я думаю, что Java использует связанный список для встречных ведер. – toto2
@ toto2 Древняя атака действительно, но теперь есть некоторые средства - статья [ars] (http://arstechnica.com/business/news/2011/12/huge-portions-of-web-vulnerable-to-hashing-denial -of-сервис-attack.ars). Дело в том, что если вы помещаете миллионы объектов в карту, чьи ключи все сопоставляются с одним и тем же ведром, вы получаете производительность связанного списка, в который вы всегда вставляете в конец (т. Е. Вставку и поиск O (n)). – Voo