Para começar, leia o trecho a seguir desta notícia na INFO Online:
Mas, quando tentou o Google, o especialista descobriu que serviço de publicação de blogs WordPress é vulnerável a pesquisas específicas. O site armazena dados como hashes MD5, que podem conter senhas, de uma maneira visível ao buscador. Bastaria informar um trecho do algoritmo para encontrar dados relacionados ao usuário e suas senhas.
Uau, belo trabalho jornalístico esse hein? Espalhando o medo. Imagine a reação de um leigo, que tenha um um blog WordPress, ao ler essa pérola da desinformação. Não parece, lendo esse texto, que o WordPress tem uma seríssima falha de segurança que pode ser explorada usando o Google? Que se alguém “informa um trecho do algoritmo” vai descobrir uma porção de dados seus? Bom, fui ao site do sujeito e li o artigo em que ele explica como quebrou a senha.
O que aconteceu é que o WordPress do tal Murdoch foi invadido por um cracker, que criou uma conta de usuário. O WordPress guarda suas senhas em um formato chamado MD5, um formato de criptografia que transforma qualquer senha num hexadecimal de 32 caracteres, assim:
- “Sylar” = 7bef5e9683a92c37a266283bf229c2e8
- “Cap. Nascimento” = 40a4b69d3132bd562dc03e2de30fda3e
- “Pat Morita” = 261f3880c4eab23075356dbc6b5befc3
O WordPress faz isso para proteger você. Se alguém invadir seu blog, mesmo assim não vai descobrir sua senha. Então o Murdoch não tinha a senha do sujeito que invadiu o blog dele, tinha apenas o texto “20f1aeb7819d7858684c898d1e98c1bb”. O jeito comum de se descobrir essa senha é o chamado ataque de dicionário. Você consegue um enorme dicionário de palavras e nomes comuns, e faz um programa que converte cada um deles para MD5. Se, ao converter algum, você encontrar o tal texto “20f1…”, pronto, você descobriu qual é a senha.
O problema é que esses ataques levam tempo, pois o computador tem que processar milhões de palavras. E se a senha não for uma palavra comum do dicionário, ela não vai ser encontrada. Assim, “banana” vai ser encontrada, mas “Xbanana43” não. Acontece que palavras muito, muito comuns, como “banana”, ou nomes de pessoas, provavelmente já tem seu hash MD5 publicados em alguma página na web. E, se está publicado, o Google encontra. Por exemplo, procure pelo MD5 de banana.
Então, ao procurar o MD5 da senha do invasor, o Murdoch achou páginas como essa aqui, uma lista de pessoas chamadas “Anthony”. Ele resolveu tentar então “Anthony” como senha, e funcionou.
Perceba que isso não torna o WordPress mais vulnerável, porque a senha ia ser descoberta de qualquer maneira, só ia levar um pouco mais de tempo. E para fazer isso, o sujeito tem que ter acesso ao banco de dados com as senhas. Ou seja, já tem que ter invadido o sistema.
Foi só isso. Não há nenhuma vulnerabilidade no WordPress que, se alguém vai ao Google e “informa um trecho do algoritmo”, vai descobrir seu CPF e número de cartão de crédito. Aliás, será que esse repórter sabe o que significa “algoritmo“? Aprendi quando era criança, quando minha mãe ouviu meu primeiro palavrão, que gente não devia usar palavras que a gente não sabe o que significa.
Você que usa WordPress, não precisa se desesperar. Só não use senhas óbvias, não acredite em tudo o que você lê por aí e não entre em pânico.
Update: leita também A Web e o problema das senhas “clear text”, do Osvaldo Santana
Só faltava mais essa.O que podemos fazer.
Ótimo texto, Élcio. Vou editar a notícia que passei em meu blog.
Maysa
Boa tarde pessoal.
Na verdade isto não pode ser considerado uma vulnerabilidade, pois, é muito mais uma definição simples de arquitetura que uma falha.
O fato de os hashs gerados não possuir salt é uma fraquesa. Pois o hash pode ser identificado. Por exemplo usando uma Rainbow Table (http://en.wikipedia.org/wiki/Rainbow_table) um hash sem salt pode ser identificado sem computadores com alto processamento.
Concordo que o Google nesta história não tem nada ver mas, que existe uma fraquesa no sistema de autenticação existe. Ainda mais com esta falha (http://br-linux.org/linux/bugtraq-bug-do-wordpress-afeta-ate-mesmo-a-versao-corrente) o potencial aumenta muito.
nao funciona tag html =(
Esse negocio de tentar hash igual é bobeira… como o Élcio provou, é um probabilidade entre 1/25616 = 2.938735877055718769×10-39
Quer dizer, algo inviável.. é mais fácil o cara usar um bruteforce para descobrir num 486 do que achar uma senha do gênero: ‘f4p12Er’
Tudo bem, Murilo, foi só uma confusão. Estranhei você estar propondo isso, por isso que não parti já “acusando” você 🙂
E quanto ao ataque de dicionário, aí entra a questão do salting. O invasor precisaria de um tanto de sorte pra encontrar em alguma tabela ou no Google a senha com o mesmo salting que você usou. E se cada senha tiver um salt diferente, então, torna-se inviável até mesmo ele construir uma tabela para consulta para aplicar a todas as senhas ao mesmo tempo, ou sequer deduzir que duas pessoas, por terem o mesmo hash, têm a mesma senha.
Daniel, não fiz essa proposta não. Muito pelo contrário aliás, proponho que a WordPress corrija isso =].
E boa observação Élcio, realmente o cara ia ter que ter uma “mega sorte” para achar um hash correspondente. Mas e se tiver muitas hashs de senhas expostas?
Pegar os hashs que ele encontrou pelo Google e procurar nos dicionários deles?
Isso seria muito fácil, não? Bom, talvez não achem. Talvez todos os hashs expostosque acharem pelo Google não tenham encontrado o valor mas, vai saber né?
Como eu disse. WordPress é muito visada. É uma coisa grande. Muita gente iria querer fazer o que não presta.
Abraço.
Li esse texto na info, fui curioso olhar o site do cara e me surpreendi com essa coisa.
Por isso deixei de ser assinante da revista. Não parece nada profissional.
parece uma equipe especializada em sensacionalismo, querem derrubar a excelente fama do wordpress?
Ótimo texto elcio!
O cara la do light blue viaja..
Ele escreve um artigo daquele só pra pagar de cracker porque é um lammer total…
Abraços,
Ainda bem que minha senha não é banana… 😛
Murilo, uma em cada 25616 strings vai ter o mesmo hash de Xbanana43.
Duvido que alguém tenha um dicionário para ataque com 25616 palavras. Ou que o Google tenha indexado tantos hashs md5 assim.
25616 = 340.282.366.920.938.463.463.374.607.431.768.211.456
Se cada palavra ocupar um único byte, e você gravar esse dicionário em HDs de 1 Terabyte, e empilhar essas hds uma em cima da outra, a pilha teria 6 trilhões de trilhões de quilômetros de altura.
Se, hipotéticamente, houvesse um dicionário tão grande assim, e o supercomputador do atacante conseguisse calcular 1 trilhão de hashs por segundo, ele levaria dez bilhões de trilhões de anos para processar o dicionário todo. O que é um milhão de vezes maior que a idade que os cientistas dizem ter o universo.
Não acho que isso possa ser considerado “um erro grave”.
Não entendi muito bem o que você quis dizer, Murilo… você propõe então guardar a senha inalterada no banco? É bem melhor correr o risco de alguém acertar uma senha por uma infeliz colisão de hashes que correr o risco de alguém se apropriar dos dados de seu banco e assim automaticamente saber todas as senhas que estão ali, o que é agravado ainda mais pelo fato da grande maioria dos usuários reaproveitar senhas.
MD5, que não é um bom algoritmo para senhas, já usa 128 bits, ou seja, são 2^128 (um número de 39 dígitos) valores diferentes. Este espaço é maior que o de todas as senhas possíveis com menos de 20 caracteres usando todos os caracteres imprimíveis ASCII. Quais são as chances práticas de haver uma colisão entre duas senhas?
Hashes ainda podem ser aprimorados usando salting, como o Cris Dias propôs. Assim, mesmo se seu banco de dados cair em mãos erradas e alguma senha for a princípio fácil de se quebrar, um bom salt torna inviável ter alguma tabela precomputada de hashes de um dicionário. E, se o ofensor não souber qual é o salt aplicado, mesmo conseguindo computar alguma expressão que dê o mesmo hash, há chances desta não ser a expressão original, e assim continuar impossível tanto logar na conta quanto saber a verdadeira senha do usuário.
Faltou você mencionar que hashs md5 por ter um formato que é de ter 32 caracteres (que é limitado) para cada string (que não são limitadas), pode ter várias strings que retornam o mesmo hash md5.
Assim se sua senha é Xbanana43 o hash criado é 6602bdb9ebad43ec164de0eb6be967ee, mas muitas strings diferentes podem retornar o mesmo hash.
Por exemplo pode constar uma string “nadaaver” (só um exemplo) com o mesmo hash do Xbanana43 no dicionário, de forma que, se o cara digitar seu login e nadaaver (que ele achou no dicionário com) e o algoritmo do wordpress transformar nadaaver para hash md5 e comparar com o que está no banco, vai conseguir logar e nem precisa saber sua senha.
Então isso, por se tratar de WordPress, uma coisa que é bastante visada, pode ser considerado um erro grave.
Abraço.
bom artigo, também tinha lido isso da info, manda o link desse seu para eles..
também sugiro ler o artigo do slashdot sobre isso, nos comentarios o pessoal fala que a culpa é do usuário que colocou uma senha comum onde pode-se encontrar hashes dela no google ou em sites que tem lista de hash (chegam até a dar o link do dito site)
e também culpa do wordpress por não usar salted hash..
na minha opinião primeiro o usuário não deveria usar senhas comuns, segundo o wordpress deveria salt o hash e depois não deveria nem usar md5 visto que o proprio algoritimo já foi quebrado
¬¬ *medo
Meu vizinho plantou uma semente no meu quintal, derrependo brotou…
Boa Cria Dias!
Tenhamos paciência com o tal Murdock. Ele é americano. Deve aguentar todo dia o Bush metendo medo nele e em todo mundo.
Além disso, essa história de um gerenciador de código aberto melhor que qualquer outro ainda não deve ter sido fácil de engolir.
É por isso que é uma boa prática ao escrever software você mesmo adicionar esse “X43” à senha do cara antes de “hashear”. Então o que é salvo no banco não é o md5 de “banana” e sim o de “Xbanana43”. Cada vez que o usuário entrar com a senha é só recolocar a “semente”. 😉