Pular para o conteúdo principal

Heartbleed - a estrambólica hemorragia cardíaca causadora da falha de segurança no OpenSSL

"O computador sempre vai fazer exatamente o que você diz – nada a menos, e nada a mais. Ele é obediente, mas nem sempre é esperto – então você (ou o programador) precisa ser".


Hoje ao ler as matérias sobre o Heartbleed, a notícias mais “punk” da semana, pois apontou uma grave falha de segurança no OpenSSL, me bateu uma saudade das aulas de lógica de programação, C, algoritmos enfim de todas as loucuras que aprendi no curso de Ciência da Computação. Aliás, abre parêntese - só louco faz um curso desses e aguenta chegar até o final e se formar – fecha parêntese.

Transcrevo resumo do texto que li no MSN, por considerar o mais didático e ao mesmo tempo técnico.

Então vamos lá, Heartbleed, é falha de segurança que pode expor inúmeras transações criptografadas para qualquer hacker que souber usá-la. OK, mas como isto realmente funciona? Na verdade, é muito simples – e por isso tão alarmante.
Em termos gerais, o Heartbleed é uma falha no OpenSSL, software que permite ao seu computador e a um servidor saberem que são quem dizem que são. Ele deixou grandes sites – como Yahoo, Flickr e Imgur – vulneráveis a roubo de dados por anos, desde 2011. É algo bem assustador, e merece um olhar mais atento.

A beleza de um projeto de código aberto como o OpenSSL é que qualquer um pode olhar o código; não há como esconder algo de propósito. Na verdade, você pode ver exatamente onde o Heartbleed nasceu e onde foi consertado, mesmo que não entenda muito de código.

Por isso, é tão surpreendente como o Heartbleed passou despercebido por tanto tempo. Dois anos se escondendo à vista de todos, sem ser notado até mesmo por programadores experientes. Mas, uma vez que você chega à parte que deu errado, o problema se torna extremamente claro e simples.

O Heartbleed não é um problema com as tecnologias TLS/SSL que criptografam a internet. Não é nem mesmo um problema com a forma como o OpenSSL funciona na teoria. É apenas um erro no código.

Quando dois servidores se preparam para fazer um aperto de mão criptografado, eles realizam algo chamado de “heartbeat” (batimento cardíaco) – é nisso que se inspira o nome do bug Heartbleed (algo como “hemorragia cardíaca”).

Heartbeats são uma forma de dois computadores que conversam entre si garantirem que o outro ainda está vivo: dessa forma, se algo der errado durante o processo, ele não continua. Eles fazem isso enviando dados um para o outro, de forma constante.

O cliente (você!) envia o seu heartbeat para o servidor, e o servidor o entrega de volta. Dessa forma, se algo der errado durante a transação – por exemplo, se um computador parar de funcionar – o outro vai saber, porque os batimentos cardíacos saem de sincronia.

É um processo simples, repetido milhões de vezes por dia em todo o mundo. Mas de alguma forma, versões bugadas do OpenSSL conseguiram estragar tudo. Sean Cassidy explica tudo em bastante profundidade no seu blog.

De acordo com Sean Cassidy, o problema real, que gerou uma crise de segurança, está nesta pequena linha de código:
memcpy(bp, pl, payload);

Explicando, memcpy é um comando que copia dados, e requer três informações (parâmetros) para fazer o trabalho – são os termos dos parênteses descritos abaixo:
pl: onde estão os dados que serão enviados no heartbeat;
bp: o destino final dos dados no heartbeat;
payload: o tamanho desses dados. Basicamente, o heartbeat envia alguns dados para o servidor e ele precisa devolver para você exatamente os mesmos dados. Assim, garante-se que a conexão está segura.

No entanto, a cópia de dados é mais complicada do que parece. Quando o heartbeat vai para o servidor de destino ele não ocupa um espaço realmente vazio de memória. Sempre há alguma coisa gravada, que o computador precisa apagar para então gravar o heartbeat.

Aí está o problema: o comando memcpy pode mentir o tamanho do heartbeat. Ele pode dizer que o arquivo tem 64KB, quando ele na verdade tem 0KB. Então o servidor, confuso, vai alocar 64KB de memória – onde pode haver dados confidenciais – e enviá-los de volta para você.

É assim que hackers conseguem comprometer a segurança de sites usando o Heartbleed. Diga que vai enviar um heartbeat de 64KB, envie na verdade um arquivo de 0KB, e o servidor devolve 64KB de dados – que podem conter senhas ou endereços de e-mail, por exemplo. Repita isso diversas vezes, e você pode conseguir até chaves de criptografia.

Em termos mais técnicos: a função memcpy vai criar um espaço de 64KB (payload) no destino (bp), mas como ele recebe zero dados, esse espaço mantém tudo o que havia nele antes. Quando ele enviar os dados de volta, vai incluir tudo o que há nesse espaço. Com o Heartbleed, é possível pedir informações várias vezes a um servidor, até que ele envie de volta algo bem revelador.

O erro minúsculo recebe uma pequena correção também. Graças a Deus! Ainda bem que o mundo binário é assim SIMPLES e a correção é tão simples quanto o erro em si:
* Ler primeiro o tipo e tamanho do payload */
if (1 + 2 + 16 > s->s3->rrec.length)
return 0;
/* descartar silenciosamente */
hbtype = *p++;
n2s(p, payload);
if (1 + 2 + payload + 16 > s->s3->rrec.length)
return 0;
/* descartar silenciosamente segundo RFC 6520 seção 4 */
pl = p;

Como explica Sean Cassidy, este código tem duas funções muito simples. A primeira é checar se o heartbeat tem comprimento zero. A segunda garante que a função memcpy não está mentindo o tamanho do payload. E pronto.

Este tipo de erro é comum, e tem um nome: transbordamento de dados, ou estouro de buffer (buffer overflow). Ao escrever código, um dos erros mais comuns é “esquecer de fazer algo óbvio e verificar se os dados inseridos pelo usuário nunca estão errados”. Ainda me lembro do meu professor de C++ no ensino médio, insistindo que a gente verificasse o comprimento dos dados inseridos pelo usuário. Sempre. Só por precaução. Conta Sean Cassidy.

Felizmente, esse bug do OpenSSL é simples, e a correção é fácil de implementar, mesmo que não conserte o dano já feito. No fim, tudo se resume a esse princípio horrível e maravilhoso da computação: o computador sempre vai fazer exatamente o que você diz – nada a menos, e nada a mais. Ele é obediente, mas nem sempre é esperto – então você (ou o programador) precisa ser.

Comentários

Postagens mais visitadas deste blog

A importância do conceito de família

A FAMÍLIA mostra as leis que vigoram no interior da casa e que, transferidas ao exterior, mantêm a ordem no estado e no mundo. Quando a família está em ordem, todos os relacionamentos sociais da humanidade também estão. Das cinco relações sociais, três são encontradas no interior da família: a relação entre pai e filho, que é a do amor; entre o pai e a mãe, que é a do recato; entre o irmão mais velho e o irmão mais moço, que é a da correção. O afetuoso respeito do filho é então transferido para a vida, como exemplo de lealdade ao dever. A correção e o afeto existentes entre os irmãos são aplicados ao amigo como lealdade e aos superiores como deferência. A família é a célula que dá origem à sociedade, o solo nativo em que o exercício dos deveres morais é facilitado pela natural afeição. Nesse pequeno círculo são criados os princípios éticos que mais tarde serão ampliados às relações humanas em geral. Aqui também a influência deve partir da própria pessoa para dirigir-se aos o

Ofício de Nossa Senhora da Conceição

INTRODUÇÃO Em Maria está toda a plenitude de graças. Nela o Verbo de Deus, Jesus Cristo, se fez homem. Com a encarnação, Maria se fez co-redentora. Com sua vida de união com Jesus, ela se torna mestra, rainha e modelo; na morte de seu Filho Jesus, este no-la entrega como nossa mãe. Por isso, louvemos a toda cheia de graça, Maria, a mãe, mestra e rainha da humanidade. Ave-Maria Ave-Maria, cheia de graça, o Senhor é convosco! Bendita sois vós entre as mulheres e bendito é o fruto do vosso ventre Jesus. Santa Maria, Mãe de Deus, rogai por nós pecadores, agora e na hora de nossa morte. Amém! Consagração diária à Nossa Senhora Ó Santa Mãe Dolorosa de Deus, ó Virgem Dulcíssima, eu Vos ofereço o meu coração, afim de que o conserveis intacto como o Vosso Coração Imaculado. Eu vos ofereço minha inteligência, para que ela conceba apenas pensamentos de paz e bondade, de pureza e verdade. Eu vos ofereço a minha vontade, para que ela se mantenha viva e generosa ao serviço de Deus.

Reciclagem: embalagem de iogurte vira boneco da Turma da Mônica

“A ação é uma forma de reaproveitar materiais e incentivar a criatividade das crianças”. Para educar as crianças para um mundo ecologicamente sustentável, a Danone e a Mauricio de Sousa Produções fizeram uma parceria para lançar " O Verdadeiro Danone Monta Turma " com reaproveitamento da embalagem. Os potinhos do iogurte foram projetados para serem reutilizados e se transformarem em bonecos da Mônica e do Cebolinha. Cada embalagem do iogurte vem com oito potinhos, o que permite montar quatro bonecos - dois da Mônica e dois do Cebolinha. O corpo de cada boneco é formado por dois potinhos. O iogurte ainda vem acompanhado de uma cartela para recortar e colar olhos, cabelos, braços e sapatos para caracterizar cada personagem. Fonte: http://pme.estadao.com.br/noticias/noticias,a-estrategia-dos-grandes-embalagem-de-iogurte-vira-boneco-da-turma-da-monica,2835,0.htm