Referências Diretas e o Ataque ao Citigroup

Na semana que passou, a mídia internacional divulgou que o site do Citigroup havia sido invadido, e que os hackers tinham roubado informações confidenciais (nomes, endereços, números de cartões de crédito, e histórico de transações) de mais de 200.000 clientes do banco.

Achei estranho a mídia nacional não ter dado muito destaque a esta invasão, sobretudo por ela estar sendo considerada uma das invasões mais vexatórias que já aconteceram. Segundo matéria publicada no New York Times,

"na brecha de segurança do Citi os ladrões de informações penetraram as defesas do banco primeiro logando no site reservado para seus clientes de cartão de crédito. Uma vez logados, eles acessaram as contas de diferentes clientes inserindo vários números de contas na string de texto localizada na barra de endereços do navegador web. Os programas utilizados pelos hackers repetiram este exercício automaticamente, dezenas de milhares de vezes – permitindo-lhes capturar os dados privados e confidenciais"

Infelizmente, a matéria veiculada no NY Times não forneceu detalhes a respeito do ataque. Mas, baseando-se no que está escrito na matéria, o ataque aconteceu mais ou menos da seguinte maneira: o site do Citigroup usava identificadores de contas bancárias em algumas URLs do site. Tais identificadores eram referências diretas para as contas cadastradas no banco de dados do site. Pode-se inferir que a URL que permitia a visualização das contas bancárias era mais ou menos assim:

  • http://www.citibank.com/Account/AccountID=012554

Os hackers então adulteraram o valor do parâmetro AccountID para visualizar informações acerca de contas bancárias de outros correntistas.

Este ataque só foi possível porque o identificador interno das contas bancárias – no caso, o parâmetro AccountID – estava exposto e era previsível. Se os hackers não tivessem conhecimento desse identificador, o ataque não teria ocorrido (ou pelo menos não teria sido tão facil).

Não deixa de ser irônico ver uma instituição de tão grande porte, respeitável, e internacional como o Citi incorrer mais ou menos no mesmo erro que um provinciano centro de compras recifense.

Um outro exemplo: em 2007, o governo do Reino Unido implantou um sistema web chamado MTAS (Medical Training Application Service), para treinar e orientar jovens médicos. Um desses médicos descobriu que, alterando parâmetros de uma certa URL, ele poderia visualizar mensagens de ofertas de empregos para outros médicos. Esta vulnerabilidade posteriormente foi descoberta e corrigida, mas no decorrer de sua correção, foram descobertos outros pontos vulneráveis. Manipulando parâmetros em outras URLs, era possível visualizar informações pessoais, tais como telefones, endereços, e até a orientação sexual dos usuários do MTAS.

Esta vulnerabilidade é conhecida como referências diretas a objetos. Voltando ao ataque ao Citigroup, como se ela não fosse ruim o suficiente, pior foi a declaração de um especialista em segurança anônimo, consultado pelo jornal:

"Teria sido difícil se preparar para este tipo de vulnerabilidade"

Se, como o NY Times noticiou, este for realmente um caso de referências diretas a objetos através da adulteração de URLs, a afirmação acima não se sustenta. Há pelo menos uma maneira bem simples de dificultar esse ataque a ponto de torná-lo inviável: invés de usar números curtos em que o próximo da sequência é fácil de prever, tipo "012554", "012555", "012556", seria muito melhor usar os chamados "identificadores esparsos", números longos aleatórios: "286477126388323", "782398557401006", "409339054341162". Nesse exemplo, com números de quinze dígitos, se o banco tivesse um bilhão de correntistas, ainda assim o atacante teria de tentar em média um milhão de possibilidades antes de acertar um outro número de correntista válido. Usando os números sequenciais, ao invés, o atacante sempre acerta o próximo de primeira.

Comentários
Aceita-se formatação à la TWiki. HTML e scripts são filtrados. Máximo 15KiB.

 
Enviando... por favor aguarde...
Comentário enviado com suceso -- obrigado.
Ele aparecerá quando os moderadores o aprovarem.
Houve uma falha no envio do formulário!
Deixei uma nota para os admins verificarem o problema.
Perdoe-nos o transtorno. Por favor tente novamente mais tarde.
Valdir Motta | 2011-07-09 10:08:54 | permalink | topo

Carlos!

Muito interessante o artigo! Mas senti falta de mais detalhes sobre como corrigir esse tipo erro.

Você pretende escrever mais desse problema do Citibank? Ou sobre outros tipos de vulnerabilidades?

Sou engenheiro de software, e gostaria de ver mais coisa escrita sobre segurança de sites, principamente como corrigir eles!

Parabéns pelo texto!

Ricardo Ulisses | 2011-06-25 21:45:41 | permalink | topo

Carlos,

Esse é o tipo de omissão técnica que se imagina inconcebível em um site de uma grande empresa, quem dirá no site de um banco multinacional. Falha dupla: de implementação e de teste da aplicação (se é que houve). Certamente pegou mal para o Citibank.

Clayton Aguiar | 2011-06-20 16:10:52 | permalink | topo

Carlos,

a abordagem de identificadores esparsos ajuda bastante. Mas escondê-los certamente é mais interessante ainda. E há várias maneiras, simples ou combinadas.

Quem sabe em algum artigo futuro, que siga a linha "não faça desse jeito aí, e sim desse jeito aqui...".

No mais, parabéns.