ИЗМЕНИТЬ кстати, смысл обходного пути здесь заключается в повторном использовании всего существующего HashMap (например, ConcurrentHashMap и т. д.) вместо того, чтобы полностью изобретать колесо. Языки, использующие рандомизированные хеш-функции (например, Perl), защищены от этой атаки.
В свете недавней и разрушительной DDoS-атаки с использованием известной уязвимости в нескольких реализациях хэш-карт (известно, что они влияют на веб-серверы Java, а также на PHP и другие), Apache Tomcat только что выпустил «исправление» в виде патча, позволяющего поставить ограничение максимально допустимого количества параметров в POST-запросе (кстати, исправьте Tomcat до версии 6.0.35+ или 7.0.23+).
(D)DoS, по-видимому, в основном использует тот факт, что строки могут быть созданы так, что они сталкиваются при хешировании, и что многие веб-серверы «глупо» помещают параметры ключ/значение в (сломанные) хэш-карты.
Мне было интересно, можно ли написать декоратор вокруг HashMap{String,String}, чтобы к каждой добавленной строке добавлялось случайное (случайное с точки зрения атакуемого) значение, например:
... get( String s ) {
return wrappedBrokenMap.get( s + crunch(s );
}
... put( String key, String value ) {
wrappedBrokenMap.put( s + crunch(s), value );
}
А вот одна из реализаций crunch(...) (это просто пример, дело в том, что злоумышленник не знает реализации):
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;
}
Если для любой строки crunch(s) возвращает воспроизводимую строку, которую злоумышленник не может угадать, DDoS-атака успешно предотвращена, верно?
Будет ли это работать?
System.milliSeconds()
при запуске. Кажется, самое простое решение, если хэш-карты не сериализованы. - person Voo   schedule 29.12.2011