domingo, 7 de setembro de 2008

DNS Cache Poisoning

Há algum tempo atrás, descobriu-se uma falha no protocolo de DNS. Não uma falha de implementação, como as que a Microsoft (Microsoft DNS) ou o Linux (Bind) provêem. O problema mesmo é do protocolo, da maneira que ele foi definido. Questionei um amigo meu, adminstrador de redes linux, sobre detalhes sobre o protocolo e do serviço Bind. O texto abaixo é dele.

Cada computador na internet possui um endereço ip, e para atingir esse computador, devemos OBRIGATORIAMENTE saber o seu endereço IP. Para que não precisemos decorar o endereço IP do nosso site favorito, foi criado o serviço de DNS, que serve para fornecer o endereço IP de determinado nome de domínio.

- DNS - Domain Name System: serviço da internet (do tipo UDP, ouvindo requisições na porta 53) que serve para transformar nomes de host/domínios em endereços IP, e vice-versa.

O serviço DNS é hierárquico, ou seja, o servidor responsável pelo .BR é o responsável por dizer quem são os servidores responsáveis pelo .COM.BR, .NET.BR e assim por diante. Sabendo o responsável pelo .COM.BR é reponsável por dizer quem são os responsáveis pelo .GOOGLE.COM.BR, .BRADESCO.COM.BR, e assim por diante. O servidor responsável por .GOOGLE.COM.BR fornece o endereço IP para o nosso navegador para o host WWW em WWW.GOOGLE.COM.BR.

O software de servidor chamado BIND (versão atual é a 9.0) (também chamado named) é o responsável por implementar o protocolo DNS nas principais distribuições unix/linux.

Os diversos servidores DNS na internet perguntam, uns aos outros, as consultas de endereços, conforme a utilização da rede, e como o serviço é hierárquico, é necessário que seja formada uma rede de confiança entre os servidores, já que servidores distintos são responsáveis por solicitações de domínios distintos.

- DNS Cache: os softwares DNS possuem um cache interno, de forma a manter os resultados de cada pesquisa em memória durante um tempo, a fim de diminuir o número de pesquisas repetitivas para determinados endereços muito procurados.

- Spoof (informática): mascarar a identidade de um computador/serviço/usuário, de forma a monitorar, corromper, ou adulterar os dados ou outros tipos de informações na comunicação de rede.

- DNS Cache Poisoning: cadastro de informações inválidas, incorretas, adulteradas no cache do servidor DNS, através da utilização de um ataque de Spoof. Dessa forma, o servidor de dns de uma rede pode armazenar o endereço de ip incorreto para um determinado host, e as aplicações que queiram se conectar nesse servidor irão se conectar no servidor fraudulento.

Exemplo de situação normal:
- Você digita no navegador mozilla firefox 3.0: www.google.com.br.
- O seu computador pergunta ao servidor linux da sua rede, que está rodando BIND9, qual o ip para www.google.com.br
- O BIND9 não sabe quem é www.google.com.br, mas tem pré-cadastrado o .br, e pergunta pra ele quem é www.google.com.br
- O servidor .br não sabe quem é www.google.com.br, mas sabe quem é .com.br, e retorna essa resposta.
- O BIND9 recebe quem é .com.br, e então pergunta para ele quem é www.google.com.br
- O servidor .com.br não sabe quem é www.google.com.br, mas sabe quem é .google.com.br, e retorna essa responsta.
- O BIND9 recebe quem é .google.com.br, e então pergunta para ele quem é www.google.com.br
- O servidor .google.com.br é o responsável e sabe quem é www, e retorna o IP correto.
- O BIND9 recebe a resposta final do IP para www.google.com.br, e retorna a responsta para a máquina com o navegador.
- O seu computador recebe a resposta da consulta DNS para www.google.com.br, e retorna a resposta para o aplicativo do navegador.
- O mozilla firefox recebe o endereço IP, contacta esse endereço na porta 80, e .... (ops isso já é outra aula).

Exemplo de situação fraudulenta:
- Você digita no navegador mozilla firefox 3.0: www.google.com.br.
- O seu computador pergunta ao servidor linux da sua rede, que está rodando BIND9, qual o ip para www.google.com.br
- O BIND9 não sabe quem é www.google.com.br, mas tem pré-cadastrado o .br, e pergunta pra ele quem é www.google.com.br
- O servidor .br não sabe quem é www.google.com.br, mas sabe quem é .com.br, e retorna essa resposta.
- Algum servidor comprometido no meio do caminho descarta a resposta do .br, e retorna uma resposta modificada contendo um endereço IP incorreto para www.google.com.br. O cabeçalho do pacote DNS é fraudado devido à falta de entropia (aleatoriedade), de forma que o servidor de origem aceita a resposta como sendo válida.
- O BIND9 recebe a resposta fraudada para quem é www.google.com.br, e acredita cegamente nessa resposta (por causa do cabeçalho válido), e então devolve a resposta para o seu computador.
- O seu computador recebe a resposta da consulta DNS para www.google.com.br, e retorna a resposta para o aplicativo do navegador.
- O mozilla firefox recebe o endereço (incorreto) IP, e contacta esse endereço na porta 80


Agradecimentos ao José Antônio Salini Fereira , que criou esse ótimo texto.

Mais informações: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1447

Um comentário:

Unknown disse...

Valeu, Filipe, por compartilhar o conhecimento com a rede (e por me deixar um pouco famoso). Abraço, e até mais. José Antônio.