Ataques de DOS via Complexidade Algoritmica

7 respostas
louds

Alguem olhou isso?
http://www.cs.rice.edu/~scrosby/hash/CrosbyWallach_UsenixSec2003/index.html

Resumindo, o artigo fala de como criar 1 ataque contra 1 servidor explorando falhas nos algoritmos utilidados. Fala em particular como fazer isso contra hashing.

Toda hash table se vale de calcular 1 ‘valor magico’ a partir dos dados da chave para escolher qual bucket colocar o par (chave, valor).
Oque o ataque faz é gerar 1 monte de valores que sempre caiam no mesmo bucket, tornando as operacoes da hash table extremamente lentas, de O(1) para O(n).

Nesse artigo ele analisa o metodo de hashing do perl 5.6 e 5.8 e alguns outros programas.

E quanto ao java? Sera que a versao da sun possui essa vulnerabilidade na implementacao to hashCode() p/ String?

Fui dar 1 olhada o algoritmo é o seguinte:

Se vc olhar, não é dificil produzir 1 gerador de strings que vao sempre produzir o mesmo resuldado. Basta notar a seguinte propriedade:

P/ a string (S0, S1) e hash a somatoria acima descrita

Ou seja, é possivel criar 1 gerador de strings que possuem o mesmo hash code.

7 Respostas

cv1

Eu li meio por cima na JavaSpecialists que o algoritmo de hashing dos HashMaps mudou na 1.4.1… Em qual versão da API vc olhou?

Paulo_Silveira

sempre eh possivel gerar elementos que gerem o mesmo hash. a nao ser que eles sejam todos uniques e nao ultrapassem Integer.MAX_INT (2 bi)

por isso voce tem de usar uma colecao de Hashing universal. Voce sorteia sua funcao de hash ao criar a tabela, e o atacante NUNCA vai conseguir prever as colisoes, ja que as funcoes sao meio que aleatorias.

antigamente o hash da String do java soh levava em consideracao os 16 primeiros caracteres. Ai colidia PRA CARAMBA. Hoje melhorou muito.

louds

crei eu que olhei a versao da 1.4.1_02.

Paulo, sortear uma funcao entre 1 coleção de funções apenas adia o problema, o ideia é usar 1 funcao de hashing segura logo de primeira, como o MD5 sugerido no artigo.

O problema no java é pior, pq esperamos que cada objeto seja esperto na hora de calcular seu hash, oque nos deixa a merce da implementação da JVM.

Agora, ate onde eu sei, todos pacotes de coleção que eu ja vi (java.util, jakarta, colt, ), usam Object::hashCode() como método de gerar hashes pros objetos, alguns, como o java.util, faz 1 modificação no valor, porem isso apenas ajuda no espalhamento de valores proximos, não de valores iguais.

Ou seja, sera que não é possivel construir 1 ataque de DOS contra, por exemplo, o Tomcat, se valendo do fato de conhecermos 1 gerador de Strings com hashCode igual?

Paulo_Silveira

“louds”:
crei eu que olhei a versao da 1.4.1_02.

Paulo, sortear uma funcao entre 1 coleção de funções apenas adia o problema, o ideia é usar 1 funcao de hashing segura logo de primeira, como o MD5 sugerido no artigo.

Ja vi voce comentando sobre o Cormen. Veja o capitulo do Cormen sobre estruturas de dados simples, no final de hashing, ele fala sobre as colecoes universais, e como impedir esses ataques maleficos. (pagina 229)

Usar MD5 realmente eh uma boa solucao. Ja que pro cara achar outra String/Objeto que tenha o mesmo MD5 eh meio complicado heehehhe. E se ele achar isso de uma maneira rapida, ele estaria rico… :slight_smile:

cv1

Rico é pouco, aliás. :smiley:

A confiança no MD5 fez com que muita gente usasse esse algoritmo pra guardar dados confidenciais em bases de dados críticas, senhas em máquinas Unix, etc, etc, etc :slight_smile:

louds

Paulo
vc falou em sortear 1 algoritmo quando a coleção é criada, quanto a utilizar universal hashing, isso resolveria o problema, alem de ser mais rapido que MD5.

Hoje em dia vc gasta alguns dias de 1 boa cpu para conseguir criar 1 string que produz 1 hash especifico. Isso levando em conta todos bits do MD5, mas ainda assim fica inviavel criar 1 ataque de hash contra MD5…

Eu so uso MD5 pro shadow no unix, pro resto, como senhas de LDAP, é SHA1 256 mesmo, que é muito mais seguro.

Paulo_Silveira

curti o assunto, postei na lsita de uma materia e me passaram mais esses dois links.

bug do kernel com o mesmo problema?

resposta:
http://msgs.securepoint.com/cgi-bin/get/djbdns-0306/4.html

Criado 1 de junho de 2003
Ultima resposta 3 de jun. de 2003
Respostas 7
Participantes 3