O IETF (Internet Engineering Task Force) está se movimentando rapidamente para anular
oficialmente um problema de segurança no protocolo IPv6, o Routing Header de tamanho 0. O
problema, com potencial de criar ataques de negação de serviço era considerado desde 2005, mas
sempre foi tratado como de menor importância, até Abril desse ano.
No dia 03 de Abril, o commiter do FreeBSD, Arnaud Biondi, em conjunto com Jun-ichiro Itojun
Hagino, commiter do NetBSD, do FreeBSD, líder do KAME Project e principal desenvolvedor da
implementação BSD (a mais popular) do protocolo IPv6 e da especificação IPv6, além de
desenvolvedor do IPSec, descobriram que o problema em questão apresentava potencial de
amplificação da propagação de pacotes roteados com cabeçalho de tamanho 0.
Em testes laboratoriais que levaram 5 dias, foi descoberto que, sem muita dificuldade, um único
pacote desse tipo poderia ser amplificado em milhões de pacotes por segundo, e coordenados para
alcançar um destino todos ao mesmo tempo. Potencial para ser o maior problema de negação de
serviço da história.
Os resultados dos testes foram apresentados primeiro em listas de discussão sobre engenharia de
roteamento Internet, e suas discussões se expandem até o momento. O Projeto FreeBSD já lançou
um Security Advisory onde desabilita por padrão o recurso de Routing Header 0 no IPv6. Mas a
discussão continua, e para entender adequadamente as consequências do problema e as soluções em
discussão, resolvemos simplificar o que vem sendo discutido ao longo desse pequeno artigo.
O que é o mecanismo de Routing Header 0
O mecanismo que permite cabeçalhos de roteamento de tamanho 0, no IPv6, foi projetado para
garantir ao IPv6 o recurso de Source Routing – o que, deve ficar claro nesse momento, não tem
relação alguma com a técnica de Policy Routing onde políticas de roteamento podem sobrepor a
tabela primária de rotas, com regras baseadas na origem dos pacotes, e de acordo com tal origem
garantir que os pacotes sejam roteados por hops distintos – gateways seletivamente indicados por tal
política de roteamento.
O recurso de Source Routing no Ipv4 define por quais saltos de roteamento um pacote deve passar
antes de alcançar seu destino, e no IPv6 o Routing Header de tamanho 0 (doravante referido apenas
como RH0) tem esse mesmo propósito: possibilitar que pacotes escolham os hops de roteamento
onde devem passar, para chagar a um determinado destino.
Porquê RH0 é perigoso?
A princípio, não é perigoso. Sua motivação e uso são autênticos, apesar de pouco comum. O fato é
que nas redes IPv6 como conhecemos hoje, o mesmo em redes IPv4, a técnica de source routing é
usada apenas em ambientes especiais, e é considerada não útil, ou apenas um PoC (Prova de
Conceito, Proof of Concept).
A questão é que não há uso formal e prático para o RH0, apenas teórico. E o grande problema, que
de fato torna RH0 um problema de segurança em potencial é que não há qualquer mecanismo que
possa reconhecer ou evitar que um pacote passe quantas vezes quiser por um mesmo hop de
roteamento, antes de alcançar um destino. Destino que na prática pode ser inalcançável se os
caminhos por onde o pacote deva ser roteado for alterado ou pre-definido para se modificar de
acordo com a frequência com que passa por cada salto (roteador).
Com isso, de acordo com o Security Advisory lançado pelo Projeto FreeBSD, “Um ataque pode '
amplificar' a negação de serviço entre duas estações vulneráveis, enviando pequeno volume de
tráfego que pode consumir grande quantidade de banda entre as pontas vulneráveis, pois o pacote
pode estar montado de forma a se rotear para sempre entre cada salto de roteamento entre as
pontas”.
O desenvolvedor do FreeBSD, Paul Vixie, principal desenvolvedor do BIND, coordenador do
Internet Ssystems Consortium (www.isc.org) e coordenador da raiz-F de DNS (principal tronco de
servidores de nomes raiz da Internet, F-ROOT NAME SERVERS) ilustra que “ninguém, em lugar
algum, acha o RH0 útil para qualquer propósito, e sequer o usa; de tal forma RH0 deve ser
completamente descontinuado da especificação IPv6; eu mesmo fiz isso antes da apresentação de
CanSecWest de forma que a raiz de DNS do mundo não seja um exemplo conveniente de como RH0
pode ser perigoso”
O time de segurança do Projeto FreeBSD ainda informa que “um ataque pode usar uma ou mais
estações vulneráveis para concentrar um ataque de negação de serviço contra uma vítima, sendo
esta outra estação ou uma rede, enviando um conjunto de pacotes a cada período de 30 segundos,
e estes pacotes ser montados de forma que todos eles cheguem ao seu destino ao mesmo tempo,
dentre de um segundo ou menos.”
Os testes apresentados pelo Projeto FreeBSD junto à IETF ilustram um ataque como o mencionado
acima, no Advisory oficial do Projeto. Com isso é possível passar semanas montando pacotes e
deixando-os roteando-se pela Internet, e, uma semana depois, quando literalmente bilhões de
pacotes já estiverem na rede, todos alcançarem um mesmo destino ao mesmo tempo. As
consequências disso?
1) Um único computador ligado na rede por alguns dias pode tirar qualquer site, qualquer rede,
do ar, programando seus pacotes para chegar ao destino de uma só vez.
Após examinar com cuidado os testes apresentados pelo time de segurança do Projeto FreeBSD a
CISCO lançou seu Security Advisory, em 04 de Maio, que pode ser encontrado em:
http://www.cisco.com/warp/public/707/cisco-sa-20070124-IOS-IPv6.shtml
Neste, estudo e apresentação do problema, a CISCO chega a conclusões ainda mais caóticas sobre o
potencial do problema. O SA da Cisco informa que:
“É possível causar o crash de roteadores CISCO com IOS com apenas um pacote IPv6.”, e
também “Com esse problema é possível que uma única máquina cause o Colapso da Internet
IPv6”, e ilustra que “um único pacote pode tirar um país inteiro da Internet”.
Na lista da IETF, Jeff Roberson da CISCO Systems informam que “O mundo deve agradecer ao
Projeto FreeBSD por esse Advisory e pelos testes apresentados”, e Antony Joshua da Juniper
Networks ilustra que “Se o problema não fosse apresentado de forma tão clara pelo time de
segurança do FreeBSD, me pergunto o que aconteceria com a Internet daqui alguns anos, quando
IPv6 não puder mais ser adiado.”
Biondi ilustra que “de acordo com o que vocês podem ver nos slides em anexo, um único pacote de
90 bytes após ser roteado por 32 segundos em endereços diversos da Internet – e isso é um
ambiente real, testes de vida real em roteadores reais, e os administradores desses roteadores nem
imaginam que esse teste foi feito – temos ao longo de 40 round-trips 4Mbit/s chegando a um único
destino, e com adicionais 16MBytes de tráfego armazenados no caminho até o destino daquele
(agora, aqueles) pacote(s). Bem-vindos ao caos.”
O restante da apresentação ilustra mais o problema. O slide pode ser obtido em:
http://www.secdev.org/conf/IPv6_RH_security-csw07.pdf
Ebalard apresenta uma forma prática de tirar todo o DNS do mundo do ar, com apenas um pacote,
propagado a cada poucos segundos, de uma única estação na rede IPv6. Vixie, pouco confortável
com o fato do DNS do mundo inteiro ter sido usado como exemplo prático do quão grande o Caos
pode se tornar, informou que “estamos filtrando com IPFW2 todo rounting header 0 do IPv6, já
que não pudemos reiniciar os servidores ainda após o SA do Projeto FreeBSD, que requer
recompilçao do kernel e reboot do sistema.”
Conforme aponta a apresentação e Vixie confirma, toda a infra-estrutura DNS do mundo, bem
como os nós centrais de roteamento IPv6, usam sistemas BSD, em especial FreeBSD.
Abordagem FreeBSD e OpenBSD
O Projeto FreeBSD e o Projeto OpenBSD tratam de forma distinta o problema, mas concordam que
RH0 deva ser desativado no kernel. O OpenBSD remove o roteamento de RH0 incondicionalmente,
como indicado no patch oficial:
ftp://ftp.openbsd.org/pub/OpenBSD/patches/4.0/common/012_route6.patch
Enquanto o Projeto FreeBSD desativa RH0 por padrão no kernel, mas entende que em situações
muito peculiares, o administrador de redes por querer utilizar esse recurso, e permite que este seja
reativado a qualquer momento, com intervenção explícita do administrador, através da MIB sysctl
net.inet6.ip6.rthdr0_allowed, que recebe valor booleano, como indicado no ADV:
http://security.freebsd.org/advisories/FreeBSD-SA-07:03.ipv6.asc
Abordagem Linux
No kernel 2.6.21 uma abordagem similar foi tomada, desativando RH0 no kernel. Porém, Ebalard
apontou na CanSecWest Conference que “no Linux a situação é um pouco diferente; ainda pior, de
fato; além de sofrer a mesma vulnerabilidade, um erro de cálculo na forma como RTA_MAX é
tratado, ao invés de RTN_MAX em dn_fib_propos[] pode potencialmente ser explorado de forma
parecida, e causar um DoS nas mesmas proporções, mas estamos falando de outro problema, e
este poderia ser amplificado apenas entre múltiplas estações Linux, já que nenhum outro sistema
sofre desse erro. No kernel 2.6.21.r6 do Linux trataram esse cálculo, com algumas mudanças no
arquivo fib_semantics.c, mas o problema não foi solucinado. Apenas amenizado. No Linux o
potencial de exploração é ainda maior, e esse segundo problema, exclusivo do Linux,
aparentemente será corrigido apenas no kernel 2.6.22 no RC3, ou superior, pois no 2.6.22rc2
ainda não há a correção.
Porém, vamos nos ater ao RH0, pois para nossa sorte não há infra-estrutura global de Internet
rodando sobre Linux, então vamos nos preocupar menos com o RTA_MAX e voltar ao RH0”
Ações do IETF
O Internet Engineering Task Force respondeu a apresentação na CanSecWest Conference com um
draft que propõe a descontinuação imperativa do uso de RH0 no IPv6. Essa proposição do IETF
pode ser analisada aqui:
http://www.ietf.org/internet-drafts/draft-ietf-ipv6-deprecate-rh0-00.txt
Considerando que roteamento por origem com RH0 pode ser utilizado de diversas formas, a maioria
delas indesejáveis, o IETF chega a um senso comum e indica que:
1) Implementações de roteamento por origem como definido pela RFC 791 e pela RFC 2460 é
opcional, e qualquer sistema que implementa uma forma de omitir ou não oferecer esse
recurso continua sendo considerado um sistema plenamente compatível com a RFC 791 e
RFC 2460, respectivamente, com tanto que esse comportamento possa ser modificado, se
explicitamente desejado pelo administrador de sistema;
2) Implementações do protocolo IP que continuem suportando roteamento por origem
DEVEM, imperativamente, oferecer um mecanismo administrativo para desativar esse
recurso, se ele estiver habilitado por padrão;
3) Implementações IP que suportem roteamento por origem são indicadas a ter o recurso
desabilitado por padrão.
4) Implementações IP que não incluem roteamento por origem ou as tem desabilitado, devem
retornar um erro ICMP apropriado, indicando ter encontrado uma opção desconhecida,
como indicam as RFC 791 e RFC 2460 respectivamente.
O IETF ainda alerta que, nenhum sistema deve filtrar source routing por padrão, seja IPv6 ou IPv4,
pois isso pode quebrar recursos já em uso na Internet ou recursos vindouros. O único filtro por
padrão que deve ocorrer é de Routing Header 0.
Joe Abley do IETF ainda mencionou que o problema de amplificação de DoS é apenas um dos
problemas do RH0. Fora ele, mapeamento remoto de redes e sobreposição a regras de firewall
também são possíveis com o RH0.
A única pessoa que parece ainda defender o uso de RH0 é Itojun, que diz que “recursos como os
implementados pelo traceroute -g podem ser melhorados com RH0; o que temos que fazer é
projetar RH0 de forma a oferecer todas suas vantagens potenciais sem ter feitos co-laterais
negativos, ao invés de descontinuar o recurso”.
Ninguém concorda com Itojun, exceto por Jaroen Massar do IETF que concorda com Itojun que
seria bom se fosse possível manter RH0 de forma segura, mas que não há como isso acontecer, e
devido à pouca usabilidade prática do recurso, defende que RH0 seja aposentado imediatamente. E
defende ainda que o recurso equivalente, em IPv4 seja também pouco incentivado, mas quer
preparar um Draft exclusivo para tratar a abordagem IPv4.
Adequação dos sistemas as indicações atuais do IETF
Considerando o senso comum do que o IETF concorda, o único sistema que cumpre todas essas
indicações é o FreeBSD, que implementa o recurso de Source Routing IPv6 e IPv4 no kernel, mas
que não os tem ativado por padrão; oferecendo no entanto mecanismos que podem habilitar ou
desativar tais recursos a qualquer momento, pelo usuário.
Linux não implementa o recurso ou o removeu imperativamente, enquanto no OpenBSD o recurso
está como indicado pelo IETF para IPv4, mas para IPv6 está implementado, mas desativado por
padrão, e não há forma de ativar sem a recompilação do kernel. Massar ilustra que “recompilar
kernel não pode ser considerado um mecanismo de ativação do recurso”, considerando a maneira
como o OpenBSD desativou a implementação que já existia. Eu particularmente discordo.
Recompilar kernel deve sim, ser considerado mecanismos de ativação de recurso. Mas o problema
ao meu ver é que não basta uma opção no kernel. A modificação requer intervenção manual no
código.
Muitos ficaram incomodados
A conferência CanSecWest de forma geral é pouco interessante, todos os anos. Esse ano não foi
diferente na maioria das apresentações, que abordavam assuntos sobre “Como hackear Apple
Macintosh – através do navegador Safari”, “Análise da exploração VoIP da Nortel” e até
“Hackendo Nintendo Wii”. Além de outros assuntos pouco encorajadores como “Ataques de
engenharia reversa com JavaScript” (!!!) ou “Eu sei o que a sua empresa fez, no verão passado”.
Normalmente parece um encontro de meninos que vivem no IRC, felizes por “pacotar” redes por
alguns segundos. E a apresentação sobre IPv6, de Biondi e Ebalard parecia ser mais uma, no mesmo
nível, com o assunto “Diversão com Cabeçalhos de Roteamento de tamanho 0”.
Mas essa se mostrou a mais importante, pelas adequadas ilustrações práticas do problema e também
pelas considerações complementares feitas por representantes da Cisco Systems e da Juniper
Networks, na mesma apresentação. Ao longo da apresentação, notamos que eles, em especial
Ebalard, não fizeram o menor esforço para não atacar e apontar nomes e fatos.
Itojun ficou especialmente incomodado com as afirmações que “os projetistas e desenvolvedores
do IPv6 não aprenderam com as falhas do IPv4, e voltam a repetí-las, de forma ainda mais
perigosa”. Apesar de Biondi e Vixie serem ambos companheiros no desenvolvimento do Projeto
FreeBSD, Biondi não conseguiu evitar que seu parceiro de apresentação, Ebalard, provocasse
também o desconforto de Vixie, quando apresentou a ilustração de ataque contra os servidores DNS
raiz do mundo. Vixie comentou que não estava mais vulnerável, e Ebalard tirou da cartola, no
último minuto, uma mini (psuedo?) apresentação com o título “Tirando o Kernel.org do ar, sob o
nariz do ISC, e com problemas de segurança que só o Linux oferece à seus usuários” onde Ebalard
apontava que com RH0 combinado com o problema de RTA_MAX todos os servidores na rede
IPv6 do kernel.org (site que formenta e hospeda os servidores que fornecem os kernel do Linux ao
mundo) poderiam causar um DoS que os tiraria do ar em 20 segundos. Em baixo do nariz do ISC,
que hospeda gentilmente toda a infra-estrutura do kernel.org.
Todos adeptos de sistemas livres ficaram também incomodados quando Ebalard apontou que apenas
o IOS da Cisco poderia filtrar RH0, desativar RH0 por tipo ou desativar RH0. Enquanto nas
soluções livres, Linux conseguia filtrar RH0 por tipo, com a opção ipv6header do Netfilter,
enquanto FreeBSD conseguia com ext6hdr do IPFIREWALL, mas nenhum podia desativar (nota:
FreeBSD pode agora, após o Security Advisory ter sido divulgado), e ainda, IPF não podia filtrar e o
PF do OpenBSD foi considerado “IPv6-ignorant”. Sobre o PF ainda, Ebalard mencionou “Feliz
quem usa PF no FreeBSD, pois Max Laier adicionou algum suporte eficiente a IPv6 no PF. Que
não existe no PF do OpenBSD. Ainda assim PF não é capaz de filtrar RH0, no FreeBSD. Menos
ainda no OpenBSD.”
Conclusão.
A primeira conclusão que tenho, é que finalmente, uma conferência CanSecWest valeu a pena ser
presenciada.. Obviamente, não por presenciar alguém invadindo um Mac OS X através do Safari
para ganhar muitos mil dólares. A acareação entre engenheiros e desenvolvedores IPv6 foi
memorável.
Apesar do IETF reconhecer e agradecer a importância dos testes apresentados por Biondi, em
ambiente FreeBSD, que originou o SA do Projeto FreeBSD,e dessa ser a primeira vez que vemos a
engenharia da IETF disposta a resolver um problema de design muito rápido, o que só enfatiza a
seriedade do problema, não há ainda uma conclusão se IPv6 RH0 deve ser apenas desativado ou
plenamente aposentado.
Contando com o fato de túneis 4to6 existir em praticamente toda rede IPv6 e alguns ponto de
estrutura de rede rotearem tanto IPv4 quanto IPv6, esse é um problema que, se de fato explorado,
pode acabar com a rede IPv6 e levar IPv4 indiretamente 'a mesma indisponibilidade.
Bob Beck do projeto OpenBSD, esteve presente, e não achou graça no comentário de Ebalard
quando esse disse que “Mais código e menos cerveja não faria mal ao PF”, se referindo a alguns
CDs do OpenBSD, autografados por Theo De Raadt, que estavam sendo vendidos a 50 dólares no
evento.
Sobre mim
Fyodor, autor do NMAP, eu e Deraison, autor do Nessus. Fotos tirada pelo Nico, co-worker na Sécurité.
Sou Diogo B. Avellie, formado em 2003 pela FATEC São Paulo e desde 2004 trabalho com
Segurança da Informação em Boston, MA. Escrevi esse mesmo resumo para o CISSN do CNRCCG do Canadá, onde faço especialização em Segurança da Informação – http://iit-iti.nrc-cnrc.gc.ca/.
Traduzi o trecho mais relevante do artigo, de francês para o português a pedido de Patrick
Tracanelli, para ser divulgado no site da FreeBSD Brasil. Conheci Tracanelli em um evento sobre
OpenBSD na FATEC São Paulo, e desde então mantemos contato. Essa é minha primeira
contribuição para a comunidade BSD brasileira.
As fotos aqui reproduzidas são de crédito à Nico, da companhia Francesa Sécurité, onde trabalho, na filial de Boston e não devem
ser reproduzidas sem autorização da companhia.
Download

IPv6 Routing Header 0